SQL注入。有攻有防。知道进攻。才懂得防守.
& {2 F }# s( r4 s" e$ o3 O! R
; {6 l7 F, ]% I4 S. i3 t k0 v, A有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
2 ?2 s! }9 ~6 u+ p; M+ Y, z
% b' f; j$ I9 {) y, w唱出会删除或者净化一些字符,或者阻止常用的sql关键词。7 {- |; |4 P0 O, X& H
$ q- ?. @1 W1 |0 `$ P" [我们通常有以下几种技巧,去避开这些过滤。
9 y5 l/ j5 g& [' m( X
% q: k6 j9 X/ T8 C. N1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
7 l3 \) g c. |" }/ i
- B- h: P" Y3 @; z0 gA,如果注入一个数字数据字段,就不需要使用单引号。
1 x/ _$ x6 H+ u/ y& l% R# O* @9 o* _; ~; V/ V1 |' v+ x# Y* t* t6 E: o
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。' J' P# B1 V+ M
9 b! a' {; q: R; K& V& n6 Z. u
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a$ N+ j5 E$ O/ I5 X' l- p% k
) W+ E# q! d0 c& Z7 i
目的其实很简单,就是把后面的单引号给闭合掉。$ z7 q6 }+ V7 H7 g9 X. n/ x3 R4 \# x* @
: _' r+ _* n8 ^0 UC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。/ B; g* X+ d l- N
& H; Z* V3 ^5 z3 \: e只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
+ o9 c3 H5 H: T; ^( A
/ A( Q& B, x$ A, [) s2,避免使用简单确认6 \: @$ T, R, K! B# a
: G8 o- `" P% g- A# A
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
7 E8 Q$ y4 D+ a3 c& R9 q% G* [/ O& n+ a' t" B9 ^7 J
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
0 M6 j1 O: n9 B6 }9 N$ j$ ^ X. Z4 N
A,如果select关键词被阻止或删除7 R4 Z5 j9 I* u+ X% e* u
" X, j0 e/ X& @5 x; R6 L
我们可以输入:
" ~- A! t" L5 m( t3 d$ G, a0 I, A' p+ m. g1 `3 [% R" x* f/ [
SeLeCt 注意大小写
8 |5 t. V" v' G8 }( d
" Z* j0 i; b3 b u+ L/ yselselectect 还记得ewebeditor是怎么过滤asp的么?
. C6 k9 E4 b0 |9 V9 ?3 m
2 w6 |) G8 S) V8 k* ^5 {%53%45%4c%45%43%54 URL编码
9 ~8 n/ [' ^; l% a+ s$ I! u9 z& O0 k
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25* R+ G& g1 n0 r X
; d, s5 Y# @9 `+ h0 o) p) Y$ \
3,使用SQL注释符
8 Q5 W9 V; Y/ w7 ^$ {( X0 l% ~8 u: N
A,使用注释来冒充注入的数据中的空格。
2 i3 e2 Y# g6 d5 f& F1 }6 v) v7 h+ G. l6 w8 a9 Z$ P
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
! J- b' A% {6 ^+ n9 L( M* x. t9 `' d0 B: ~8 O7 \; y9 r
/*yesu*/来冒充空格9 ?# w2 T9 ^2 b, l0 z
8 ^0 ?- P' K% x1 w7 N; YB,使用注释来避开某些注入的确认过滤。
n( W6 I, f3 D9 h5 L: O/ M7 ^2 `% G I! K
SEL/*yesu*/ECT username,password fr/*yesu*/om admin1 q3 I( i8 a" ^1 g7 _) ^
. o/ W% H/ s8 V: P% z1 l
4,处理被阻止的字符串3 h* p( [5 l7 X+ A! _3 ~. ?' ~& S
3 P k8 n4 H! M比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
* n/ k' s/ C1 j8 b1 U0 w: v" r4 W9 X
我们可以这样0 O N+ r$ l+ `: p; ~) e
+ \0 p5 W1 g) u* n s
A,oracle数据库: ‘adm’||’in’
, s) u8 o4 f- z4 L6 B! |, R
8 A% v" A* e# `* b, ?. z1 @B,MSSQL数据库: ‘adm’+’in’
& b; B& q& G" g( K3 U. L% d6 q: E& R9 K6 N$ t+ `
C,MYSQL数据库: concat (‘adm’,’in’). O2 C" J1 D; Q/ F" J4 A; n
) Z4 S N! i( T* g0 u8 `
D,oracle中如果单引号被阻止了,还可以用chr函数# e! k- o9 N" ~. k
0 o6 `2 G* c; R7 Zsleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)! Y2 R* d# o2 p3 ?3 H
\ [7 i _1 Q% {6 X- g
还有其他方法。正在收集中.1 a5 O! @; y% `7 Z \
6 |& u- S9 T$ _; n$ w8 n |