SQL注入。有攻有防。知道进攻。才懂得防守.
" F. ]6 F8 C: G9 S# \ u% c8 ^; g- l/ C- A
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。! Z3 u4 G! r6 Z: H: ]: o
, v8 _" J/ p0 g% r, E
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。) N% q2 j2 K4 b: V0 `4 ^
: s0 Q; o6 u- q
我们通常有以下几种技巧,去避开这些过滤。
8 T+ ~: d3 s: e' @& C9 N& @9 y
# l( p4 ?9 I5 O* k: S/ t1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。" M* A. b' g, z9 A& _
1 f; p( y% C' d$ X+ a+ `
A,如果注入一个数字数据字段,就不需要使用单引号。
6 H* h9 l/ A* M% D" C
1 W. @$ z1 X8 b* DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。( M0 v* J: R [1 h7 g' a; @- I: y: R
" k0 B2 j. B) y: k比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
, K L" m6 l& v* C/ x* u5 i# \9 \& m. C
目的其实很简单,就是把后面的单引号给闭合掉。
1 r3 Z. v$ _+ b7 _) f: D4 z& ~: M8 Q5 K1 u4 w3 b7 X8 e i
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
1 L' X( _0 i: \ l4 H/ q w; f
. o! }: D& I" a- |只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
' L4 Y$ {: j6 h4 _; h. o
; S2 l' N9 C+ r2,避免使用简单确认, f% m3 {; f. p: Z' S
7 J# W1 W6 M: j
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
% V0 I4 F6 X- H9 d' T5 S1 _: M4 j6 Q4 j- z+ p" K+ j
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
$ I6 i& Z% T' Z7 ~% c$ z
* w; B( l) o2 ~# }! P' f5 EA,如果select关键词被阻止或删除1 k# w# L$ _" L \; N
9 b+ ^9 E0 {8 Z& Q$ b O我们可以输入:
t& y5 S" n/ y, Q- |4 X/ d. \* x9 T( n: u# t8 M4 ?
SeLeCt 注意大小写
4 M9 s; Z3 x) Z) |: ^
* \6 W4 }: J' L+ R0 k8 {2 I; t) [selselectect 还记得ewebeditor是怎么过滤asp的么?' k5 k% @+ L7 ~
9 D. x$ p- R$ V6 V+ a# N, U& T
%53%45%4c%45%43%54 URL编码
0 i' B. F: }' D$ v7 w- ^$ l* M. h- p1 U& N# h4 ?8 y$ r9 { y U+ m
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
# n0 j5 n# ^5 l6 B! M
; T3 S8 h7 Z3 Q, r7 z3,使用SQL注释符3 n" T/ u9 R: x6 \+ {/ A7 B* z; T# F
T0 ^' L/ n0 ^: ~; v* T' E1 ^$ t3 l
A,使用注释来冒充注入的数据中的空格。7 s8 D; E* r9 }7 d7 C
3 x0 c9 R% _) ]1 z7 e, b, {" A* Oselect/*yesu*/username,password/*yesu*/from/*yesu*/admin
+ X7 K b6 d7 Q" @
) s8 I( c( g$ ~$ c: ^7 O( L/*yesu*/来冒充空格1 h' ^6 K& X; ~9 A2 z
. w+ J! X! S) x4 F$ U
B,使用注释来避开某些注入的确认过滤。2 H% y! G: Z; g7 g! v
' x: v; d! H6 y9 W! `( O+ n2 @
SEL/*yesu*/ECT username,password fr/*yesu*/om admin v, }0 e+ D& S7 W- q6 h! e
3 E; C) x7 l# U4,处理被阻止的字符串
! f: X+ l. g* f X0 B. |
1 t- H% ^7 Q3 L( s: C9 ?& x5 |. N比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
& j$ X& b; c# x8 v
. t) {. h" ]1 z我们可以这样
: l9 h7 |. S. f) r: b
- S" P& W" i8 |7 Z4 F; O6 ` NA,oracle数据库: ‘adm’||’in’6 U7 ]4 \1 k- w/ R4 R/ J9 M) V
) R8 M- W/ z7 T% H- H
B,MSSQL数据库: ‘adm’+’in’3 U8 g5 B. M% j8 k& U n* _6 B6 A8 g
1 W2 `" w9 b* P/ rC,MYSQL数据库: concat (‘adm’,’in’)
) H6 B1 c2 f0 D! L5 a* l ]+ ~+ y% N( u" X1 Y& F- N. e i, B- Z
D,oracle中如果单引号被阻止了,还可以用chr函数
3 m, P! I' G' H& V. k
U& _% k" Q2 f5 Q- Z4 ]! lsleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
/ D! T/ C, {4 M$ O! S4 P
/ p; p6 h; k5 g7 w还有其他方法。正在收集中.
4 A4 U' Q9 D+ T2 Y. ?( {9 o/ ? p7 H0 V/ Q, \0 Y0 ^
|