0x00 环境准备
QYKCMS官网:http://www.qykcms.com/
网站源码版本:QYKCMS_v4.3.2(企业站主题)
程序源码下载:http://bbs.qingyunke.com/thread-13.htm
测试网站首页:
0x01 代码分析
1、漏洞文件位置:/admin_system/update.php 第30-49行:
- switch($tcz['log']){
- case 'start':
- $path=arg('path','post','url');
- $file=arg('file','post','url');
- $md5=arg('md5','post','url');
- $check=arg('check','post','int');
- if($check<1||$check>2)$check=1;
- $zipfull='../'.$path.$file;
- if(!file_exists($zipfull)){
- 10. ajaxreturn(1,'没有找到升级文件,请确定PHP环境是否支持远程 file_get_contents 函数(错误代码:101)');
- 11. }
- 12. if(!function_exists('zip_open')){
- 13. ajaxreturn(1,'不支持zip_open函数,请检查PHP环境是否支持ZZIPlib库(错误代码:102)');
- 14. exit;
- 15. }
- 16. $zipmd5=strtolower(md5_file($zipfull));
- 17. if($md5!=$zipmd5){
- 18. @unlink($zipfull);
- 19. ajaxreturn(1,'升级文件md5较验失败,请稍候再次尝试升级(错误代码:103)');
- 20. }
在这段代码中,path,file,md5,check是可控的变量,其中
$zipmd5=strtolower(md5_file($zipfull));也就是我们外部传入的md5的值。
当$md5!=$zipmd5就会删除文件,我们可以轻易的构造参数去删除任意文件。程序在代码逻辑上存在严重的问题,导致程序存在任意文件删除漏洞,攻击者可通过该漏洞删除任意文件,如删除install.lck进行CMS重装,劫持网站数据库。
0x02 漏洞利用
1、在网站根目录新建一个text.txt,作为任意文件删除漏洞测试文件:
2、构造URL参数链接,成功删除test.txt文件
3、可进一步删除\install\install_lock.php文件,使程序进入系统重装状态,劫持网站数据库。
0x03 修复建议
1、指定文件读取目录,过滤.(点)等可能的恶意字符,防止目录跳转,最为推荐的方法;
2、对于要删除的文件,通过正则判断用户输入的参数的格式,看输入的格式是否合法。
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。