XSS-labs Less 1-10
Level 1 无过滤
name后的会显示在页面上,属于注入点:
<script>alert()</script>
Level 2 闭合标签
页面中有输入框,尝试第一关的注入
可以看到图中的value值即为输入框中的值,可以考虑闭合input标签
"><script>alert()</script>
或者使用onclick
" onclick=alert() "
Level 3 单引号闭合+事件
输入最简单的alert,ctrl+U发现value中大小于号被转换为html语言
换成onclick,发现单引号也被转换了,这里去看下php代码
使用到了一个叫htmlspecialchars的php函数,作用是将特殊字符转换成HTML实体(转义)
所以要想办法不使用这些特殊字符
发现使用单引号+事件可以避开
仔细看了php函数解释:
htmlspecialchars(
string $string,
int $flags = ENT_COMPAT | ENT_HTML401,
string $encoding = ini_get("default_charset"),
bool $double_encode = true
): string
发现默认是只转换双引号而未转换单引号,为注入提供了便利
Less 4 双引号闭合+事件
输入最简单的alert,发现大小于号被过滤
输入onclick,成功跳出弹窗
Level 5 新建标签
第一个scipt被加上了下划线(继续测试发现是<script>这个标签会被加上下划线,</script>不会
)
使用onclick发现on中间被加上下划线
根据提示使用a标签来跳转新页面,双引号闭合value,大于号闭合input标签
"><a href=javascript:alert()>xss</a>
点击链接即可进入下一关
Less 6 大小写绕过
尝试上一关的法发现href被加上下划线
类似尝试发现script、onclick等都被加上下划线
使用大小写可以绕过:
" ONclick=alert() "
点击一下输入框即可进入下一关
源码中的过滤方式(网上说data字段是可以通过image注入)
Less 7 双写绕过
尝试alert,发现script整个词被过滤(大小写均被过滤)
尝试onclick,on被删除(大小写一样)
尝试新标签页法,href和script被过滤,
既然过滤script,那就用双写
"><scriscriptpt>alert()</sscriptcript>
绕过成功!来分析下源码
<?php
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]); // 全部转为小写,无法大小写绕过
$str2=str_replace("script","",$str); // 删除script,无法插入js代码
$str3=str_replace("on","",$str2); // 删除on,无法使用onclick、onfucus等js事件
$str4=str_replace("src","",$str3); // 和data一样,是防止img注入alert信息
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5); // 删除href,无法新标签页绕过
// 当然以上这些都可以双写实现绕过
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
Less 8 编码绕过
尝试基本的alert,如图可知script被加了下划线(onclick也是),同时绕过点在于a标签的href中
由链接联想到新标签页法,使用HTML编码,javascript是在ri之间插入下划线,将ri转换为10进制类型的编码:
补充:
HTML实体编码:主要分为10进制和16进制,格式为 开头以分号结尾,火狐/谷歌/IE都支持,进行html十、十六进制编码(找到了个在线的:https://www.toolzl.com/tools/htmlende.html https://www.qqxiuzi.cn/bianma/zifushiti.php,回头自己写个能转换为10或16进制的脚本)
javascript:alert()
分析源码:
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]); // 无法大小写绕过
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5); // 添加下划线无法使用双写绕过
$str7=str_replace('"','"',$str6); // 这里很重要,使用双引号会被HTML编码而无法闭合href
echo '<center>
<form action=level8.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
Less 9 检测关键词
这一关同上一关可以对a标签做手脚,不过无法直接进行拼接,显示:<u>您的链接不合法?有没有!</u>(大小写,双写,编码均无法绕过)
这关不看源码很难猜测出(当然检测的关键词很明显):在第八关基础上加入对过滤完的输入是否含有 http:// 的检测,不存在无法拼接
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
知道了就很好办了,在alert中加上'http://'即可
javascript:alert('http://'')
Less 10 隐藏信息
查看html源码发现有个表单输入区被隐藏
尝试修改掉hidden,并把最后一个改成submit键,随便输
结果:URL栏中有了新的get变量
把最后一个t_sort也加上值为a,发现表单区出现了value值,存在绕过点
所以修改t_sort的值为" onclick=alert() ",同时去掉第三个input的hidden使得可以点击输入框来跳转
这里直接用的较简单的onclick,查看源码可知大小于号被过滤,<script>
标签无法使用
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
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="'.$str33.'" type="hidden">
</form>
</center>';
?>
2 条评论
test
alert()