整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

跨站脚本(XSS)漏洞实战演示-由易到难2

跨站脚本(XSS)漏洞实战演示-由易到难2

面几篇文章我们讲到了跨站脚本(XSS)漏洞的几种类型和验证方法以及防御措施,有兴趣的朋友可以到我的主页翻看文章《十大常见web漏洞——跨站脚本漏洞》和《实操web漏洞验证——跨站脚本漏洞》,今天我们继续由易到难实战演示一下跨站脚本漏洞的形成,以便更好地了解漏洞的产生原理,进一步做好防御。

上一篇文章我们已经闯过了5关,今天我们继续。

html事件中的xss

html事件是在满足一定条件的用户行为发生时,所触发的的事件,例如当单击鼠标时的“onclick”以及当浏览器加载图像时的“onload”,我们可以将这些特定的html事件发生时,将JavaScript语句作为属性传递给特定的标签,从而构成一个或多个JavaScript命令或函数。

下图我们从网上搜索了一些html事件属性,有兴趣的可以自己搜索学习。

html事件属性

在这一关中,我们可以构造语句:

111" onmouseover="alert(document.domain);"

前边的“111"”是为了闭合标签,后边的“onmouseover”属性表示当鼠标移动到输入框时执行后边的语句,点击“search”按钮,将鼠标移动到输入框时,页面在弹出内容为当前页面域名的弹窗后,提示“恭喜!”,就可以顺利进入下一关了,如下图所示:

恭喜通关

空格分隔属性中的xss

这一关我们先来探测一下注入点的情况,我们和之前一样先闭合标签,输入“123456"”来闭合标签,找到对应的代码,发现我们输入的内容被另一对引号括住了,如下图所示:

页面代码

这表明我们输入的内容直接被实体化了,那我们不使用引号闭合,直接输入“123456 onmouseover=“alert(document.domain)””,发现只要是等号后边的参数都被引号括了起来,如下图所示:

页面代码

因此我们都不加引号,构造:

123456 onmouseover=alert(document.domain)

注意中间有个空格,点击“search”按钮时,页面在弹出内容为当前页面域名的弹窗后,提示“恭喜!”,就可以顺利进入下一关了,如下图所示:

恭喜通关

JavaScript伪协议触发XSS

有时候我们需要将JavaScript代码添加到客户端中,这时就需要JavaScript伪协议来帮助,它的格式为JavaScript:url,例如:JavaScript:alert("hello word!"),就是一个简单的通过JavaScript伪协议来执行alert("hello word!")语句,它表示在页面显示“hello word!”。

因此我们可以构造语句

JavaScript:alert(document.domain);

点击“Make a Link”按钮时,可见输入框下边出现一个URL超链接,我们点击这个链接,如下图所示:

URL超链接

页面在弹出内容为当前页面域名的弹窗后,提示“恭喜!”,就可以顺利进入下一关了,如下图所示:

恭喜通关

UTF-7中的xss

这个比较简单,因为UTF-7绝大多数浏览器都已经不用了,我们很少会遇到,因此我们直接构造语句:

onclick=alert(document.domain);

我们按F12键,根据下图提示找到第三步位置,将以上语句写入到对应位置,再点击第二步的位置,如下图所示:

修改页面代码

页面在弹出内容为当前页面域名的弹窗后,提示“恭喜!”,就可以顺利进入下一关了,如下图所示:

恭喜通关

绕过过滤domain为空的xss

首先我们还是老办法构造闭合语句,如下所示:

"><script>alert(document.domain);</script>

点击“search”,按F12,找到如下图红框中的位置,发现我们上边构造的语句中“domain”被删除了,如下图所示:

页面代码

既然被删除了,这时我们可以通过双写来绕过domain被删除这种情况,我们可以构造:

"><script>alert(document.dodomainmain);</script>

注意我们在单词domain中间又加了一个单词domain,这时系统在删除一个单词domain后,还会留下一个domain,这样我们就成功执行了语句了。

点击“search”按钮时,页面在弹出内容为当前页面域名的弹窗后,提示“恭喜!”,就可以顺利进入下一关了,如下图所示:

恭喜通关

当然我们也可以通过编码的方法来绕过,我们可以构造:

"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9kb21haW5tYWluKTs='));</script>

其中“eval”是用来执行字符串,其后边的内容会当成JavaScript语句执行,“atob”表示将加密的base64密文,转换成原文,而里边的一串乱码就是通过base64加密过的的“alert(document.domain)”语句,关于加密,有兴趣的可以阅读我的文章《Web渗透测试——密码学基础》,其实和上边的语句一样,这样就可以避免domain被删除了。

以上就是跨站脚本(XSS)漏洞实战演示——由易到难第二部分的全部内容,希望对你了解XSS漏洞有所帮助,欢迎关注@科技兴了解更多科技尤其是网络安全方面的资讯和知识。

对于客户端,运行着 web 程序的服务器由于其拥有丰富的资源、对外公开的特性和复杂的业务逻辑对于黑客来说往往拥有更大的吸引力和攻破的可能性。

对于xss这一个漏洞十分感兴趣,或者出于各种各样的目的需要深入学习,其实绝大多数网络上博客、包括一些开源的工具,时效性较差,给初学者带来很多困扰和不必要的坑。 我仅以xss这个漏洞的名称来举例:本身这个漏洞的名字叫 corss site scripting 简写为css,但是之所以叫xss是因为css与web浏览器中解析的层叠样式表(css)重名,故取名xss。然而,cross site scripting 直译过来叫做跨站脚本攻击,其实这个名字本身也存在误导性。如今的web前端开发者应该都清楚,在现代浏览器的同源策略保护下,浏览器中的跨域行为受到了限制,并且其实从xss这个漏洞的攻击原理上讲,“跨站”这两个字其实真的没有什么必要。

请点击此处输入图片描述

跨站脚本攻击(XSS)

原理:

服务器没有对用户的输入做到充足的过滤,导致页面被嵌入恶意脚本

分类:

  • 反射型:只能通过用户点击恶意构造的链接才能触发攻击

  • 存储型:恶意代码保存在服务器,只要有人访问该页面就会触发攻击

效果:

  • 通过获取用户的 cookie,实现会话劫持

  • 通过在页面伪造表单,获取用户的账号密码

  • XSS 蠕虫

实现方式:

在可提交的输入框中构造输入,有时需要闭合引号,中括号等,有时需要对输入进行编码以绕过 WAF。

一般情况下,手动查找 XSS 注入点通常需要结合查看网页的源代码,找到自己的输入出现在了页面的哪个地方,然后根据该点附近的上下文构造恶意代码,比如,一个用 php 编写的页面为:

<? php $input=$_GET["param"]; echo "<div>".$input."</div>"; ?>

在正常情况下,用户的请求会在页面中显示出来。但是如果提供给 param 的参数是一段 HTML 代码,那么浏览器就会将它当做代码解析执行

值得注意的地方:

  • 有时 web 程序会用转义字符的方式转义特殊字符,然而,如果数据库使用的编码方式与 web 程序不同时,特别是数据库使用的是双字节字符编码,而负责过滤的 web 程序使用的是单字节字符编码,可能会导致过滤失败。例如,数据库使用了 GBK 编码,而 web 应用使用的是 ASCII 编码,当用户输入 0xbf27 时,由于 27 是单引号 ',web 程序会将其转义,变成 0xbf5c27,但是在数据库中,由于使用的是 GBK 编码,会将 bf5c 认为是一个字符,从而再次暴露了单引号 '

  • HTTP 参数污染有时可以绕过 WAF 的过滤

跨站请求伪造(CSRF)

原理:

由于

简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的

——维基百科

用户访问完某个网站之后,浏览器会在一定时间内保存这个网站产生的 cookie,如果在这个 cookie 的有效期内,攻击者可以利用浏览器再次访问网站时会自动带上 cookie 的特性伪造请求,实现了 CSRF

效果:

可以执行任意在用户的权限内的操作

实现方式:

在可跨域的标签如img、iframe中构造恶意 url,或构造使用 post 方法的表单并诱导用户访问该页面,即可实现攻击

总结针对 web 程序的攻击方式,这些方式造成的后果不一,小到会话劫持,大到直接拿到服务器的管理员权限,这完全取决于 web 程序的安全设置,但从根本上来说,这些安全问题都是可以彻底避免的。

经测试,发现 User ID 的输入框中存在反射型的 XSS 漏洞,在该输入框中构造输入:test" onmouseover=prompt(100) bad=',点击 Go 提交该输入后,在返回的页面中已被嵌入了恶意代码,当鼠标移动到 User ID 上后,会弹出一个提示框

请点击此处输入图片描述

XSS 后的页面

查看网页的源代码,可以发现 User ID 这个输入框确实被我们的输入控制了

XSS 后的页面和正常页面的源码比较

请点击此处输入图片描述

值得注意的地方

  • 如果在前端过滤用户输入的话,可以使用 Burp Suite 等工具绕过过滤

  • 设置 HttpOnly 可以禁止客户端的脚本访问 cookie,但是依然可以通过抓包的方式获取到 cookie

SQL 注入

原理:

服务器没有对用户的输入做到充分的过滤,导致可执行任意 SQL 语句

效果:

  • 如果当前用户具有对数据库的读权限,导致数据库信息泄露

  • 如果当前用户具有对数据库的读写权限,可对数据库进行任意修改

  • 如果当前用户具有对数据库的管理员权限,可对数据库的用户及数据库进行任意操作

对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做Fuzzing;同样是Fuzzing,有些人挖洞比较高效,有些人却不那么容易挖出漏洞,除了掌握的技术之外,比如编码的绕过处理等,还包含一些技巧性的东西,掌握一些技巧和规律,可以使得挖洞会更加从容。

Fuzzing(模糊测试)是挖掘漏洞最常用的手段之一,不止是XSS,应该可以说Fuzzing可以用于大部分类型的漏洞挖掘。通俗可以把这种方式理解为不断尝试的过程。黑客入门书籍《网络黑白》t宝有

网站指令码(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程式的安全漏洞攻击,是代码注入的一种。它允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了HTML以及使用者端脚本语言。

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。