SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。
你可以根据"SSRF"里面的项目来搞懂问题的原因
SSRF(curl)
找到pikachu对应的窗口
我们可以尝试点击
我们可以看见url
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
我们可以看他的源码,看看这个问题是怎么形成的
简单的分析一下
这里会自己获取前端的url
通过curl_init初始化
如何将数据返回给前端
我们可以尝试传入一个其他的地址比如百度
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
这样的话我们可以把 url 中的内容改成内网的其他服务器上地址和端口,探测内网的其他信息
我们也可以通过SSRF漏洞读取服务器的文件
比如我们读取pikachu/test/hacker.txt文件
我们可以输入
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/test/hacker.txt
这样我们就可以获得对应的文件了
SSRF(file_get_content)
打开pikachu靶场,点击标签,可以看到和SSRF(curl)一样的,都是通过URL上传参数到后台获取信息的
查看后端代码,它和前面的逻辑是一样的
不同的是它这里使用file_get_contents函数进行文件的读取执行
而file_get_contents函数可以对本地文件进行读取,也可以对远程文件进行读取
我们可以像前面测试的一样,在URL中去输入百度的地址。它一样也会通过http协议去获取百度的资源
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com
我们也可以像前面一样,读取pikachu/test/hacker.txt文件
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/test/hacker.txt
我们可以制造恶意的payload去获取后台的PHP源码
php://filter/read=convert.base64-encode/resource=ssrf.php
提交payload后,可以看到页面显示出了转换后的php的base64编码
这样我们就可以通过解码从而得到PHP的源码