简介
SSRF(服务器端请求伪造) 是一种安全漏洞,攻击者利用这个漏洞可以让服务器去发起请求,而这些请求是攻击者指定的,而不是服务器正常业务逻辑想请求的地址。换句话说,攻击者通过服务器这个中介,让服务器向任意目标发起请求。
SSRF定义
服务器端请求伪造(SSRF)指的是攻击者通过构造请求,利用服务器的功能作为代理来发送一个恶意请求至第三方服务器或内部资源。这种攻击允许攻击者绕过对源IP地址的检查,访问受限的内网资源,甚至从内部系统中窃取数据,执行远程代码,或对特定服务发起拒绝服务攻击(DoS)。
SSRF攻击原理
SSRF攻击的基本原理在于攻击者利用服务器作为代理来发送请求。首先,攻击者寻找目标网站中可以从服务器发出外部请求的点,比如图片加载、文件下载、API请求等功能。随后,攻击者通过向这些功能提交经过特别构造的数据(如修改URL或参数),诱使服务器向攻击者控制的或者内部资源发送请求。此时,服务器充当了攻击者与目标之间的“桥梁”,攻击者可以通过它来接触和操作内部服务,绕过安全限制。
攻击链条
- 用户提供一个 URL 供服务器处理(如图片下载、网页预览等功能)。
- 服务器未验证 URL 是否是合法/可信来源。
- 攻击者伪造 URL,例如
http://127.0.0.1:80/admin
。 - 服务器收到请求后以为这是合法请求,实际却访问了内网或敏感资源。
本地场景复现示例(Flask实现)
搭建一个具有SSRF漏洞的服务器
from flask import Flask, request
import requests
app = Flask(__name__)
@app.route('/fetch')
def fetch():
url = request.args.get('url')
try:
resp = requests.get(url, timeout=3)
return resp.text
except Exception as e:
return f"Request failed: {str(e)}"
if __name__ == '__main__':
app.run(port=5000, threaded=True)
搭建一个内网服务器用于测验是否利用成功
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello from internal service!'
@app.route('/secret')
def secret():
return 'Super secret internal data!'
if __name__ == '__main__':
app.run(port=8000)

访问5000端口的漏洞服务器,Payload:http://127.0.0.1:5000/fetch?url=http://127.0.0.1:8000/secret
返回信息如下

和直接访问8000端口的内网服务器内容一致,利用成功

SSRF防御方法
- 白名单校验:只允许访问可信 URL 或域名。
- 禁止访问内网 IP:对如
127.0.0.1
,10.0.0.0/8
,192.168.0.0/16
等地址拒绝访问。 - 超时和大小限制:防止利用 SSRF 挖矿或拒绝服务攻击。
- 禁止跳转或文件协议:如
file://
,gopher://
,ftp://
等也可能被利用。