安全测试-DVWA 靶场搭建及XSS漏洞原理、挖掘、防御

安装dvwa靶场,DVWA(Damn Vulnerable Web Application)是一款比较著名的漏洞靶场,很多 Web 安全的初学者都会拿它来练习。DVWA 的项目开源地址为https://github.com/digininja/DVWA。
一、通过docker安装,拉取镜像,启动docker容器。

docker pull citizenstig/dvwa
docker run -d --name dvwa --rm -p80:80 citizenstig/dvwa

二、在浏览器里访问机器IP
点击Creat/Restart Database,创建数据库
在这里插入图片描述
页面跳转到登录页,登录密码默认为admin/password
在这里插入图片描述
在“DVWA Security“中设置安全等级,即题目的难易程度,Impossible代表漏洞被修复的。
在这里插入图片描述
根据 HackerOne 漏洞奖励平台发布的《The 2020 Hacker Report》统计报告,XSS 漏洞类型占所有报告漏洞中的 23%,排名第一。

XSS(Cross Site Scripting) 漏洞,通常指的是用户输入数据未做有效过滤,攻击者可以将恶意脚本注入网站页面中,达到执行恶意代码的目的。攻击者只需要诱使受害者打开特定的网址,就可以在受害者的浏览器中执行被注入的恶意代码,从而窃取用户身份,执行一些敏感操作,或是进行其他的危害行为。
我们先看下XSS(Cross Site Scripting)漏洞,种类分为
1、反射型、2、存储型
1、反射型 XSS,获取cookie,打开DVWA这个XSS(Reflected)
在这里插入图片描述
我们在输入框中输入

<script>alert(document.cookie)</script>

然后点击Submit按钮,就会弹出alert弹窗,展示cookie内容。
在这里插入图片描述
分析下原因,首先是这个地方是存在反射性XSS漏洞的。这个输入框的代码如下,含义是获取输入框的name的值。并且打印出来
在这里插入图片描述
我们看到当我们输入name=这个值的时候,浏览器会把解析这个script标签,然后弹出alert弹窗,弹窗的内容是和获取cookie。
在这里插入图片描述

2、存储型XSS,也叫持久型跨站脚本,攻击者把恶意代码存到服务器上,只要诱导用户访问被插入恶意代码的页面就可以触发。这个一般存在于发表评论的地方,比如博客、帖子。DVWA也有个存储型XSS案例,案例的原理是将用户输入的数据直接存储到数据库,并输出到页面上,这个过程没有做过滤,导致XSS漏洞。利用DVWA来演示,里面有个菜单XSS(Stored),这个form表单有两个输入框,一个是name,一个是message,挡在message里输入攻击脚本时。

<script>alert(document.cookie)</script>

在这里插入图片描述
在这里插入图片描述
点击Sign按钮
在这里插入图片描述
这个表单的源码如下,是获取name和message的值存到数据库中,然后,在输出到页面。
在这里插入图片描述
在这里插入图片描述
浏览器对输出的这个script标签内容进行了解析,然后弹出alert弹窗,获取cookie。

XSS 漏洞挖掘
人工测试
日常收集一些 XSS cheat sheet,然后编号整理出来,用于日常测试用例;可以先一次性批量输入测试,如果无效,再输入一些特殊字符看过滤情况,根据返回数据作相应的调整测试。

自动测试
针对XSS漏洞扫描有开源工具,XSStrike,开源地址(https://github.com/s0md3v/XSStrike),需要clone下代码,并且安装python3,非常有利于自己添加 XSS payload,或者做二次开发。XSStrike 支持很多功能,比如 DOM XSS 扫描(基于正则扫描敏感函数,存在一定误报)、WAF 检测与绕过、爬虫、HTML&JS 动态解析引擎验证。常用的测试命令如下:

爬虫整个网站进行 XSS 扫描:

python3 xsstrike.py -u "http://testphp.vulnweb.com/" --crawl

针对单个 URL 进行扫描:

python3 xsstrike.py -u "http://ip/vulnerabilities/xss_r/"

因此,这里再推荐另一款工具,叫 NoXSS(https://github.com/lwzSoviet/NoXss),,clone下代码,并且安装python3,它的特点就是批量扫描速度快,而且告警展示效果比 XSStrike 好,但漏洞检测能力不如 XSStrike,你可以把这两款搭配着使用。NoXSS 的使用方法也很简单,常用命令如下:

python start.py --url="http://localhost/vulnerabilities/XSS_r/?name=a"

防御 XSS 攻击
做好过滤,如何过滤
1、输入检查
在测试 XSS 时,经常需要输入一些特殊字符,所以在一开始直接做好输入检查有利于减少攻击的可能性。我在协助业务修复漏洞的时候,经常推荐的方法就是白名单限制,比如参数是个整数值,那直接限制死即可,若不符合就抛异常。不要单纯只想着过滤替换特殊字符,这很容易就被绕过了。

如果白名单范围不好确定,我就会采用黑名单的方式,把常用的 XSS payload 特殊字符或字符串做检测,比如

扫描二维码关注公众号,回复: 12838166 查看本文章
<script>、javascript:<>、'、"、&、#。

但是黑名单这种方式,有时结合业务场景,以及浏览器特性,就有可能找到绕过方法。

还有一定不要单纯只在客户端上做过滤,还要结合服务端做限制。若只是客户端上做过滤,那么抓包后修改数据重发就绕过了。

2、输出检查
跨站漏洞的触发关键点就在于输出的位置,所以对输出进行检查尤为重要。我们要根据不同的位置采取不同的 XSS 防御方案。
在这里插入图片描述

3、Httponly Cookie
如果你在 Cookie 中设置了 HttpOnly 属性,那 JavaScript 脚本将无法读取到 Cookie,这样就能防止通过 XSS 窃取 Cookie,在一定程度上能够减少 XSS 的攻击范围。
通过google浏览器安装EditThisCookie这个插件可以查看cookie,可以看下百度的加了HttpOnly
在这里插入图片描述
4、Content Security Policy
内容安全策略(Content Security Policy,CSP)也是减少 XSS 攻击的一种方式 ,是浏览器提供一种防御机制。它采用的是白名单机制,告诉浏览器可以加载和执行哪些外部资源,这样就能防止被一些第三方恶意脚本注入执行。
开启 CSP 有两种方式:
(1)通过 HTTP 头信息的 Content-Security-Policy 的字段:

Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:

(2)通过网页的标签设置:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

猜你喜欢

转载自blog.csdn.net/qq_30353203/article/details/112597457