学习记录--关于XSS攻击

关于XSS的学习,昨天花了一天的时候看了很多关于XSS的文章,自我感觉已经略知一二,今天把自己的学习心得,包括一些定义和原理,我将会用DVWA上的靶场以及自己通过Express搭建的平台来演示XSS的一些基本的操作,希望在往后的学习过程中能了解更多,这里放上一个知乎博主的文章,关于他发现百度网盘上有一个XSS漏洞,现在已经修复了,但是还是蛮有意思的,https://zhuanlan.zhihu.com/p/24249045.

0x01
首先什么是XSS漏洞:
XSS, 即为(Cross Site Scripting), 中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻击。
跨站脚本的重点不在‘跨站’上,而在于‘脚本’上。大多数XSS攻击的主要方式是嵌入一段远程或者第三方域上的JS代码。实际上是在目标网站的作用域下执行了这段js代码。

在学习XSS漏洞前要对javaScript有所了解,以及HTTP,DOM,Ajax有所认识.(上一个暑假花时间学习了关于了前端的知识,所以刚好用得上)

XSS的攻击方式分为:(1)反射型XSS (2)存储型XSS (3)DOM XSS


(1)反射型XSS:
反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。

从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。

(题外话:使用express搭建简易的服务器)

本机已有node.js的前提下,安装express
sudo npm install -g express
sudo npm install -g express-generator

创建一个目录xss,使用express创建一个简易的web应用框架
express -e ./(-e 表示使用ejs框架)
1
然后npm install,安装所有依赖,最后在xss目录下 npm start,就可以开启这个web框架,访问https:localhost:3000就可以访问了
然后修改一下xss文件中的router->index.js文件,修改后如下:

1
2
3
4
5
6
7
8
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.set('X-XSS-Protection',0);
res.render('index', { title: 'Express',xss:req.query.xss});
});
module.exports = router;

修改views->index.js文件,修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1><%= title %></h1>
<p>Welcome to <%= title %></p>
<div class="">
<%- xss %>
</div>
</body>
</html>

这两步就是为了添加一个XSS的接口,使得我们可以输入一个名为$xss的变量,仅为实验环境,弱智了一点。
1

那么在这里我先抛砖引玉地挂上一个栗子,初步理解一下XSS的整个攻击流程,

查看未攻击时的源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>Express</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>Express</h1>
<p>Welcome to Express</p>
<div class="">

</div>
</body>
</html>

现在进行反射型xss攻击,我们的payload如下:
http://localhost:3000/?xss=<img src="null" onerror="alert(1)"/>

这时候再观察页面还有源码
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>Express</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>Express</h1>
<p>Welcome to Express</p>
<div class="">
<img src="null" onerror="alert(1)"/>
</div>
</body>
</html>

有没有发现有什么不一样,我们输入的东西被解析成script语句,又被浏览器解析,所以一次很简单的反射型xss攻击就由此完成了。
然后好玩的东西来了,我们再把payload改成其他的东西
http://localhost:3000/?xss=<p onclick="alert('you a foolish dog')">你点我啊</p>
查看效果以及源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>Express</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>Express</h1>
<p>Welcome to Express</p>
<div class="">
<p onclick="alert('you a foolish dog')">你点我啊</p>
</div>
</body>
</html>

4


(2)存储型XSS:
存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了。

最典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。

现在我在通过一个小栗子来理解一下存储型XSS,先写一段小代码xss.php(这里要在mysql中配好相应的数据库和数据表以及其中的columns),
先看看这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<form action="" method="post">  
<input type="text" name="xss"/>
<input type="submit" value="test"/>
</form>
<?php
$xss=@$_POST['xss'];
mysql_connect("localhost","root","root");
mysql_select_db("xss");
if($xss!==null){
$sql="insert into temp(id,payload) values('14','$xss')";
$result=mysql_query($sql);
echo $result;
}

看完应该能懂我在做什么,那个数字自己可以改的,本来是想着,连id都做成自己输入的,但是代码不会写,只能这样将就了,有点low.
然后再写一段代码show.php,用于返回,插入数据库的信息.

1
2
3
4
5
6
7
8
<?php
mysql_connect("localhost","root","root");
mysql_select_db("xss");
$sql="select payload from temp where id=14";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo $row['payload'];
}

5
文本框中输入:,点击text
然后再看show.php,就会发现这种情况
6
然后我们再查找数据库
7

说明我们成功地完成了一次存储型XSS攻击

0%