这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。前文分享了Python弱口令攻击、自定义字典生成,并构建了Web目录扫描器;本文将详细讲解XSS跨站脚本攻击,从原理、示例、危害到三种常见类型(反射型、存储型、DOM型),并结合代码示例进行详细讲解,最后分享了如何预防XSS攻击。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的编程经验进行讲解。
作者作为网络安全的小白,分享一些自学基础教程给大家,希望你们喜欢。同时,更希望你能与我一起操作深入进步,后续也将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不容易,大神请飘过,不喜勿喷,谢谢!
下载地址:https://github.com/eastmountyxz/NetworkSecuritySelf-study
百度网盘:https://pan.baidu.com/s/1dsunH8EmOB_tlHYXXguOeA 提取码:izeb
前文学习:
[网络安全自学篇] 一.入门笔记之看雪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代理池(四)
前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差异备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包
参考文献的书籍和文章都比较好,他们都是网络安全大牛和大佬的成果,强烈推荐博友们阅读,也参考了较少的图片,如侵立删。
《安全之路Web渗透技术及实战案例解析》陈小兵老师
《XSS跨站脚本攻击剖析与防御》 邱永华老师
《TCP/IP协议栈详解卷一》 W.Richard Stevens
江苏君立华域公司的XSS普及PPT
2019 Python黑客编程:安全工具开发 - bilibili 白帽黑客教程
XSS(跨站脚本攻击)详解 - CSDN谢公子大佬(推荐)
Bilibili 2018小迪老师渗透专题视频 XSS跨站(推荐)
安全客 测试WAF来学习XSS姿势 - 誮訫尐羅卟老师系列
看雪论坛文章:
浅析WEB安全编程:https://bbs.pediy.com/thread-222922.htm
XSS跨站总结:https://bbs.pediy.com/thread-196518.htm
勒索病毒WannaCry深度技术分析:https://bbs.pediy.com/thread-217662.htm
Web基础设施知识及安全攻防:https://bbs.pediy.com/thread-199199.htm
内网渗透小记:https://bbs.pediy.com/thread-192778.htm
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。
跨网站脚本(Cross-site scripting,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标签,它也有可能不跟你谈标签,直接发送到它的服务器上。参数未经过安全过滤,然后恶意脚本被放到网页中执行,用户浏览的时候就会执行了这个脚本。
该漏洞存在的主要原因为:
作者接下来使用WAMP(Windows+Apache+MySQL+PHP)搭建PHP网站平台作,简单讲解两个常见案例。
示例1:GET提交
下面是一个简单的XSS漏洞代码(xss-01.php)。
echo "这是一个XSS漏洞攻击测试页面!
";
$xss = $_GET['x'];
echo $xss;
//JS代码:
?>
当输入正确的值时,网页能正常显示。
http://localhost/xss/xss-01.php?x=122
输出结果如下图所示:
而当我们输入JS脚本代码时,它会弹出相应的窗口,这就是一个XSS注入点。
http://localhost/xss/xss-01.php?x=<script>alert(1)script>
示例2:POST提交
另一种常见的XSS上传漏洞代码如下所示:
index.html
<html>
<head><title>XSS测试1title>head>
<body>
<form action='xss.php' method="get">
请输入用户名:<br>
<input type="text" name="name" value="" />
<input type="submit" name="提交" />
form>
body>
html>
xss.php
<html>
<head>
<title>测试结果</title>
</head>
<body>
echo $_REQUEST['name'];
?>
</body>
</html>
输入正确的用户名如“eastmount”,仍然能正确显示。
而输入脚本代码 < script>alert(1)< /script> 时,它弹出了对应的脚本窗口,存在XSS注入漏洞。注意,这里采用的是POST方法提交数据,而前面采用的GET方法,其最主要的区别是GET方式的网址可以看到参数,而POST方式URL始终不变。
页面直接弹出了“1“”的窗口,可以看到,我们插入的语句已经被页面给执行了。这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是: 前端–>后端–>前端。
XSS跨脚本攻击主要的危害如下:
PS:上面涉及的很多内容,作者会进一步学习,并分享相关的内容,一起进步 ,一起加油!
XSS有部分书籍将它划分为两类——反射型和持久型。
反射型
也称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。一般出现在输入框、URL参数处。
持久型
持久型跨站脚本也可以说是存储型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全。一般出现在网站的留言、评论、博客日志等于用户交互处。
而另一部分书籍将XSS分为三种类型——反射型、存储型以及DOM型,这也是本篇文章重点讲解的分类方式。
反射型又称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。它需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面、输入框、URL参数处。反射型XSS大多数是用来盗取用户的Cookie信息。其攻击流程如下图所示:(该图片源自谢公子文章)
下图是专门训练一些WEB漏洞的练习页面,我们可以输入自己的名字,输入之后会把我们的名字显示出来。例如我们输入了一个“张三”,这个时候弹出来了一个“123”,在那边显示了一个张三,但是script标签没有出来,因为这个标签被执行了。
示例:
这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是: 前端–>后端–>前端。其代码案例如前面所述:
//前端页面 index.html
<html>
<head><title>XSS测试1title>head>
<body>
<form action='xss.php' method="get">
请输入用户名:<br>
<input type="text" name="name" value="" />
<input type="submit" name="提交" />
form>
body>
html>
//后端页面 xss.php
当用户提交数据,输入 < script>alert(‘hack’)< /script> 代码会提交给后台,并弹出hack页面,这就表示我们的恶意语句被页面执行了。
存储型XSS又称为持久型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全。它的代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。存储型XSS一般出现在、评论、博客日志等于用户交互处,这种XSS比较危险,容易造成蠕虫、盗窃cookie等。其攻击流程如下图所示:(该图片源自谢公子文章)
在存储型XSS中,可以看到这个URL上面并没有代码,但是依然弹出了一个“1”。它是发现个人资料页的时候有一个XSS漏洞,在个性签名的位置填入了一个XSS标签,弹出了一个“1”,把这个地址发给别人,别人看到这个地址并没有什么代码以为这个页面是安全的,结果一打开就插入了这个XSS代码。
存储型XSS的攻击危害比较大,因为它的页面当中是看不到这个Script的代码,别人防不胜防。只要管理员没有发现,下一个用户或者下一个用户一直接发它,而反射型需要用户主动点击的。
示例:
假设现在存在一个 index2.html 代码,用户提交ID和用户名并存储至数据库中。
<html>
<head><title>XSS测试2title>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 将执行数据库存储操作,本地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('Could not connect database: ' . mysqli_error());
}
//插入数据表
$sql = "insert into xss (id,name) values ('{$id}','{$name}');";
echo $sql;
$result
此时另一个页面 select.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的数据流向为:前端–>后端–>数据库–>后端–>前端。
首先,什么是DOM呢?
DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。
DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。
其次,什么优势DOM-XSS呢?
DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,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页面。
<html>
<head><title>DOM-XSS测试3title>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的原因。
//获取提交的表单值
$name=$_POST["name"];
?>
<input id="username" type="text" value="$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>
此时,当我们输入正常的参数,它显示的结果如下图所示,是正常显示的。
而当我们输入恶意代码的时候,比如提交 给后台,它会执行我们的JS代码,弹出hack的窗体。从而证明了DOM-XXSS是存在的。
DOM型跨站脚本漏洞的数据流向是:前端->浏览器。
在进行SQL注入中,我们可以设置相应的过滤函数防止,比如防止万能密码(‘or’='or’或admin),也能调用preg_replace()函数将特色字符过滤。同样,XSS攻击代码也可能会被过滤,如下所示,它将< script>和 < /script>进行了过滤。
$name=$_POST["name"];
if($name!=null){
//过滤
$name=preg_replace("/