SSRF题目进阶+SSRF正则绕过+进制绕过SSRF限制

8 篇文章 0 订阅
7 篇文章 0 订阅

[题目信息]:

题目名称题目难度
SSRF题目进阶3

[题目考点]:

SSRF绕过

[Flag格式]:

SangFor{h3bvbopR6L2EQOXv}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

1、实验主页

2、可以判断该题目为代码审计题目

 <?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”;
}

3、通读代码

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!输出到网页上。

4、代码分析

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的第二个参数,获取服务器的权限。

8、payload

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

9、PS:

由于存在两次请求,第一次为我们的物理机访问服务器靶机,第二次为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]:

实验主页

uploading.4e448015.gif

正在上传…重新上传取消

2、使用dirsearch扫描网站目录

python dirsearch.py -u http://192.168.0.193:2002/ -e php -t 20

3、扫描到文件flag.php,访问flag.php文件

4、提示仅可以本地访问

5、按照提示,尝试在网页输入框内输入深信服官网地址

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

6、返回结果为html实体编码,将返回结果复制,并保存在.html后缀的文件当中

uploading.4e448015.gif

正在上传…重新上传取消

7、可以看到题目的源代码

8、其中有一个关键函数parse_url()

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命令解析,解析@后域名

9、parse_url解析

10、通过解析方式的不同,构造如下payload








[题目信息]:

题目名称题目难度
进制绕过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内容仅本地用户允许访问,因此在网页的输入框内输入:

8、提示禁止

9、尝试使用其他协议

10、提示仅可以使用http或者https协议

11、根据上述结果显示,可以初步判断,允许使用http或者https协议,但是不允许使用localhost,尝试使用127.0.0.1访问

12、同样不允许,尝试换成8进制访问

13、换成8进制时在177前需要加0,0177表示为8进制

uploading.4e448015.gif

正在上传…重新上传取消

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值