SQL注入。有攻有防。知道进攻。才懂得防守.
6 j! l$ J% y$ A% A+ a, H
4 i3 s/ v- ?: W" c$ U/ V" r有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。- J' V3 F1 K4 L' a
7 F b6 ?9 w$ X3 V! y
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
# B7 F: W" l$ d! V- I% S, i# S* g% b" z `/ N. N
我们通常有以下几种技巧,去避开这些过滤。0 n5 v2 G) W5 {; J) v
2 m% H% }3 F- {9 c/ w* ?1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
+ h1 h4 W5 T- x. \$ d2 ~1 Q& ?' o5 ^ I4 w
A,如果注入一个数字数据字段,就不需要使用单引号。; y. R" T0 e7 W6 x; g3 i
5 ?3 b9 w- v( L" P! s7 P
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
0 i7 ?2 e' f6 a" h- o8 p
' g5 o f7 u4 h1 q: k6 V比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
}' W0 y8 ?) g ?) B
" A8 l8 g) I- s" u目的其实很简单,就是把后面的单引号给闭合掉。
5 Y" e4 I4 l6 t6 F/ `5 U B, G, w6 G7 s, ^) T4 l
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。8 V6 a) _, U- t
4 J/ C# b" k) i2 a8 N- j只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
4 O8 V2 v0 J: O! h4 K* q, K
4 g( s$ t! O1 K; S4 W2,避免使用简单确认
$ |( Q2 j% k5 `7 }. Q- t L7 m, W
一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。" s6 R8 {7 ?2 d% K+ [+ b7 @. }
! t% ^8 b x0 ?( w- u
这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
6 M1 n/ c4 K$ b* ^5 k. [( J. H% \# B' l, A3 L
A,如果select关键词被阻止或删除
& W' i' O" i( R1 D2 S! L
9 G* m4 j0 U9 b. I2 t( H我们可以输入:
% J& E( T1 p, S5 C8 W7 s6 ^4 n% X3 u: Z
SeLeCt 注意大小写
# O) o, c5 B, a1 i& ?/ c6 {. n6 e8 q* _
selselectect 还记得ewebeditor是怎么过滤asp的么?
( G6 b$ k8 _- n* {! E5 r) A+ K) z( x# u( u
%53%45%4c%45%43%54 URL编码) h8 [8 B9 a. d) ^# P
3 z2 a& ]% ^5 C0 v%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
- L/ e: J9 V2 m' K! z! b8 I, o+ x: J9 @ X+ J$ U
3,使用SQL注释符
' N W7 V* z" }1 }
- D( N% l" o: w( UA,使用注释来冒充注入的数据中的空格。( j+ G8 w% v' X8 h
4 y+ ~! h% e* F! R2 t }4 P
select/*yesu*/username,password/*yesu*/from/*yesu*/admin$ ?2 T# @6 ^& y8 S
* F$ x; W, K; O. z; P" Y3 Q: a6 [
/*yesu*/来冒充空格5 F# t. D/ m; `6 h, @
2 g9 `( b; M% I+ z1 X. dB,使用注释来避开某些注入的确认过滤。) Y& N$ [" N B; w/ r% a- U
) S7 ]& [$ M9 U0 ?1 s, I2 BSEL/*yesu*/ECT username,password fr/*yesu*/om admin b7 T- b+ ^5 K7 N- d
0 T0 g2 E3 t: d9 k4,处理被阻止的字符串
) D; y% o ?9 h* [1 [
6 h! y. @+ }' Z$ |& t# J" y比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
- h( P: r3 K* c# `
^! \, ~6 k* O' P* ~# d; J我们可以这样
% a, O8 @! C* f" R6 L" ~: H0 s1 |' _5 E3 f( {
A,oracle数据库: ‘adm’||’in’
& U7 H+ [' q$ \ i. O u& B- X8 X! N+ ? j/ i J- Q, M
B,MSSQL数据库: ‘adm’+’in’/ P1 I, l8 t1 }7 k5 t/ c
' G5 z* q+ H0 P4 O
C,MYSQL数据库: concat (‘adm’,’in’). @. W3 E. B `/ U, V+ a/ e
' H P* ]$ ?+ f* S! F( I6 xD,oracle中如果单引号被阻止了,还可以用chr函数; R% k0 A! F! `9 D3 `5 C' S
/ A9 B& P4 E$ e1 w
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)$ x% ?* _% G7 s1 L/ w
0 w6 U# B R' }( T还有其他方法。正在收集中.
, J# a# U; t9 l+ D9 v. r4 g1 O5 _& {# L1 i
|