SQL注入。有攻有防。知道进攻。才懂得防守.
. g2 P1 z- P# P: K, I1 N
& V! H- |: S! j/ ~6 P# N! a0 w/ c有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。6 a Z9 v, n/ g/ e9 e
' `, j; W6 ^& s* N. \7 e8 g唱出会删除或者净化一些字符,或者阻止常用的sql关键词。0 }5 |7 y9 F! F2 ^# V8 n/ C
4 x: a9 v1 j1 P3 X# f% Q( r我们通常有以下几种技巧,去避开这些过滤。
/ a1 E b0 o( ^" @% X4 |' L9 l9 Y1 c) i/ w$ g/ u
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
6 H6 F4 v7 h' e `1 o; k) }& \+ P6 N
A,如果注入一个数字数据字段,就不需要使用单引号。% G6 R, b) D6 R( c, D
& n$ Q3 [/ x) V5 B# K1 K
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。: F3 n3 Y" D6 b* @# K2 c9 a1 Y) [, q
8 R9 |# F( }9 Q; s比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a+ x+ M2 w5 \$ A' @0 b
/ A! i$ E5 N# X$ {9 O0 {
目的其实很简单,就是把后面的单引号给闭合掉。/ m7 s$ a6 W: a& T; g$ s2 ]
4 ] M9 o; c% i& L. ^C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
- x0 |# _+ h3 B! x! I
- m- F7 j9 m: `$ |7 r/ T: X只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
0 { a* [$ g8 e3 S* u8 x4 G) U( s6 B
2,避免使用简单确认
; g- w! G- M2 _0 P! E, C$ b/ a
: b9 Y+ [5 D; |) [6 f一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
+ ?, G; b# X+ I' `# }3 Q, S+ n- s9 l
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。8 i0 |! I& z F
# Z! c: {) n& S2 {7 iA,如果select关键词被阻止或删除0 ~. C2 j: `/ L
" q1 s9 s/ m$ p% p5 Y( ^$ C9 `我们可以输入:
% I- y+ N# f8 @; k2 q
5 ?9 @; M: w( M7 tSeLeCt 注意大小写
b# ]% F# p. s6 i M% u
@; P2 z2 \0 V' Vselselectect 还记得ewebeditor是怎么过滤asp的么?
1 |* R( k& S9 t- E
@6 c, s- i8 X) |; _2 B) n%53%45%4c%45%43%54 URL编码$ o; W6 r9 d. l- \! e, H
0 ? e: Z* o: u2 o4 V
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个250 Z% B9 H, b- n
! k d5 C3 U( s- O$ S" C3,使用SQL注释符8 D, h0 R3 I7 D& }4 V
$ s$ k9 \5 H% b7 uA,使用注释来冒充注入的数据中的空格。
3 J0 `! }" s/ C9 @( `' f, E/ h* v( x) s" \7 c
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
7 F. U! ~# e2 m% P- A
% `6 D+ M' g$ }* P# K/*yesu*/来冒充空格4 g/ M6 A$ ~9 f( |5 c z* E
% C$ l& C2 [* G! d' M2 s8 Q
B,使用注释来避开某些注入的确认过滤。7 |) W6 _/ ?+ o* Q
' R9 P3 x$ L' }6 H$ BSEL/*yesu*/ECT username,password fr/*yesu*/om admin
3 w* S3 ]- g( Y4 h4 {! F+ Z
2 z# s7 j0 v. W: {8 a! z1 B. ~& `! _4,处理被阻止的字符串
5 j2 h- L, g* q' d) j. |/ L" S
! \' i) s7 O6 u比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。$ w: \4 B9 n/ X2 D3 u
8 X. _% I' v$ u0 T
我们可以这样, S% H$ {7 L: `& P- v
5 A4 Z' R+ k8 q4 ^2 i- |
A,oracle数据库: ‘adm’||’in’
7 g3 T/ D( c& ~( t- X5 ^& t1 z# M! ~
B,MSSQL数据库: ‘adm’+’in’- D1 u' |: c) j3 Y! r) l( L
4 d5 m( W! B" e. [% W. J' FC,MYSQL数据库: concat (‘adm’,’in’)
. z' K. U& U* C; N! k
5 e) u3 C7 }& O- o2 t% p2 o, a' bD,oracle中如果单引号被阻止了,还可以用chr函数2 S" ]5 h2 L* D: W% C
$ G: |$ L; @5 d" O" h2 ?
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
' r! s0 R6 S- z; e! j- f& N" H7 ?* P7 e V7 O* \, X
还有其他方法。正在收集中.% d# i, B6 C" i- U9 u9 z; F
* Z# D; a( g; r- M8 P* S4 e0 |) I |