CORS结合XSS利用 2023-02-21 17:42:41 所属地 四川省 ![](https://image.3001.net/images/20240308/1709876354_65eaa4828e91d155430d9.png) 本文由 创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载 ### 引言 这两个漏洞想必大家都有过了解,但是对于结合使用方面或许有些不清楚的点,我总结归纳了利用方法和原理。 关于这两个漏洞的结合使用,首先需要搭建环境。 这里以pikachu靶场为例子,这里以[http://www.test.com/pikachu/vul/infoleak/abc.php](http://www.test.com/pikachu/vul/infoleak/abc.php)登陆后的页面假设为敏感页面 ![image](https://image.3001.net/images/20230221/1676970441_63f489c9b9faeed27ed1b.jpg) 对页面进行配置,添加CORS跨域的配置,这里配置从request中获取Origin为可信任的域 if (isset($_SERVER['HTTP_ORIGIN'])) { header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); //header("Access-Control-Allow-Origin: www.test.com"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } ![image](https://image.3001.net/images/20230221/1676970461_63f489dd765caa6cab093.jpg) 完成存在CORS漏洞的配置,测试存在CORS漏洞 ![image](https://image.3001.net/images/20230221/1676970472_63f489e88b10b37a97ad6.jpg) 这里都看不懂的可以去看看[这个](https://www.cnblogs.com/byErichas/p/15918919.html) #### CORS 利用POC 一个能用的CORS POC cors.html CORS
cors proof-of-concept:


测试一下,可以成功获取html页面信息 ![image](https://image.3001.net/images/20230221/1676970508_63f48a0cb5ca03a8d0558.jpg) 搭建在服务器上看看,同样能够成功。(这里就没贴图了) #### CORS结合XSS ok这里利用XSS来把payload部分替换,实际利用中是存储型的,原理上dom也可以,这里展示dom型的 URL编码后访问 ![image](https://image.3001.net/images/20230221/1676970670_63f48aae75a05dad68a7f.jpg) CORS利用进阶 上面的操作都是直接在本地的,是为了熟悉原理。 实战中结合利用应该是用服务器搭建一个恶意页面E,用XSS触发去访问这个页面E,再通过这个恶意页面E去访问敏感信息页面C,把敏感信息发送的到服务器,完成攻击。其中也能获取cookie,但有时候能否成功还受到浏览器同源策略的影响。 > 这里补充一个Tips: 在谷歌浏览器中我曾看看有一个Secure属性,目前默认都是开启的 ![image.png](https://image.3001.net/images/20230221/1676971473_63f48dd13639ea1a2b99d.png) 在setSecure(true); 的情况下,只有https才传递到服务器端。http是不会传递的。所以有时候cookie不传递和浏览器也有很大关系。 具体要视情况来分析。 接着说 这里实现了把敏感数据发送到服务器上,HTML的代码不懂的可以去看看: 参考[Ajax用法](https://www.cnblogs.com/chenchaochao034/p/10991292.html) corspro.html
这个方法有个问题就是获取信息过长,就会读取不到,这是一个坑点。 ![image](https://image.3001.net/images/20230221/1676970888_63f48b883e2541138a9e5.png) 改成短一些的信息,比如cookie,就成功读取到了 ![image](https://image.3001.net/images/20230221/1676970895_63f48b8f86335eb5805c8.jpg) **优化方案** 想要获取更多的数据,怎么办? 换一种方法,把读取到的html给直接写入到文件中保存 evil.html

Hello I evil page.

save.php //把通过evil.html获取到的页面数据写入到get_data。html中去 $myfile = fopen("get_data.html", "w") or die("Unable to open file!"); $txt = $_POST['msf']; fwrite($myfile, $txt); fclose($myfile); ?> 成功保存文件,不过编码有点问题,这里的汉字都被转换成了unicode编码,需要去转换一下编码 ![image](https://image.3001.net/images/20230221/1676970947_63f48bc36fdf7e3bbd233.jpg) CrossSiteContentHijacking 这里用一个叫做[CrossSiteContentHijacking](https://github.com/nccgroup/CrossSiteContentHijacking)的项目来测试,多了一种检测的方法 用服务器搭建好这个项目,然后在www.test.com所在浏览器打开 选择target 和type,然后点Retrieve Contents ![image](https://image.3001.net/images/20230221/1676971004_63f48bfc74b1280ea533e.png) 证明能成功的跨域访问到 ![image](https://image.3001.net/images/20230221/1676971019_63f48c0b6ed17c5725d39.png) #### 小结思考 如果修改CORS配置,设置成www.test.com才能访问跨域资源 ![image](https://image.3001.net/images/20230221/1676971039_63f48c1f7851eea6991e6.jpg) 然后就不能访问了,当然前面的`cors.html`的poc也是同理不能用了 ![image](https://image.3001.net/images/20230221/1676971048_63f48c2891a510aecd2df.png) 必须来自于Origin:www.test.com才可以。 所以不安全CORS配置,还是存在一定的安全隐患。 \# 渗透测试 \# 网络安全 \# web安全