SQL注入。有攻有防。知道进攻。才懂得防守.8 p3 b! c9 h' ~9 o. n& M
0 S% c- e F* A( {9 |
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
6 i U. m! {3 L
, k$ ~+ _' I: L唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
* _, L+ Z4 ` p: o5 O$ z% x$ _7 `+ C* y+ _" d/ B$ J8 E& a3 A$ L
我们通常有以下几种技巧,去避开这些过滤。
/ l; g) w$ C: ~$ G7 n/ i& ^& q+ w+ Z# @2 y9 \4 }) e
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。, {! M m6 Q* D7 W7 m& c2 y
; n0 v2 Y& s1 q( P6 E4 b, \
A,如果注入一个数字数据字段,就不需要使用单引号。
: W6 f7 G. u3 ?5 a9 h/ } W* X7 f# b% U( u2 ~: ?
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。& U; x& P6 y$ Y4 O/ X( B* ~
1 B5 \$ Y. k3 O7 d/ I9 M
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a9 Y: L7 Z& M! `: y+ F1 q
1 ?- c! z. U0 f9 z$ r% Y2 F$ A目的其实很简单,就是把后面的单引号给闭合掉。
1 d {6 V! o) G% t- o1 ~
4 X: I7 @2 s& Z& S0 E& A8 ~& DC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。& ~* a* E; V, e. H6 X- R
7 t; v+ a3 Z' p$ F* ?( u. C, a
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
" d+ h: \1 O! K; f9 q0 @0 f" j4 L( h; E! N) ?, N9 w0 H
2,避免使用简单确认
5 M! O' K3 z# r) `/ R+ C8 W. Y
2 t2 X" R: _5 ?1 n' V一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。! O9 \( Y- |! U3 f
* p' y2 x" D6 k; ~# ?这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
8 y; D8 ?2 J+ u k7 S# q, @/ R' ?) { P3 E4 N$ H& p: S9 x
A,如果select关键词被阻止或删除
) F" A3 @# a Z, T# ?% Q
|7 m" d( i- n' ~) d5 y) @我们可以输入:+ j o- t+ B+ U7 I: o
+ K7 t' Z! U* |+ N2 n- \6 zSeLeCt 注意大小写
- j, C2 R: X3 U3 e! E# [& t# B6 K* p0 F$ z3 U# G0 D% j: d- L
selselectect 还记得ewebeditor是怎么过滤asp的么?6 @4 n/ M# U4 @2 z2 u/ |% O. Y: h
L! M. m! G2 {# _2 M8 ?+ }
%53%45%4c%45%43%54 URL编码/ c+ t: i' i0 a* h3 i; U! o0 |* s
9 w \0 Z, j6 ?
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25! @0 A, L- a3 L, k' k
& v4 L6 G" c* Y: O3,使用SQL注释符7 l. ~1 E( x3 k" r( ~0 K
8 {% u1 ~4 q6 A8 W( G' s. {, N( R+ UA,使用注释来冒充注入的数据中的空格。
" `" F! T( L3 F$ I" C
8 U S0 O+ O, J9 l3 ^select/*yesu*/username,password/*yesu*/from/*yesu*/admin( r$ u5 l6 D9 P- g1 x7 A, V
5 y: L. g6 F, ^& g4 l9 A/*yesu*/来冒充空格. v; V4 U2 l3 G# d: a
" \, ^) t. b5 T/ L0 k$ m8 NB,使用注释来避开某些注入的确认过滤。0 @5 {$ M; y0 ^" k
4 n$ z% p3 p1 _, @5 }2 i" Q
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
6 K# S! R" I* Y; [1 Q, F- a: q b; N6 G4 b9 t5 |/ G: q
4,处理被阻止的字符串8 [2 d. J4 _: G7 @6 `" N4 v
8 e1 m3 T& x8 P比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。( t+ ?3 T' y, ~6 V/ _& S9 e
]# l7 r" C8 a; p8 |
我们可以这样! H' D6 ]1 W, a1 Q% k
3 S4 }6 x; a, Y/ h6 _! r( S- G
A,oracle数据库: ‘adm’||’in’
$ N0 Y! m: c c5 n1 r' b( I* @6 x4 Y, I! V$ B* {; U
B,MSSQL数据库: ‘adm’+’in’
& u3 O1 N/ X u4 h& m6 v7 [! T9 I" W3 }( {
C,MYSQL数据库: concat (‘adm’,’in’)
0 C8 ^* Q% O+ S) O4 Q( v8 v* c- u; S! s8 {8 H
D,oracle中如果单引号被阻止了,还可以用chr函数
7 v3 ]! j) E% T% ~% C" z, ]. M& q
7 f6 m" f6 p) g7 Isleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
/ P( @5 u7 ]" d; Y( C
) n2 ^$ F: ^) H6 A; ]- i$ ` _还有其他方法。正在收集中.
: D, z! f. _! v/ h7 d- E! K( S/ B7 c
|