SQL注入。有攻有防。知道进攻。才懂得防守./ Y! w. q% k9 |0 h7 b6 G" D
" c3 b: H1 S. Y有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。+ e' h% y& x) R" k: U ^3 w
2 Y; M/ P0 b6 o& B唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
% D* S& E; j! _9 c, [* [" u) e% ]! ?' Q
我们通常有以下几种技巧,去避开这些过滤。
9 \6 r6 J$ k( O1 o" r) e, Q9 | h- v& W1 {6 E
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。+ H& T0 @5 n! ^4 m( N
U7 P1 k% d! t/ j C4 p, WA,如果注入一个数字数据字段,就不需要使用单引号。
, |+ W6 L3 [ W: P2 f
; ~9 w. I; C; K# {- X2 s+ _B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。 f; v \; y7 p( c: a
$ C( M- V, e+ [5 J
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a+ A! n' L7 O6 {6 [! e
& H$ j- D+ H: L B目的其实很简单,就是把后面的单引号给闭合掉。
6 w6 I2 l! X8 f& J# \. g, V4 ^6 Q" S1 L: o! F
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
8 m& L0 s$ G9 r, i) w% X, ]- O+ ^4 A: h7 G1 [( n. q
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。2 w) [& l: E/ [8 z/ a# Y! \
, N3 S/ i' D+ H9 Y2,避免使用简单确认
( c s' a7 x( C
/ x% c0 T/ ?" K! i& E9 G8 Y一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。6 O9 R, r4 D- W2 B* h& q; ~, M
/ i) A3 ~: _5 `1 u I) Y9 I% b" ]
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
6 t! i- F9 L+ e( s) i" Q# U% s, }* L( y
A,如果select关键词被阻止或删除
! h- e- l" H3 j
! L; _2 S5 b( i7 f, X& O* Z我们可以输入:9 }( u* |- A# B& S4 a# b
7 k: k* G4 F! z3 j# v0 Z) zSeLeCt 注意大小写9 H3 B' f: `: T
8 k% K8 \/ \! L: Aselselectect 还记得ewebeditor是怎么过滤asp的么?
! e, p: S9 R3 d2 ], b8 F! a) P, u# o% A- J4 N5 C: L. K: ^7 j- B6 I
%53%45%4c%45%43%54 URL编码3 G9 ^7 {* Q6 }1 A0 M9 {
- b/ `! M5 [: a. j8 [3 H, K%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
9 Y# {6 u- I# [* m6 m+ a
# k" P* @7 Y w( U6 c3,使用SQL注释符' `' H, D% z& Y- I+ F3 |
( Q8 u! `5 o) g/ D, _; Y
A,使用注释来冒充注入的数据中的空格。0 E7 I8 f9 z% C- Q. m- j
- E. u( v7 J$ Y3 m& o3 w$ xselect/*yesu*/username,password/*yesu*/from/*yesu*/admin& P7 E. M# y Y: m+ G) V+ O
/ w+ \/ M" V$ K+ \: k! l
/*yesu*/来冒充空格4 A2 T- j/ e4 v6 t; K
7 B6 J+ Y; k' I; h0 c0 d, O
B,使用注释来避开某些注入的确认过滤。
( m$ Z7 e* |0 Z( R+ k' B4 N7 X, s, {+ ?, S. W7 \' c( n) z
SEL/*yesu*/ECT username,password fr/*yesu*/om admin' a- g1 o2 I8 i# k1 K4 d. e3 u
8 c3 O, w, b! B% U' F
4,处理被阻止的字符串
. b, `& Q7 c% [4 h3 {3 B w- Q) J+ a8 r. _! i/ y
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。* b8 @ D5 d, G" D* |' r/ m! H# N
& K# d$ s1 Z) @9 M9 l% `* m3 B我们可以这样4 ?; E0 _, |5 a: T0 t
7 u9 B, w% f/ I# G( \6 G- r0 b! HA,oracle数据库: ‘adm’||’in’
# F4 `- U- M- a) h& C6 y$ Y+ Z8 ?2 w
* Q6 }4 _' L# J+ k1 YB,MSSQL数据库: ‘adm’+’in’2 s, K+ t' {1 V* o0 L" m2 p
7 h" F. Z1 H+ s7 c# V) }C,MYSQL数据库: concat (‘adm’,’in’)& Y: @: E9 E* o S9 [ F9 R
; {+ d }5 s8 k: T8 \' `& i# G
D,oracle中如果单引号被阻止了,还可以用chr函数
+ M3 |3 _# W0 A! E7 ^6 w: N5 i+ b7 Z6 |1 N5 t- G& [
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
- f, A8 H4 b( F: \1 |' c2 k% {3 g# T% g8 [ n0 t! q. s3 f' g
还有其他方法。正在收集中.
6 V ?8 ~5 ?5 _- P; k' k. ~3 v# |% T% Z8 c
|