SSRF是什么?
(服务端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
file_get_contents(),fsockopen(),curl_exec()三个函数使用不当时将会造成ssrf
SSRF的危害?
- 探测内网信息
- 攻击内网或本地其他服务
- 利用file协议读取本地文件
- 对内网web应用进行指纹识别
- 端口扫描
gopher、dict协议以及redis服务、Curl 命令
Gopher
协议可以做很多事情,特别是在 SSRF 中可以发挥很多重要的作用。利用此协议可以攻击内网的FTP、Telnet、Redis、Memcache
,也可以进行GET、POST
请求。DICT
协议,一个字典服务器协议,A Dictionary Server Protocol
,允许客户端在使用过程中访问更多字典并且该协议约定服务器端侦听端口号:2628
。redis
服务是在6379
端口开启的
curl命令:
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思 不带有任何参数时,curl 就是发出 GET 请求
eg:
curl https://www.example.com
-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"
修复方法:
修复方案: • 限制协议为HTTP、HTTPS • 禁止30x跳转
• 设置URL白名单或者限制内网IP
SSRF利用(一):
关于file()与file_get_content():
详见:
https://www.cnblogs.com/3cH0-Nu1L/p/13462107.html
SSRF利用(二):
①访问正常文件
访问正常的文件,提交参数[?url=http://www.xxx.com/robots.txt]
②端口扫描
当访问未开放端口,脚本会显示空白或者报错。提交参数[?url=dict://127.0.0.1:2333]
当访问开放端口时,脚本会显示banner 信息。
提交参数[?url=dict://172.16.132.152:22](有成功率)
提交参数[?url=dict://127.0.0.1:3306]
提交参数[?url=dict://127.0.0.1:21]
③读取本地系统文件
利用file 协议可以任意读取系统本地文件,提交参数
[?url=file://c:windowssystem32driversetchosts]
④内网Web应用指纹识别
识别内网应用使用的框架,平台,模块以及cms可以为后续的渗透测试提供很多帮助。
大多数web应用框架都有一些独特的文件和目录。
通过这些文件可以识别出应用的类型,甚至详细的版本。
根据这些信息就可以针对性的搜集漏洞进行攻击。
比如可以通过访问下列文件来判断phpMyAdmin是否安装以及详细版本。
[?url=http://localhost/phpmyadmin/README]
⑤攻击内网应用
内网的安全通常都很薄弱,溢出、弱口令等一般都是存在的。
通过ssrf攻击,可以实现对内网的访问,从而可以攻击内网应用或者本地机器,获得shell,这里的应用包括服务、Web 应用等。
仅仅通过get方法可以攻击的web应用有很多,比如struts2命令执行等。
SSRF防御:
①限制协议
仅允许http和https请求。
②限制IP
避免应用被用来获取内网数据,攻击内网。
③限制端口
限制请求的端口为http常用的端口,比如,80,443,8080,8090。
④过滤返回信息
验证远程服务器对请求的响应是比较简单的方法。
⑤统一错误信息
免用户可以根据错误信息来判断远端服务器的端口状态
参考:
https://blog.csdn.net/weixin_30633949/article/details/97824781