遭遇XSS跨站脚本攻击?稳住,这些方法可保你渡劫附代码图解xsscookie

跨网站脚本(Cross-sitescripting,XSS)又称为跨站脚本攻击,是一种经常出现在Web应用程序的安全漏洞攻击,也是代码注入的一种。XSS是由于Web应用程序对用户的输入过滤不足而产生的,攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie窃取、会话劫持、钓鱼欺骗等各种攻击。这类攻击通常包含了HTML以及用户端脚本语言。

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

漏洞成因

如下图所示,在URL中将搜索关键字设置为JS代码,执行了alert()函数。该图中,上面有一个URL,下面是一个页面返回的HTML代码,我们可以看到白色部分HTML是我们事先定义好的,黑色部分参数是用户想搜索的关键词。当我们搜索了test+Div最后等于123,后台反馈页面的搜索引擎会告诉用户搜索了什么关键词,结果如何等等。

这个地方如果没有做好转移,可能会造成XSS跨站,我们可以看到蓝色部分是我们事先定义好的结构,被攻击者利用之后它先把这个DIV结束了,最后加上一个script标签,它也有可能不跟你谈标签,直接发送到它的服务器上。参数未经过安全过滤,然后恶意脚本被放到网页中执行,用户浏览的时候就会执行了这个脚本。

该漏洞存在的主要原因为:

2.XSS示例

作者接下来使用WAMP(Windows+Apache+MySQL+PHP)搭建PHP网站平台作,简单讲解两个常见案例。

示例1:GET提交

下面是一个简单的XSS漏洞代码(xss-01.php)。

echo"这是一个XSS漏洞攻击测试页面!";$xss=$_GET['x'];echo$xss;//JS代码:>

当输入正确的值时,网页能正常显示。

输出结果如下图所示:

而当我们输入JS脚本代码时,它会弹出相应的窗口,这就是一个XSS注入点。

示例2:POST提交

另一种常见的XSS上传漏洞代码如下所示:

index.html

XSS测试1请输入用户名:

xss.php

测试结果echo$_REQUEST['name'];>

输入正确的用户名如“eastmount”,仍然能正确显示。

而输入脚本代码时,它弹出了对应的脚本窗口,存在XSS注入漏洞。注意,这里采用的是POST方法提交数据,而前面采用的GET方法,其最主要的区别是GET方式的网址可以看到参数,而POST方式URL始终不变。

页面直接弹出了“1“”的窗口,可以看到,我们插入的语句已经被页面给执行了。这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是:前端–>后端–>前端。

3.XSS危害

XSS跨脚本攻击主要的危害如下:

XSS分类

XSS有部分书籍将它划分为两类——反射型和持久型。

反射型

也称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。一般出现在输入框、URL参数处。

持久型

1.反射型

下图是专门训练一些WEB漏洞的练习页面,我们可以输入自己的名字,输入之后会把我们的名字显示出来。例如我们输入了一个“张三”,这个时候弹出来了一个“123”,在那边显示了一个张三,但是script标签没有出来,因为这个标签被执行了。

示例:

这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是:前端–>后端–>前端。其代码案例如前面所述:

//前端页面index.htmlXSS测试1请输入用户名://后端页面xss.php$name=$_POST['name'];echo$name;>

当用户提交数据,输入代码会提交给后台,并弹出hack页面,这就表示我们的恶意语句被页面执行了。

2.存储型

在存储型XSS中,可以看到这个URL上面并没有代码,但是依然弹出了一个“1”。它是发现个人资料页的时候有一个XSS漏洞,在个性签名的位置填入了一个XSS标签,弹出了一个“1”,把这个地址发给别人,别人看到这个地址并没有什么代码以为这个页面是安全的,结果一打开就插入了这个XSS代码。

存储型XSS的攻击危害比较大,因为它的页面当中是看不到这个Script的代码,别人防不胜防。只要管理员没有发现,下一个用户或者下一个用户一直接发它,而反射型需要用户主动点击的。

假设现在存在一个index2.html代码,用户提交ID和用户名并存储至数据库中。

XSS测试2欢迎大家阅读CSDNEastmount的博客,一起进步,一起加油喔!请输入用户名:ID:Name:

后台的xss2.php将执行数据库存储操作,本地MySQL数据库创建一个名为XSSDB的数据库,并插入一张XSS表,如下图所示。

xss2.php代码如下所示:

//获取提交的表单值$id=$_POST["id"];$name=$_POST["name"];echo$id,'';echo$name,'';//连接数据库//因为PHP版本是7.3的,因此用mysqli_connect()而不是用mysql_connect()$con=mysqli_connect("localhost","root","123456","xssdb");if(!$con){die('Couldnotconnectdatabase:'.mysqli_error());}//插入数据表$sql="insertintoxss(id,name)values('{$id}','{$name}');";echo$sql;$result

此时另一个页面select.php负责提供给其他用户访问,则可以看到我们的信息。

$id=$_GET['id'];//链接数据库$con=mysqli_connect("localhost","root","123456","xssdb");//查询数据$sql="select*fromxsswhereid='{$id}';";$result=mysqli_query($con,$sql);//$data=mysqli_fetch_all($result);//从结果集中获取所有数据//print_r($data);while($row=mysqli_fetch_assoc($result)){echo$row['name'];}>

当我们输入正确的值,如下图所示:

id:1name:yangxiuzhang

此时数据库中可以看到我们插入的值。

通过本地网址(localhost:8088/xss/select.phpid=1)我们能获取id为1对应的name值。

当我们输入JS代码时,该程序又将如何运行呢?接着我们插入如下数据:

id:2name:

注意,这里的hack的单引号要进行转义,因为sql语句中的$name是单引号的,所以这里不转义的话就会闭合sql语句中的单引号,不然注入不进去。

原理:用户提交数据到后端,后端存储至数据库中,然后当其他用户访问查询页面时,后端调出数据库中的数据,显示给另一个用户,此时的XSS代码就被执行了。

此时数据库插入的内容如下所示,可以看到JS代码已经成功插入我们的后台。

最后,我们调用select.php(localhost:8088/xss/select.phpid=2)页面,可以看到成功执行了该脚本文件。存储型XSS的数据流向为:前端–>后端–>数据库–>后端–>前端。

3.DOM型

首先,什么是DOM呢?

DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。

DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。

其次,什么优势DOM-XSS呢?

DOM-XSS漏洞是基于文档对象模型(DocumentObjeetModel,DOM)的一种漏洞,不经过后端,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

DOM型的XSS是一些有安全意识的开发者弄出来的,比如说接受参数会做一些过滤,把一些字符转义一下,但是转义之后依然会存在着XSS的情况。常见可能触发DOM-XSS的属性包括:document.referer、window.name、location、innerHTML、documen.write等。

如下图所示,我们上面输入的可以看到这行代码规律,把这个大括号、小括号以及双页号进行转移,按理说转移之后它应该不会再作为它的标签存在,不会存在XSS的代码。

下面Script通过ID获得的这个值,复制到了这个DIV上,经过DOM操作之后,之前转义的字符就变为它的标签,所以经过DOM操作的XSS我们称之为DOMXSS。它有可能通过URL传播,也有可能通过服务器传播。

最后,DOM型跨站脚本的攻击是如何实现呢?

下面简单讲解一个DOM-XSS代码,假设前端是一个index3.html页面。

DOM-XSS测试3欢迎大家阅读CSDNEastmount的博客,一起进步,一起加油喔!请输入用户名:

接着设置后台页面,xss3.php用于获取提交的值并显示其在页面中。注意,代码是获取username中的值,然后显示在print内,这也是导致XSS的原因。

//获取提交的表单值$name=$_POST["name"];>

此时,当我们输入正常的参数,它显示的结果如下图所示,是正常显示的。

而当我们输入恶意代码的时候,比如提交给后台,它会执行我们的JS代码,弹出hack的窗体。从而证明了DOM-XXSS是存在的。

DOM型跨站脚本漏洞的数据流向是:前端->浏览器。

XSS构造及漏洞利用

1.XSS构造

在进行SQL注入中,我们可以设置相应的过滤函数防止,比如防止万能密码(‘or’='or’或admin),也能调用preg_replace()函数将特色字符过滤。同样,XSS攻击代码也可能会被过滤,如下所示,它将进行了过滤。

$name=$_POST["name"];if($name!=null){//过滤$name=preg_replace("/

2)利用HTML标签属性值执行XSS

通过javascript:[code]伪协议形式编写恶意脚本常用案例:

3)空格回车Tab绕过过滤

注意javas和cript之间的间隔不是由空格键添加的,而是用Tab键添加的。使用回车分隔:cript:alert(/xss/)"width=100>

4)对标签属性值进行转码

替换成:其中,t的ASCII码值为116,用”t”表示,:则表示:。再进一步替换:

5)产生事件如click、mouseover、load等

W3C(万维网联盟)将事件分为3种不同的类别:

6)利用CSS跨站过滤

常见示例如下所示:

7)扰乱XSS过滤规则

一个正常的XSS输入:转换大小写后的XSS:大小写混淆的XSS:不用双引号,而是使用单引号的XSS:不适用引号的XSS:不需要空格的XSS:构造不同的全角字符:

利用注释符

\和\0–CSS关键字转码

8)利用字符编码

原始语句:十进制编码src="javascript:alert('xss');">src="javascript:alert('xss');">src="javasc4ipt:alert('xss0039);">十六进制编码src="javascript:alert('xss');">

9)利用字符编码eval()函数、eval()和string.fromCharCode()函数过滤

src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">

2.挖掘其他XSS漏洞

其他恶意攻击包括黑盒攻击测试、源代码审计、FlashXSS等。

1)黑盒攻击测试

AcunetixWebVulnerabilityScanner是一款商业级的web漏洞扫描程序,它的功能非常强大,可以自动化检查各种web应用漏洞,包括XSS、SQL注入、代码执行、目录遍历、网站源代码暴力等。

黑盒攻击测试手工检测XSS代码常见用法包括:

2)源码审计

顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

例如,PHP全局变量如下所示:

3)FlashXSS

关于Flash的跨站漏洞其实很早就出现了。Flash的安全漏洞也不仅仅只有XSS,还有CSRF、跨域、代码执行等其他安全问题。Flash中编程使用的是ActionScript脚本,Flash产生的xss问题主要有两种方式:加载第三方资源和与javascript通信引发XSS。

如何防御XSS

由于XSS通常可以插入在script标签、HTML注释、标签属性名、标签属性值、标签名字、CSS等中,所以接下来我们简单讲讲如何防御XSS攻击。

1.输入过滤

输入正确和错误分别提示。

输入验证要根据实际情况设计,下面是一些常见的检测和过滤:

2.输出编码

大多数的Web应用程序都存在一个通病,就是会把用户输入的信息完完整整的输出在页面中,这样很容易便会产生一个XSS。HTML编码在防止XSS攻击上起到很大的作用,它主要是用对应的HTML实体编号替代字面量字符,这样做可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。

3.标签黑白名单过滤

有时根本就不需要考虑到它是不是HTML标签,我们根本用不到HTML标签。不管是采用输入过滤还是输出过滤,都是针对数据信息进行黑/白名单式的过滤。

不同的javascript写法包括:

大小写混淆:插入[tab]键;插入回车符:asrcipt:alert(‘xss’);”>使用/**/注释符:重复混淆关键字:使用&#十六进制编码字符:使用&#十进制编码字符:使用&#十进制编码字符(加入大量的0000):在开头插入空格:

黑名单:

过滤可能造成危害的符号及标签,发现使用者输入参数的值为就将其取代为空白。其优点是可以允许开发某些特殊HTML标签,确实是可能因过滤不干净而使攻击者绕过规则。

4.代码实体转义

由于只保留文字部分是一劳永逸的,有时我们还需要展示这个标签,比如说程序论坛当中要贴一个代码,这个时候我们需要用一些转义,它会把这个大括号、小括号以及双引号做一个转义,做为一个字符,就无法执行这个标签型,后面加一个参数,但有时候单引号也会造成XSS。

比如说张三在我们网站上登陆了一下用户名,李四他特意发了一个攻击请求,他拿不到这个用户ID,就冒充不了这个张三。如果在Cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到Cookie信息,这样能有效的防止XSS攻击。

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

THE END
1.渗透测试基础反射型XSS原理及实操xss反射型渗透测试基础-反射型XSS原理及实操 只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力! XSS是什么 因为人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,将跨站脚本攻击缩写https://blog.csdn.net/2401_84618514/article/details/140765842
2.基于XSS漏洞的网站安全检测技术研究天翼云开发者社区存储型XSS漏洞:攻击者提交的恶意脚本被存储在服务器端,当其他用户访问包含恶意脚本的内容时,脚本会被执行。这种攻击方式常见于论坛、博客、留言板等用户生成内容的网站。 反射型XSS漏洞:攻击者提交的恶意脚本被作为响应内容返回给浏览器,浏览器解析并执行恶意脚本。这种攻击方式通常通过URL参数、表单提交等方式触发。 https://www.ctyun.cn/developer/article/622008135557189
3.Web安全:XSS防护实战指南反射型XSS攻击是将恶意脚本作为输入提交给服务器,服务器将输入的内容反射给用户,并在网页中执行。攻击的触发需要引导用户点击一个特制的URL。 型XSS 型XSS攻击是指网页的DOM结构被恶意修改,从而引发漏洞。这种漏洞属于前端JavaScript代码的漏洞,难以被传统的服务器端防火墙检测到。 https://www.jianshu.com/p/e41d03e82780
4.新人必看!关于dom型xss和反射型xss的区别关于dom型xss和反射型xss的区别 无偿领取网络安全入门到进阶学习籽料 可点击这个链接:瓜子:零基础学网络安全有什么建议?如何入门?——来自一位年薪80W的网工倾情讲解 前言 xss漏洞的原理其实很简单,类型也分为三类,反射型、储存型和dom型。但是刚接触xss的时候我根本不理解什么是dom型xss,无法区分反射型和dom型,https://zhuanlan.zhihu.com/p/607996266
5.反射型xss和存储型xss的区别4.2 脚本存储位置:反射型XSS的恶意脚本并不会永久存储在服务器上,它是在服务器响应中动态生成的。而存储型XSS攻击将恶意脚本或HTML代码永久地注入到服务器的数据库或文件系统中。 4.3 影响范围:反射型XSS通常只对点击恶意链接的用户造成影响,并且仅限于单个请求和响应过程。存储型XSS攻击则可以影响到所有访问受影响页https://www.eefocus.com/e/1652644.html
6.跨站脚本攻击XSS与CSRF区别方法详解安全相关原理不同,CSRF利用的是网站本身的漏洞来去攻击,而XSS则是将攻击代码插入网站中来进行攻击。 TWO 利用环境不同, CSRF攻击中需要受害者登录网站,网站有认证信息才能攻击,而XSS不用。 XSS攻击方法 首先XSS有三种攻击方式: 反射型xss:不会永久存储用户的数据,仅发生在用户的一次访问之后。 存储型xss:攻击代码被持久化https://www.jb51.net/article/264658.htm
7.50个渗透(黑客)常用名词及解释新疆大学反射型XSS(Cross-Site Scripting)是一种常见的XSS攻击类型。攻击者通过构造特制的恶意链接,诱使用户点击并触发漏洞,使恶意脚本在受害者的浏览器中执行,从而窃取用户数据或进行其他恶意操作。与存储型XSS不同,反射型XSS的恶意脚本不会永久存储在目标网站上。 https://net.xju.edu.cn/info/1021/1428.htm
8.代码审计之旅当我们想挖掘这类漏洞时,需要重点关注程序的输出,比如echo/print等,当程序直接将未经过滤的用户输入输出除了,就会造成反射型XSS。 而这类漏洞我挖的最多的情况是: echo $_GET['callback'].(); 也就是JSONP处,其实大多数反射型的XSS都一样,在PHP中一般都是使用echo这类代码将输入直接输出出来。 https://xz.aliyun.com/t/5877
9.XSS漏洞理由(二)反射型胡椒猪猪的技术博客用户访问网页中的XSS链接,服务器接受并返回,用户执行反射回来的代码并解析执行 反射型XSS公鸡是一种常见的Web安全漏洞,公鸡者通过构造恶意的URL参数,将恶意脚本注入到目标网页中,当用户点击包含恶意参数的链接时,恶意脚本会被执行,从而导致公鸡者能够获取用户的敏感信息或进行其他恶意操作。 https://blog.51cto.com/zhuzhuxia/9993771
10.[Security]WEB安全(一)之图解XSS注入腾讯云开发者社区XSS 攻击 xxs 攻击英文全称是 Croess SiteScripting ,意思就是跨站脚本攻击。是一种网站应用程序的安全漏洞攻击。是脚本代码注入的一种。其核心的攻击原理就是注入有攻击行为的脚本代码,通过浏览器的执行从而完成攻击行为。 XSS 攻击类型 他的攻击方法主要分为 3 类,分别是 反射型 XSS,存储型 XSS和基于的 DOM 的https://cloud.tencent.com/developer/article/1812929
11.缺陷周话第10期:反射型XSS安全客反射型 XSS 是指应用程序通过 Web 请求获取不可信赖的数据,在未检验数据是否存在恶意代码的情况下,便将其传送给了 Web 用户。反射型 XSS 一般由攻击者构造带有恶意代码参数的 URL,当 URL 地址被打开时,特有的恶意代码参数被 HTML 解析、执行,它的特点是非持久化,必须用户点击带有特定参数的链接才能引起。本文以https://www.anquanke.com/post/id/164640