WeChall - htmlspecialchars

Challenge

利用一行有 XSS 漏洞的 PHP 代码。目标是找到漏洞点并提交修复方案。

1
echo "<a href='http://".htmlspecialchars(Common::getPost('input'))."'>Exploit Me</a>";

Solution

漏洞分析: htmlspecialchars() 的默认模式是 ENT_COMPAT,只转义双引号 "(转为 &quot;),不转义单引号 '。而 href 属性值恰好用单引号包裹,因此可以通过单引号逃逸出属性值,注入 XSS 事件。

第一步 — 漏洞利用:

在 input 中输入一个单引号闭合 href,然后注入事件处理属性:

1
' onmouseover='alert(1)

生成的 HTML:

1
<a href='http://' onmouseover='alert(1)'>Exploit Me</a>

注意三个单引号的闭合逻辑: - href='http:// 为 HTML 模板的开头部分 - 第一个 ' 闭合了 href 的起始单引号 - onmouseover='alert(1)' 被解析为新的 HTML 属性 - 最后的 '> 会落在属性值的单引号后面(不闭合也不影响渲染)

悬停在链接上就会触发 onmouseover。在 WeChall 自己的测试页面里,鼠标悬停就能看到 alert 弹窗。

第二步 — 修复:

htmlspecialchars() 加上 ENT_QUOTES 标志,使单引号也被转义:

1
echo "<a href='http://".htmlspecialchars(Common::getPost('input'), ENT_QUOTES)."'>Exploit Me</a>";

加上 ENT_QUOTES 后,输入 ' 会被转为 &#039;,无法再逃逸 href 属性。

提交方式: POST 到 htmlspecialchars.php,字段名为 solution(不是 answer),cmd=Submit。需要 CSRF token。

echo Exploit Me;