前言
重学Top10的第二篇,希望各位大佬不要见笑。
SSRF原理
SSRF又叫服务端请求伪造,是一种由服务端发起的恶意请求,SSRF发生在应用程序允许攻击者诱使服务器向任意域或资源发送未经授权的请求时。服务器充当代理,执行攻击者构造的恶意请求,可能导致内部系统暴露或敏感数据泄露。
举个例子,比如这里的百度图片可以通过输入的图片的链接去获取相对应图片,那么假如我把图片链接换成http:\\127.0.0.1:80那么服务器就是去请求它本地的80端口,简单来说有一些网站功能可以去访问指定ULR的资源,而这些URL一旦变成内网地址或者本地地址,从而可以进行本地或者内网服务探测,这就是SSRF漏洞。
这里是我本地写的一个远程图片加载器,可以通过图片地址加载图片。
然后把图片地址换为http:127.0.0.1:80可以看到是能成功探取到80端口的服务的,因为我80端口没有部署东西,所以显示403了。
常见伪协议
http:// Web常见访问,如http://127.0.0.1、http://127.0.0.1:8080等
file:/// 从文件系统中获取文件内容,如,file:///etc/passwd、file:///D:/1.txt
dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6379/info
sftp:// SSH文件传输协议或安全文件传输协议
ldap:// 轻量级目录访问协议
tftp:// 简单文件传输协议
gopher:// (常用)分布式文档传递服务,可使用gopherus生成payload 有部分服务是http协议不支持通讯的,那么可以用gopher来进行通讯(如mysql,redis服务等)应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus
SSRF绕过
-限制为必须有http://www.xxx.com 域名
采用http基本身份认证的方式绕过,即@
http://www.xxx.com@www.xxyy.com
-限制请求IP不为内网地址
当不允许ip为内网地址时:
(1)采取短网址绕过 (2)采取域名解析
(3)采取进制转换
(4)采取3XX重定向
白盒审计
我们来看一下CTF中这种白盒审计中,怎么利用以及绕过呢。
第一题没啥过滤,直接读取即可。
第二题可以看到过滤了127.0.0和localhost。
直接把127.0.0.1转换为16进制的IP地址即可。
接下来这个过滤了1,0,localhost,那么再转16进制肯定是不行了。
我们可以生产一个短链接来代替http://127.0.0.1/flag.php。
但是不知道为啥我这里啥也没有,如果被过滤掉了会输出hacker的,估计是解析失败了。
还有一种方法是往域名里面添加个A记录,指向127.0.0.1,那么服务器在解析域名的时候其实就是访问了127.0.0.1。(由于自己没有域名,所以图片网上找的)
这一关限制host长度小于等于5,直接用127.1代替127.0.0.1即可。
这一关限制IP长度为3,直接用http://0/flag.php即可。
这题和上面就不太一样了,先是解析我们的IP并且输出,接着做如下判断
- ILTER_VALIDATE_IP:验证是否为合法IP格式
- FILTER_FLAG_NO_PRIV_RANGE:排除私有IP范围(如
10.0.0.0/8
、192.168.0.0/16
) - FILTER_FLAG_NO_RES_RANGE:排除保留IP范围(如
127.0.0.0/8
、169.254.0.0/16
)
也就是说无论你怎么变,只要解析出来的IP是127.0.0.1都不行,那么绑定域名和进制转换这种肯定不行了,因为你解析出来的IP都是127.0.0.1。那么此时我们可以用到重定向这个方法,把下面这个代码放到公网服务器上面,然后去请求它,当这个脚本被请求了就会自动跳到127.0.0.1,从而实现绕过。
<?php
header("Location:http://127.0.0.1/flag.php");
其作用是:当执行该脚本时,会直接跳转到对应的网址,即Location: 后面的网址。
同时我们也可以通过生成一个短链接来绕过,原理是一样的。
这题可以看到url中必须要含有ctf,show这两个东西才行。
直接用/ctf.@127.0.0.1/flag.php#show进行绕过,#符号后面的内容不解析,这里我猜测@前面的也不解析。
这一关题目提示了是mysql服务。
可以看到请求的参数中有url类型的,我们利用Gopher协议打一波。
可以利用gopherus这项目,生产一个利用连,这里我选择写入一句话代码。
这里记得把下面的内容进行URL编码一下,不然传过去解码就没了。
执行之后成功上传。
这题就是打redis和mysql其实差不多的。
运行脚本,类型我们选择PHPShell,网站路径的话一般都是默认即可,写上一句话木马就会生成一个利用链条,和上面一样gopher://127.0.0.1:6379/_后面的进行URL编码。
python gopherus.py --exploit redis
黑盒审计
黑盒审计的话找可能存在SSRF漏洞的功能点。
-业务功能点
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞
像一些PDF转换或者PDF在线编辑的地方也会存在,添加个空白的PDF,然后写上JS代码。
点击保存应用,在dnslog这里可以看到记录。
SSRF无回显
还有一个就是无回显问题,这个其实也简单,我们获取一个dnslog地址通过SSRF去请求这个地址看其有无记录不就可以了,还有一个方法就是公网服务器监听一个端口,然后通过SSRF去请求这个端口,看看有无被请求到即可判断是否存在SSRF。
总结
最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。