SQL注入。有攻有防。知道进攻。才懂得防守./ G" g* p7 n! {3 {9 m" G, Q; b# n
: B& D3 {# ~1 ^0 I9 C7 A* S有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
2 W: C; x' \, @3 y+ `9 P! S3 F, c- X' S& N* G
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。3 z2 Q+ j+ D1 S6 w7 d+ X* T
4 {: W( M% P" A7 J- |
我们通常有以下几种技巧,去避开这些过滤。6 M, s) J' L( G z
5 B* X. T) j% \" J) x& F, |1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。9 h# v' M! I5 \0 C, }% |9 V3 u& Y
2 d! R; r6 D! C6 tA,如果注入一个数字数据字段,就不需要使用单引号。# F& x3 ~/ a' e9 v! k
) T& b3 a3 d7 z$ i
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。( \' I% t: @6 j$ z- b
& k. n+ Z3 Z% d# g! y比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a, |/ a& p8 j, a4 C& M. s
% g; f9 v z/ Q$ q- K
目的其实很简单,就是把后面的单引号给闭合掉。. A4 h3 b% U6 t* ~, e. C ]$ N6 ?
6 K+ V- D/ P' x0 U7 i$ \C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
& {. M( n" y; ]& G& @* C+ o: C
- t" _4 b- ~# `0 `3 n+ y只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。. y) g8 y V; `6 B# U9 B' n
) ] S4 `4 T( g2,避免使用简单确认
4 M" N8 V# _( `' r: @( S) z2 s9 z: K' z: [7 Y: h
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。3 U4 o" f: x; f& K
; \7 _/ U! x; e
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。0 j( Z) b, D8 R" U9 Z9 v& Q
" N5 p1 g D- [A,如果select关键词被阻止或删除
. [% \/ r: \4 x4 k c
- G; ^' {$ o/ t( I我们可以输入:9 M' ~3 l9 b3 e3 t0 n) ^2 u V. w) T
$ h, Q, H/ k" @) z g& t
SeLeCt 注意大小写
% r _1 P2 }& o" y& x
) {' Z( I6 U/ Y$ h& pselselectect 还记得ewebeditor是怎么过滤asp的么?
, C8 O: _, q: ]5 r* f5 c- z1 V( \1 p% K' [4 ^! K3 F* L
%53%45%4c%45%43%54 URL编码& e% X7 \$ u; ~9 Z8 W1 D
5 h' N$ d2 U3 x& E0 {! d1 ?" o g%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
+ Q( K7 q1 v% K/ K" v5 H* s
0 t; d5 C8 e1 O% H/ h9 @3,使用SQL注释符1 A9 m8 O3 M' |( P2 o
* c: e! E/ j j, U$ r3 ^* y
A,使用注释来冒充注入的数据中的空格。( I4 D6 |7 G1 V# f- u- p
- L# I/ x$ Q7 Dselect/*yesu*/username,password/*yesu*/from/*yesu*/admin
3 Z' C# {, V. ~' z! c0 Q- k1 b6 }* G, x! P- [' i
/*yesu*/来冒充空格0 M, T/ k& ?2 f7 ]
; L% a s- q: i$ `7 X
B,使用注释来避开某些注入的确认过滤。; a% P1 i6 N, Q0 p& E
* @: { ]9 H' u+ \( }: j7 b- E% l
SEL/*yesu*/ECT username,password fr/*yesu*/om admin+ s/ J2 ?- w& {" X
' D \- P) y8 |4,处理被阻止的字符串
0 D5 e* a5 Q' o* ^, C
: E' g( I5 T* r* k* R5 \比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
0 Q/ u1 A" Z! O0 _; O9 k
% Q- ^; E5 y# G我们可以这样+ B) [- G* s# q7 D
. D- P" p9 a) L& eA,oracle数据库: ‘adm’||’in’
5 C c& A8 M. N, |, Q
& X6 ~2 i w4 q, qB,MSSQL数据库: ‘adm’+’in’
: O& ?, J4 C! v& O, p: d3 I' B6 L3 M+ a8 G. R' P0 T2 _/ |7 ?
C,MYSQL数据库: concat (‘adm’,’in’)
" ^/ r! [6 [; q) @, Y/ K
3 | }5 ^' o6 p6 WD,oracle中如果单引号被阻止了,还可以用chr函数
! U5 C* k; R2 v
- R7 B+ C6 q& ~+ \2 @/ j( g( isleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
! D6 e5 a$ [! v9 q- K+ N7 a5 G) k2 V' V# F. a `* O
还有其他方法。正在收集中.
. j1 a5 @ X1 C5 X$ g6 p( @1 ]
|