SQL注入。有攻有防。知道进攻。才懂得防守.
$ z2 ^3 E* c- {. h" l" ]# }+ k
7 ?( e$ }; Q7 l- a7 t0 {有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
f$ u8 Z3 i- }1 }+ V p8 w8 \6 z" K8 d# V( Z* ^' v$ k% |
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。) W5 {. B- u7 S" M: C. H6 S ~
1 `2 C( Z! [& d5 P3 u) r我们通常有以下几种技巧,去避开这些过滤。" L6 c) I6 t, V9 E, |$ Q
- D: X5 q2 ?: `1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。. L2 E( b4 y. x3 l4 U
# h, l. t+ U/ @( ]A,如果注入一个数字数据字段,就不需要使用单引号。
" P. P% g8 U- \# c
i* C+ q9 |2 H9 h2 T6 }9 z" cB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。7 q" R' C) S6 G4 W6 O" P
$ A+ P' g$ j3 E比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
* r7 k( T; i7 r( Q, t1 K- p! _. Y' ?& [
目的其实很简单,就是把后面的单引号给闭合掉。
: ?" j V K9 u6 E" _+ s7 w; x0 u9 b
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。! g# \- X' d8 f, {5 j! T
; T8 f- h' z& I- E& q' p只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。2 F) b" d- e7 e" U
# J; L q% ^: t
2,避免使用简单确认1 ]8 w4 E' S( Y" L8 A
% v G3 v6 ~& x' p6 S% x
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。! {1 n7 Q0 v4 f6 Y
& Q1 H' [9 n' i% d% @
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。" i7 J5 n1 B+ i; B+ f! ?
. z4 _. f4 H3 l8 n5 j3 m9 e
A,如果select关键词被阻止或删除/ J- w+ o$ x, v5 @( c" t8 Q
9 I; P2 t5 T) d0 g, D# ?
我们可以输入:
* ]! X% F& z' g4 A& a `* e) ?# V5 H- Y( t9 U5 U6 U3 Z
SeLeCt 注意大小写
' Y! ~# {, c4 o8 x
' y" x) v, a0 u- i' `. l% Aselselectect 还记得ewebeditor是怎么过滤asp的么?
4 R5 E$ y5 f: l; ~
' H+ h _+ C6 k3 U0 g6 q4 t$ m%53%45%4c%45%43%54 URL编码
# l8 z' a5 p1 q& m: v4 H$ B5 `# w( L! p S$ t5 ^
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
9 A5 W6 U+ @( Y2 M9 |
V) m2 v/ Y$ D3 ]3,使用SQL注释符$ e& A. \) v( \8 x9 r" }% Q
) J- B* I% `! B7 c a
A,使用注释来冒充注入的数据中的空格。
3 E( h/ u" C: t, H) `
: p6 H' W# V; j; Z/ hselect/*yesu*/username,password/*yesu*/from/*yesu*/admin
9 Z0 |" M0 A! O0 O* P
6 @9 [6 k% @% f T6 R/*yesu*/来冒充空格; ^# C$ u5 |! W" e! j' c
% H# |( K9 N& VB,使用注释来避开某些注入的确认过滤。; R" j6 T3 ~0 M7 R% R
. ]3 a( g" M' s5 U. w1 G O: x
SEL/*yesu*/ECT username,password fr/*yesu*/om admin" T z8 M. F6 a. j. n
% y, c0 K" @; O$ u' L
4,处理被阻止的字符串6 k/ x3 ~! I E3 E$ i
! @- H* I; e4 p6 }
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。 |+ s% S% X1 `& k1 \; N
]& z/ d9 Y Z- {7 L
我们可以这样
2 N- L1 M* y, z. V h1 V
1 g8 o" |8 @# JA,oracle数据库: ‘adm’||’in’
) H" O; G' _" c6 _
+ ~2 \& m0 E G( l% P$ @* q3 U6 k6 oB,MSSQL数据库: ‘adm’+’in’4 A# _' _5 m1 J$ Z) j
! \; ^# E' n& c& l [) \4 M
C,MYSQL数据库: concat (‘adm’,’in’)
3 \3 S2 e' d U1 S2 h; S+ n- ]! G5 r: D
D,oracle中如果单引号被阻止了,还可以用chr函数
( s. B) |! p6 D$ h7 ?4 B
) P: Y6 [2 x0 G# e. n% J Wsleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110), `, t) y$ Y' V, e, ?
' p3 T$ p! F& B; G8 \
还有其他方法。正在收集中.
' z" u, \9 b9 O: _! _5 ` O& l0 D" E( y/ t: H6 u8 j1 a }
|