WeChall - htmlspecialchars
Challenge
利用一行有 XSS 漏洞的 PHP 代码。目标是找到漏洞点并提交修复方案。
1 | echo "<a href='http://".htmlspecialchars(Common::getPost('input'))."'>Exploit Me</a>"; |
Solution
漏洞分析: htmlspecialchars()
的默认模式是 ENT_COMPAT,只转义双引号 "(转为
"),不转义单引号 '。而 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 后,输入 ' 会被转为
',无法再逃逸 href 属性。
提交方式: POST 到
htmlspecialchars.php,字段名为 solution(不是
answer),cmd=Submit。需要 CSRF token。