SQL注入。有攻有防。知道进攻。才懂得防守.
8 w7 u8 T+ t: O! [$ A" ]) f) \8 w
) U `, T4 E( O8 E1 q0 F/ {有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。* @: \1 ]4 V0 P8 t& L3 p
9 M1 J9 @" c: C! m5 S0 ]7 k& Y唱出会删除或者净化一些字符,或者阻止常用的sql关键词。: `7 x( z3 I6 Y8 I0 r
/ ]5 k* J0 z5 I% g
我们通常有以下几种技巧,去避开这些过滤。" q& Z. z7 m! f5 A3 {4 F' E
6 G7 e3 R! N% ^1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。- f- P8 d0 ]6 ?# \! D$ W! v
+ P- U" _" c; Z! U vA,如果注入一个数字数据字段,就不需要使用单引号。
! K3 @/ H) ~- H* D- y6 D9 d, F' U3 Y" Z6 A" U! U
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
* n0 ~7 F5 i- f( N- n) F8 v6 ]/ r2 O6 G! |9 g) G9 J' h
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
) G! Q; \2 V* v# l% u J. ^4 E( V, {
目的其实很简单,就是把后面的单引号给闭合掉。
- s' W# r, c7 T
( r: u C+ P0 o& ~C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
- Y# P: M! s! Y ~# T* y a9 j' f9 {9 e2 s# B3 j0 o
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
% z ~& A4 `) u' h1 ]4 R" L5 m" `% X
2,避免使用简单确认
7 f* y) b/ h z) E( J$ x% w0 R f5 S
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。. }2 }2 B; W0 D( b: p o
c! ?' z. l/ t+ y/ t- }这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。9 N Y' N: n- k2 r4 l* \ [
8 J: ~. F2 C, i$ Z# L2 c5 q) lA,如果select关键词被阻止或删除+ y! I5 ?) z7 K" ^: D, D. U+ u: f4 a
$ g$ d' ]/ s, M q2 e我们可以输入:8 a- w, a7 L3 n$ h9 _- m6 ^
" Y, i) v0 l/ t6 lSeLeCt 注意大小写
6 z" G! B9 v' b, ^; v9 E4 H
% j- o! X# S+ X$ @selselectect 还记得ewebeditor是怎么过滤asp的么?0 O5 l% \/ p! ?6 k8 M
+ L- q# g8 w4 o3 l, _%53%45%4c%45%43%54 URL编码
% R: H# N) E2 p
! t7 e8 e' V9 x%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个253 c y5 i" w. T/ U
( Y9 M: \* T, x9 p% d0 j# L
3,使用SQL注释符
9 |: M/ t7 |; ~5 K! }" [0 @4 Z
# b5 D( A0 W" \( V; s5 @A,使用注释来冒充注入的数据中的空格。( U) h' U. j K- t, x
) u( C& f4 i1 D0 R, ~' L+ h
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
! y7 C4 c2 i8 d8 H5 _
5 T/ N5 u3 A$ w- g" x/*yesu*/来冒充空格
+ o1 y; l' ^) |7 @
0 f' p _8 @* ]B,使用注释来避开某些注入的确认过滤。
; K# J1 D3 D) g& T1 f; }
2 K0 J- Z; t+ w3 ISEL/*yesu*/ECT username,password fr/*yesu*/om admin
% k+ d4 @# V u1 p/ B; `5 ^& `/ P3 H5 k$ y. l; X8 {7 s
4,处理被阻止的字符串+ K+ }" B: b& q' t
" o* J( ^' x' H2 J* h2 c比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。0 l; k; y0 X3 `+ T+ p+ J
9 ?2 ^5 m# J$ _我们可以这样$ h, v- P& Y( L3 E
% p+ B" i! t7 n- k% X. k
A,oracle数据库: ‘adm’||’in’
8 Y! ?3 o' T; }/ D" ?
+ K6 E' J5 x" x" M( s- OB,MSSQL数据库: ‘adm’+’in’: u% c j/ H7 w7 A/ `, H
( c+ o* K- B4 X. [0 }) m, WC,MYSQL数据库: concat (‘adm’,’in’)2 A2 ^2 y* R+ C( l0 ?$ C
* ~9 O5 \, c: }' K
D,oracle中如果单引号被阻止了,还可以用chr函数% N, W5 i" p/ L/ r
^" ^4 h9 D8 P/ B) J& s, ysleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
5 N# Y7 D# X" `+ p; k1 b" s( K# e* J, V0 w' A' u( S
还有其他方法。正在收集中.% A8 q0 \; m0 ~
. S1 B2 K1 C7 e5 r3 e6 X
|