SQL注入。有攻有防。知道进攻。才懂得防守.$ _- A1 [ R9 T
4 N& ~9 U. i: _0 P有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
9 j9 E, J# D) U! J4 z0 }
4 m+ ^" ~! d, A" H. U唱出会删除或者净化一些字符,或者阻止常用的sql关键词。$ s" x6 J& r2 Q) Y2 M
7 g+ i* ^+ d& t+ \
我们通常有以下几种技巧,去避开这些过滤。
# T' g3 ]( o& o+ Y# s7 L B( S: e$ O9 F# @% }" y/ @% P9 L* E
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
/ V7 O* J' n# E$ N; }7 e2 a5 _- X2 c% ^. l
A,如果注入一个数字数据字段,就不需要使用单引号。
" l/ l9 \: \& q# U
8 O+ v8 K; E! P5 a: c6 G# K: DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。! M8 r8 b, \5 ^! p
C' c. w6 Z$ _ ?. d% ?7 ^# z
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
9 s. A" l5 z3 d5 \+ X0 M/ J. h
9 k; B! U: q0 x4 U) ^3 U4 ]' j' O目的其实很简单,就是把后面的单引号给闭合掉。! I' C, M+ T. p2 v+ p
) {( Q- ]. F$ b8 [2 aC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
6 V1 {3 C+ |3 w q% D; [1 t! T- r6 l
0 y5 I4 {% C/ R( j9 E! Q$ q只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
' p- V4 T) |( ^/ f w
& _* w' A$ G, r' @/ t2,避免使用简单确认5 I% {3 T+ z" Q+ D- y
% o9 s- h2 s2 ~4 E
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
: v/ `( D, Z: A: j5 X9 n
2 J0 V9 }! ]* m9 }; _4 c0 a这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
1 X: D4 P2 z0 @6 n0 ?, |
& }5 s, n0 L* x) W9 j* kA,如果select关键词被阻止或删除
{. o }: h0 l* f, L# ?& S% [8 T# L5 Y9 \7 p' q5 \9 x
我们可以输入:5 u$ P! Z n& X# {
# a! h; o- b' W" X [SeLeCt 注意大小写
; g$ A9 a9 _, V7 Y( o: u% `
0 Z% ], A: ^/ Q: _2 {selselectect 还记得ewebeditor是怎么过滤asp的么?
{6 |/ C9 ^6 p2 X9 D s$ Y. s, H9 ?$ C9 C
%53%45%4c%45%43%54 URL编码
1 |/ d4 \7 C {- [' M7 r
9 i! ^" }% x& T4 v% g5 ~ R8 p%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
2 k8 g5 w& O8 q( ^! d8 B( n
! B% o+ G& q4 h3,使用SQL注释符; M' V" P( y! y9 E9 T6 {" _- o4 s/ n
; x6 r7 U# ?8 s; r. `' [
A,使用注释来冒充注入的数据中的空格。
. C- o5 `9 w5 u/ k1 z7 g6 w+ P( B9 G2 Z* `, t6 V4 }
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
, G2 z6 t1 H: x% E9 Z E
% I' g |$ D: E3 J2 I6 t% F4 d/*yesu*/来冒充空格
+ f& U0 _3 I" R s3 W# P! f9 r, g% x0 M4 r+ s! A* r& x$ \7 y
B,使用注释来避开某些注入的确认过滤。
. I. W5 e# Q) p J& f3 [) A8 u( I
: j6 @' `7 t5 c" Y! e' y# XSEL/*yesu*/ECT username,password fr/*yesu*/om admin0 y v. Q+ [3 D
* i# F5 s. G n a' {7 `4,处理被阻止的字符串
m( e8 k% n4 B# t' @" u$ u5 e# t( u; C# a, s1 F
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。6 `" z. c, ]0 L) |0 ?
# o+ S1 n: a, k% v; T8 [
我们可以这样
* y8 [$ ~3 l0 q
- ^( A) @$ A+ ~+ o7 k& FA,oracle数据库: ‘adm’||’in’2 }9 P& u; h0 Z6 j7 S; q( Y
* V t) a1 G! p0 B
B,MSSQL数据库: ‘adm’+’in’
0 m3 T4 e3 W! g; R2 N. k# M8 _( j6 }3 v3 \' f
C,MYSQL数据库: concat (‘adm’,’in’)
4 C w1 j& @" y) s
1 i" V" t! y# y/ Q' Z# UD,oracle中如果单引号被阻止了,还可以用chr函数9 d" O: T+ [1 X4 n5 \$ r7 K# {! h
4 |+ v: o4 \8 b! f S
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)& ]+ z, `% Q a; A4 s
$ p' O4 X( M0 [- w" v还有其他方法。正在收集中. `0 X J1 g( v& E! |/ m0 a4 I) T
# c( A7 l$ U; V. j |