SQL注入。有攻有防。知道进攻。才懂得防守.+ t0 _: t( T9 P. h' }
# E% K; c' d- {: _6 j9 k: m
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
( o- |5 Y) B4 [; {8 J8 C0 [
1 P+ Y+ V8 w! T/ D2 P6 M唱出会删除或者净化一些字符,或者阻止常用的sql关键词。0 W- f1 M, }' G/ F; _& k# w
0 j, u( u- A7 e/ `! e2 ?: h4 w我们通常有以下几种技巧,去避开这些过滤。5 w4 r. S9 v; x2 a. {6 f/ A
# d% l) N7 J% y# @0 s
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
2 F% k/ O' Q! e3 R2 Y, Z- I3 L, k' }5 S6 i" W' m( A1 N3 p4 _
A,如果注入一个数字数据字段,就不需要使用单引号。3 o2 o& Z9 o2 z8 T
) d% z8 ]" H# G4 w! H
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
C9 }( F6 B6 I6 W. h8 _- Y, [/ v/ ^0 u2 c# l% n8 C
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a" Z1 T3 a, n: ~" F
' u$ z" j$ b9 |目的其实很简单,就是把后面的单引号给闭合掉。
: I+ ~. K! h' u/ }9 p$ f6 Z9 ^( l( ?, v& l! ^! ^) h* I
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。3 @* @& i- z$ M( M
4 ? ^$ z% e! f, y( c7 m只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。$ P- B+ u# a+ N# d8 D9 p% M$ H
7 q. O/ f8 {" q- E/ T2,避免使用简单确认
9 ^6 y1 A" f& v3 R( ~7 q3 d( V6 _/ [9 a8 m, o! \3 R) M. u
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。& f3 ]' i" }; O3 [% z1 A0 [
7 [% F7 l3 z" H" C/ h# x: U3 P
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
" p" w: H) q+ N" u; U
1 J# C* q, K2 s4 C: jA,如果select关键词被阻止或删除9 d; ]3 c" ]# Z' _) Q* E% r
0 x- X, B( U: J; o* j% K我们可以输入:
: ~, ], Q5 R6 F) t% i7 K
) D) E) [' E# m# t- q' e5 A/ }$ |SeLeCt 注意大小写
" d8 j; h. K2 l5 c3 n/ S; G/ {3 M
+ u7 p2 Z8 E' Oselselectect 还记得ewebeditor是怎么过滤asp的么?
+ O: n6 y. t& P! I1 T
5 N: j8 H ?! D# }! \/ r& a%53%45%4c%45%43%54 URL编码- h" D8 U+ |& y+ L
5 y! _# `7 ?4 {( c
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25% {% a0 k% { p9 J7 z& ]8 T
5 D$ q; A: q$ ^' N; t3 z
3,使用SQL注释符2 w! t. L" n( a; U O
+ Q9 x0 g8 d; CA,使用注释来冒充注入的数据中的空格。
5 ^% @9 ?7 \9 d- W: P8 S9 L' d# j" D# C% X9 M7 l
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
4 @7 Z) v! h. g) }) l1 J$ D, u4 z/ k+ B( F/ v
/*yesu*/来冒充空格3 q; ^: {9 c% I1 \
" Y: c3 C6 M$ t1 S, Y3 T
B,使用注释来避开某些注入的确认过滤。9 u3 @" F2 z: y
1 W* j- ^& V) a
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
" _6 j7 t/ n6 L7 T$ u6 Q' Y# S" i( z8 a8 w8 ]1 r$ n
4,处理被阻止的字符串
2 ^( l U2 L# r6 T- ~+ {7 s6 W, F. q% K, ` c
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
7 i1 P) l$ G w) Q3 V. p- j5 @- H; e6 S) I# u, T
我们可以这样
' L) R" { {2 k2 D1 f* c0 @8 L" S, [ N# @) B9 Y5 O
A,oracle数据库: ‘adm’||’in’
) j# G3 i# I# _ t9 }, t, h
; ^3 w% f( }/ }, R) i# |B,MSSQL数据库: ‘adm’+’in’( b5 a1 |& u6 ?4 a; Z3 D3 o# ]
$ I; |8 p0 w2 P5 E' @6 J M O
C,MYSQL数据库: concat (‘adm’,’in’)
/ r% x1 K8 y+ t3 W% Y" X# ?! m! u$ P" h" j
D,oracle中如果单引号被阻止了,还可以用chr函数 }5 l& i% X! o4 x$ K3 f
/ }' F0 B7 S$ }; c$ Zsleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)3 G5 Y: `8 U2 g* g, I
. S9 f& [% @ m/ U7 k; s; F
还有其他方法。正在收集中.3 u, |+ f' D4 L1 y" m* Q
/ c: Z) Q. }( P9 G% f, a
|