目录
考点
主要就是redis未授权访问
源码
<?php
highlight_file(__file__);
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
echo curl_exec($ch);
curl_close($ch);
}
if(isset($_GET['url'])){
$url = $_GET['url'];
if(preg_match('/file\:\/\/|dict\:\/\/|\.\.\/|127.0.0.1|localhost/is', $url,$match))
{
die('No, No, No!');
}
curl($url);
}
if(isset($_GET['info'])){
phpinfo();
}
?>
解题步骤
1.将web-ssrfme.zip解压缩在Ubuntu下
Docker-compose up -d
更新后的镜像重新启动容器
2.拉取成功ssrfme镜像
3.使用端口访问文件
可以看到有一个过滤条件,它限制了file,dict协议,127.0.0.1和localhost 也不能用,其实就是不想你探测内网端口,也不能读取内网服务文件。
但是!它可以通过phpinfo了条件。
给info随便赋一个值,出来了php界面,可以观察到hostname主机和端口,而172.21.0.3是可以绕过127.0.0.1这个条件,我们可以在这个地址上测试,不断的改变端口值,端口不一样,出来的值也会有所区别
当端口为6379的时候,没有任何区别
因为一直这样试很费时间,所以使用burpsuite去检测端口
设置检测端口1-1000
只开放了一个80端口,也没有数据库,如果按172.21.0.3路径一直找端口,肯定是不行的
所以可以想一想,可能有时候会不只开了一个服务器
4.扫描附近可能的服务器
0.3和0.4都访问没有什么变化
只有0.2可以,所以可以把关注点放在0.2的服务器
5.使用buresuite继续抓包
这时发现开放了6379和80端口
6.猜想它可能存在得物理
位置端口发现了,现在要想可能存放的物理地方,一般会考虑会在/var/www/html/
发现upload有可执行权限,可以通过这个目录去访问。
但是在真实比赛中,很难知道文件名,可以使用字典去试
然后加载在路径下,判断长度是否一致,如果一致,说明就有这个文件
获取到shell后,传递到路径里
7.进行多次解码
再进行二次编码
再执行过程中,创建了一个shell.php