概念:服务端请求伪造攻击(Server-side Request Forgery):很多web应用都提供了从其他的服务器上获取数据的功能。比如获取图片、下载文件、读取文件内容等。SSRF漏洞是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制 导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
即:利用一个可以发起网络请求的服务,当作跳板来攻击其他服务。
ctfhub:
内网访问
csdn上看了一篇大佬的文章,感觉挺通俗易懂。我就简单复述一下,加深一下印象。
首先需要了解一下公有ip和私有ip
公有ip:公有ip是全球唯一的,需要注册才能使用。而且是可以直接上网的。
私有ip:私有ip不需要注册,因此,他不能直接上网。我们平时上网一般都是通过网络运营商(移动,联通,电信)。原理就是这些个运营商呀,他们是购买了公有ip的。然后他们分配给我们这些用户,我们使用的就是私有ip,或者叫局域网。这样的话,就会导致你和你周围的邻居们分出来的私有ip可能是一样的。 这样的好处是我们大家都可以方便的上网,当然也有不利之处,那就是两家相同私有ip同时访问百度页面,这个百度的服务器怎么分辨这两家分别是谁呢。这个就要用到另外一个东西:端口映射。
这里我直接贴上端口映射的概念,
对于这个概念,我个人的理解就是外网的ip地址的一个端口与内网的一个端口实现对应。
我们平时经过路由器,通过宽带,最终去到运营商那边,数据是从运营商出去,最终数据是回到运营商那边,运营商再把数据发送到用户的电脑。
路由器,至少有两个端口:WAN 口和 LAN 口。
WAN:接外部 IP 地址用,通常指的是出口,转发来自内部 LAN 接口的 IP 数据包,这个口的 IP 是唯一的。
LAN:接内部 IP 地址用,LAN 内部是交换机。
正在上传…重新上传取消、
A 电脑的 IP 是局域网 IP(192.168.31.11),这个 IP(192.168.31.11)是从路由器的 lan口分配的。
当我们上百度的时候,经过路由器的 wan口,进行相应的IP、端口转化:192.168.31.11:80 -> 10.221.0.24:8080,所以,从 wan口出去的地址为:10.221.0.24:8080。
最后,经过运营商,运营商那边会做相应的端口映射(而且是动态端口映射),子网 IP(10.221.0.24:8080)转化为公网IP(128.0.0.1:8888),通过这个公网 IP 去访问百度服务器
这位博主贴的图也是非常的形象,上面也有子昂将详细的介绍。简单来说,就是左下角和右下角两个ip地址对应的都是用户的私有ip,然后通过LAN将子网进行转换。然后再通过lan口将子网转为公网。
这个题非常简单,直接url后面加上127.0.0.1/flag.php,就出来了。。。
下个题:伪协议读取文件。先搜一下关于这个的相关知识,太菜了,对这个毫无了解。
下面这个图感觉还不戳。
1.php://协议
条件:
allow_url_fopen:off/on
allow_url_include :仅php://input php://stdin php://memory php://temp 需要on
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。
说明
PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符,
内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
2.php://filter伪协议
条件
allow_url_fopen=on/off
allow_url_include=on/off
只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include
说明:
元封装器,设计用于"数据流打开”时的"筛选过滤”应用,对本地磁盘文件进行读写
①输出进行base64加密后的信息
?file=php://filter/convert.base64-encode/resource=xx.php
或
?file=php://filter/read=convert.base64-encode/resource=xx.php
②获得将base64加密后的信息后,再将其解密,得出原信息
3.php://input(读取POST数据)
条件
allow_url_fopen=on/off
allow_url_include=on
说明
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的
注 :查看当前运行的是哪个php.ini
2,3需要将php可执行加入环境变量, 如果没有加,那么请使用php可执行文件所在位置的完整路径代替
打印出phpinfo();,找到Loaded Configuration File那一行
在这里插入图片描述
命令行输入php -i |grep php.ini(php -i其实就是输出phpinfo();)
php -r “phpinfo();” |grep php.ini
4.file://伪协议(读取文件内容)
条件
allow_url_fopen=on/off
allow_url_include=on/off (均不受影响)
打ctf中常用于读取本地文件
?file=file://C:\Windows\System32\drivers\etc\hosts
5.phar://伪协议(读取压缩包文件内容)
条件
allow_url_fopen: off/on
allow_url_include: off/on (均不受影响)
注:php 版本大于等于5.3.0,压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。
格式
1.?file=phar://压缩包名/内部文件名
2.例:phar://x.zip/x.php6.zip://伪协议
6.zip://伪协议
zip伪协议和phar协议类似,但是用法不一样(url不同)
- 条件
allow_url_fopen: off/on
allow_url_include: off/on (均不受影响)
格式
1.?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
2. 例: zip://D:\phpstudy\WWW\x.zip%23shell.php #->%23
7.data://伪协议(读取文件)
(可以直接达到执行php代码的效果)
和php://input很像,php://input以post提交数据那样提交数据,
data://是以get方式提交数据,也是可以执行提交的脚本
- 格式
- ?file=data://text/plain,<?php%20phpinfo()?>
如果对特殊字符进行了过滤,可以通过base64编码后再输入
data://text/plain;base64,base64加密的代码
可配合php命令执行漏洞,实现对一些数据的获取
如:<?php system("ls")?>
一般网站的目录都放在www/html/目录下,使用file:///var/www/html/flag.php查看一下
页面上只有三个问号,查看源码得到flag.
端口扫描
这个题的话,我一开始就在网上找的那个在线端口扫描网站,结果屁也没扫出来。然后万不得已,值得看一下wp(手动狗头)原来这个题是用burpsuite抓包
然后send to intruder
然后看大佬说就开始爆破,但不知道我的bp为啥不行,所以现在是