SQL注入。有攻有防。知道进攻。才懂得防守.
9 `; s U4 |: o8 j7 t" E5 _6 v, x" R5 T' R, m X$ |
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
% U+ L: ?0 [; i3 o& a$ z/ Y
" H. N+ D7 M; g9 t C: {3 z r唱出会删除或者净化一些字符,或者阻止常用的sql关键词。# V$ K6 K4 y" a1 y4 h- C, ^$ k
, B d% X: h9 u/ x3 ~7 T
我们通常有以下几种技巧,去避开这些过滤。8 g. C' F7 T0 a8 R
: Z" K* H& f' C3 R1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
" ?4 o6 D; s0 @) i) z
- d- @8 _3 G+ t) U2 B/ gA,如果注入一个数字数据字段,就不需要使用单引号。
5 s; P! _8 W) g3 N! L6 p' }9 m6 I( f% }
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
8 t3 h( w; U, T' F' F3 X7 Q _2 X, B
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a8 w, d& v4 i9 T; {2 O3 a
# M% q5 B$ d' P
目的其实很简单,就是把后面的单引号给闭合掉。
4 o6 @4 h& |7 A2 j) J; D+ B/ @6 y! S
# Y7 S) e' w3 _2 KC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
4 B$ ~% M) y- k: U: N- ~" |3 k. a" {4 _1 V, I9 n
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。) N9 H/ G1 C5 N2 r
# b( m- f7 p' [0 |1 ~7 W! F
2,避免使用简单确认* L) ^: @, C/ q% x/ w- t& U
% B; a% H) u* Z一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
0 J- C* }$ R& z0 c1 N" S- j5 n, h" f0 v' t2 g* `' K
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
. B& q4 J2 ~5 Q3 a
& t. M, \ l+ k" t9 A5 jA,如果select关键词被阻止或删除
) J( m" E( s1 ~; O8 k, h7 Q; ?9 `* V! w5 ?5 t
我们可以输入:. u+ F; V3 n# ?3 @
4 W2 ~1 V$ Z+ B/ q* m& z2 Z& A
SeLeCt 注意大小写
% R. Z' O8 Y) a* Y+ @
- o6 l3 }; u% m4 M: o; {selselectect 还记得ewebeditor是怎么过滤asp的么?% f9 x& C/ ~* Y S( f' M" j4 p
' _, P( K* ~1 Y, B2 J+ p
%53%45%4c%45%43%54 URL编码% T* |( y9 S! G+ n9 h# T" [
5 q0 @+ h6 A% s' y% `' m$ \%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
. `. r$ \6 m4 e. a. v, }! ?. T" O' Z
3,使用SQL注释符
# @9 b' F. q; ]/ x% N# a2 w' \/ e' Z, |& x4 x2 ^
A,使用注释来冒充注入的数据中的空格。
5 \: A0 W& `+ w
1 ]) g L4 @2 _) {' |select/*yesu*/username,password/*yesu*/from/*yesu*/admin9 }& r1 |" F3 N( O- d
+ P& b; @3 b7 n* u5 g5 z6 @9 m/*yesu*/来冒充空格
- `: h. p, z7 |- ~2 Z" z; W( Z
! E) I c2 U8 v( Y8 l& O( v: B, M- sB,使用注释来避开某些注入的确认过滤。
# J" }% A) l: V2 d6 i1 ~& ~7 z Y2 Z* F! p: s
SEL/*yesu*/ECT username,password fr/*yesu*/om admin4 K* {- t$ V+ K7 Q9 ?) B, _
+ Y0 v+ a; m' e, p1 `8 k$ K, M
4,处理被阻止的字符串
4 ~4 F5 {4 ~; \% C
" s9 j7 X! n# E. P% t5 r0 _# k- V比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
: b: N% n7 T- L- `$ J% a+ ~( ^) `) w% |, \* t9 ^; X
我们可以这样0 j' i8 i$ _7 ^! e/ h% [. O! v
# a0 c2 }0 ^& A. U6 QA,oracle数据库: ‘adm’||’in’; q2 Z$ {# I+ x' J- _7 g1 T( ^
. ]4 \+ |: a% ^. Q1 {! A
B,MSSQL数据库: ‘adm’+’in’" a' R# d ^9 r
" \$ X4 ^, }; y* o" Y6 c3 K0 e
C,MYSQL数据库: concat (‘adm’,’in’)( h/ i/ i/ X5 U% U' J1 u; t
1 ^- ~* C+ E3 v, sD,oracle中如果单引号被阻止了,还可以用chr函数7 {, A) x8 I! v
. l' O6 z7 ^1 \5 A; j# n/ \sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)% P& f1 x( e7 H- O; k8 L2 c l# Y
0 _& W& K, T0 v7 v" ]& R4 G8 ^
还有其他方法。正在收集中.
! b- T- A+ g* D4 _/ `; S1 U% ]5 A! t
|