SQL注入。有攻有防。知道进攻。才懂得防守.1 e/ Z2 m; X7 m9 ~3 P. _9 w4 W
7 [( N& K8 {) Y: e. n
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。
+ A/ G& f6 k7 f/ s& e+ P+ Y# m# y* ~+ D1 Q
唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
( I; q8 a, ?- m) F. \$ y1 \+ ~
我们通常有以下几种技巧,去避开这些过滤。0 q! J( U$ T+ ^7 S/ `
* ^6 x# _. n" O, D% Y1 [1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。9 t7 h h) E+ S" S
- W2 ~% U0 Z4 P0 B1 z
A,如果注入一个数字数据字段,就不需要使用单引号。+ E5 z' s" G+ h5 a
3 J) N, Q2 T' `% {3 o
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。- X* G) e4 T6 H# f; C7 B
. s0 t, E; l. m7 ]* w: L# P比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
/ F- P) |( N- I& j; K
6 D9 Y* x( J! K+ ]& ]目的其实很简单,就是把后面的单引号给闭合掉。+ [3 ^8 D3 A3 j1 F
6 L3 n) [$ \& X3 T* H5 C/ Z: ?C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。
' m0 u, R( m9 c8 M4 U9 d0 Y
+ p. A0 {3 {5 Z只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。; n3 m9 g; C$ l
D2 Q( f1 } |% E3 W/ a
2,避免使用简单确认
Z+ N0 A) @( |# j- u5 e2 B& g
3 N1 c* b+ A$ @& r( u一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
( x6 ^; P( R( a2 z
! ^* o6 F% N/ e, Y G: @这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。& [; i$ j# T/ I8 ]
8 M- L$ V5 r" ZA,如果select关键词被阻止或删除
; s( x' h% [- ]+ F' S( {2 a- Y0 w4 r- J" U- R4 X
我们可以输入:
6 j3 z; x! |: J' G6 E' _1 ?0 L( j1 B* G) Z9 d
SeLeCt 注意大小写
) y% R. A3 y% p# C+ N& v4 {
: N& X8 `8 B2 A3 U8 Aselselectect 还记得ewebeditor是怎么过滤asp的么?2 {) `9 i+ N3 c3 d0 [( d; N
4 Y g5 N1 d0 `( ]: ~
%53%45%4c%45%43%54 URL编码
: d/ x$ B; v! o8 j0 N# H. q/ Z1 S" y: P0 F( o1 B5 ]3 y1 h- f1 n
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个253 O3 b4 b& }* {3 D0 Z6 [
) Q4 U4 j+ T K" |
3,使用SQL注释符& |5 T0 d* Y* S# _& @
- n; K. G3 L7 D( ]
A,使用注释来冒充注入的数据中的空格。
% M8 `) u4 ]1 s: ^6 F; \8 }. @
7 }) o! @9 d! d) W8 d( [select/*yesu*/username,password/*yesu*/from/*yesu*/admin4 \- D- M* |& L' g
- O$ [& D/ g* C, _
/*yesu*/来冒充空格- I9 L8 V9 o. J5 b
7 J7 E6 A! ^9 n9 C% qB,使用注释来避开某些注入的确认过滤。
1 i4 s, [7 R$ w; q* H* d/ f/ A2 f; a! \' Y& ~
SEL/*yesu*/ECT username,password fr/*yesu*/om admin
6 P* ?7 ]* n& d* e4 _6 E- V# D% a- C8 D& \
4,处理被阻止的字符串
9 {4 p1 }$ ^* H4 W4 L; x$ j1 x! h# E4 H
比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
0 U4 S8 Q& j. L+ q. U9 J# e9 r/ ~) f
我们可以这样
( ^6 o* I5 f( r N Z7 L7 N2 w% v: z4 M
A,oracle数据库: ‘adm’||’in’1 R: d7 o- L# ^: X: i3 w
, g( V1 p8 I( y- X
B,MSSQL数据库: ‘adm’+’in’
+ a! e* P5 }' G' G0 c
! J ~* T, I. A/ n1 Z7 K% b; rC,MYSQL数据库: concat (‘adm’,’in’)
0 S) z! M6 c3 J; F9 X% B! g) N& w# W K) B4 }
D,oracle中如果单引号被阻止了,还可以用chr函数. i7 c6 r- P% L( W
' z( ]6 g. j p7 F$ |/ }
sleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110)
$ G/ ^% a0 D1 ?
9 @1 `3 L' ~1 F3 m# L5 {, R还有其他方法。正在收集中.
$ ?0 q& r( P" n, J8 B' V3 O5 }. m$ X' H. a, q8 o a5 j
|