SQL注入。有攻有防。知道进攻。才懂得防守.
- b! x/ z* f! T) F5 b3 k6 E l, u% z# t5 C8 ?! \# _! l
有的时候,很容易受到SQL注入攻击的程序,可能会进行输入过滤,用来防止攻击者无限制的利用其中存在的设计缺陷。7 H1 L4 H( @' K/ h( Y; F
2 n3 o! Z/ |+ v; a7 k4 N/ m唱出会删除或者净化一些字符,或者阻止常用的sql关键词。
+ ^. D' ^7 m. l8 b2 ]: d& E3 s) }8 V6 Q
我们通常有以下几种技巧,去避开这些过滤。
% J7 m; A. n$ q0 S0 h7 `) u8 _2 p7 Q( a/ }' c! _5 P
1,避免使用被阻止的字符,即不使用这些字符仍然达到攻击目的。
% B& e3 G9 _* [, ?- |7 G
: U9 O) G6 l( g* R# tA,如果注入一个数字数据字段,就不需要使用单引号。
& g6 n4 v& Q% p( [! _& X* J# X. X3 ?* O) l. I
B,输入注释符号被阻止使用,我们可以设计注入的数据,既不破坏周围的查询语法。
# M* t1 S4 ^1 U5 f/ f: W3 @( T- ?0 t3 I2 }% H0 |/ U
比如, ?id=1′ 这里存在注入,过滤了注释符合,我们可以输入 ?id=1′ or ‘a’=’a
+ @# S W$ t* }$ s8 A7 K) |7 i8 r T' w) F! e! ]5 Y: U
目的其实很简单,就是把后面的单引号给闭合掉。
3 {3 J: F0 q: B; J' P' _. _% y# j1 t# @; z2 q1 ?" y4 `
C,在一个MSSQL注入中注入批量查询的时候,不必使用分号分隔符。) {& E1 D9 c" Y; q
* |4 _! w$ M! Y) C; K只要纠正所有批量查询的语法,无论你是否使用分号,查询的解析器依然能正确的去解释它们的。
% Z/ N u7 o2 O& W) p$ H4 J9 N4 o8 q# n
2,避免使用简单确认8 Q* }7 B8 y& _; u# n
4 d7 C/ `/ B1 k4 {/ c# ]. m; I- A一些输入确认机制使用一个简单的黑名单,组织或删除任何出现在这个名单中的数据,比如防注入程序。
& ]1 N( X$ ?6 B( M
8 @- h5 U% j0 X. S这一般要看这个机制是否做的足够的好了,黑名单是否足够能确保安全。如果只是简单的黑名单,那也有机会突破的。
( ^* V: m0 X; W' j
/ K& k2 S \' q+ w8 {A,如果select关键词被阻止或删除+ e& B% ^5 Q9 q! G2 `
+ v9 D' ^" c8 [7 }: c我们可以输入:
) q. m6 Q% A% L8 Q' D. c% r
6 p) H1 Y; N4 \% h* ^: O) Q4 TSeLeCt 注意大小写) w* @# J3 J+ H+ J+ k% h; |
3 x: B$ k, j0 k- {, d3 Eselselectect 还记得ewebeditor是怎么过滤asp的么?+ `5 x3 ]; u7 Y3 f" m: r
/ x: \$ z- _- ]8 U+ o
%53%45%4c%45%43%54 URL编码+ n) g- R% j+ \, k9 `
, F, ?' E% L0 t: S" |4 [
%2553%2545%254c%2545%2543%2554 对上面的每个%后加了一个25
& _5 Q# v) } n; g! {" k! ]1 x: [6 h
2 q& M% L# H5 \; O# x# t/ |3,使用SQL注释符! M; |9 N+ k) t! z; r
4 Y- |0 d8 B8 k UA,使用注释来冒充注入的数据中的空格。
/ Z; Z1 a3 k# ~/ p5 V' Z+ X* Y3 f" h1 ]( S& h5 s# {
select/*yesu*/username,password/*yesu*/from/*yesu*/admin
) G; t' {& P+ A
( s0 n0 b3 x+ i! d" d/*yesu*/来冒充空格5 D9 M: N. b; ~. K8 X
) {. B) ~6 E c+ S6 w6 @- `+ bB,使用注释来避开某些注入的确认过滤。
8 |5 k5 `- W( i; z. C- V
9 g8 _. a) K& A" ]SEL/*yesu*/ECT username,password fr/*yesu*/om admin
. _0 F; c7 P" |
" k# Q0 ?3 b* A1 J* \2 Z4,处理被阻止的字符串
* f8 P+ s& y, o% s5 l5 [4 X
, ^& v; A2 X1 R比如,程序阻止了admin,因为怕攻击者注入admin表单中的数据。
" P; o/ D* l2 O& P1 k) }% e
+ U4 S S" R7 H' b$ h9 V2 |我们可以这样7 H' h* ?( T7 i% J ]
1 l7 S! f4 X( F: L, ?& S# M F0 @
A,oracle数据库: ‘adm’||’in’
- z: x+ u1 y2 D3 Z4 x& A9 j' h0 \$ P4 I+ { ]! W+ i
B,MSSQL数据库: ‘adm’+’in’8 Q# y! b' ]/ T* s8 M0 K* a. D
# `4 n5 U' A4 q# \+ m; B4 c
C,MYSQL数据库: concat (‘adm’,’in’)9 z: [! y; X/ d2 N7 f+ K
& r* a9 `- s: T1 e* f. q) VD,oracle中如果单引号被阻止了,还可以用chr函数: @. B# F3 [4 R" H( y, q8 Q
5 N( y, x l! U( @ asleect password from admin where username = char(97) || chr(100) || chr(109) || chr(105) || chr(110). d* v. O4 u+ W8 w* L% f
8 Q, U4 x4 U, q* e* s, f2 E7 U7 {
还有其他方法。正在收集中.0 B5 C: F: s2 K- i0 n
* D; i. j3 c: S |