服务器端请求伪造(SSRF)
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成并由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等。最终将可能导致,攻击者可通过外网服务器端利用该漏洞访问内网服务器端的资源。
修复思路
1、建立安全域名白名单列表,如a.com,b.com
2、校验所有文件上传类参数,检查其域名,必须在安全域名白名单中
3、实现一个自定义校验器,可以交易某个值是否在白名单中,如果不在则抛出异常,不允许此api保存
效果目标
配置文件新增安全域名白名单
javashop:
security:
domain:
- 'www.a.com'
- 'b.com'
controller中
public String save(@SafeDomain String face) {
//do something..
}
领域模型中
/**
* 头像
*/
@SafeDomain
private String face;
校验规则
如果face的值不在域名白名单中,则校验不通过,校验规则如下
1、忽略http/https协议开头,只关注域名
2、域名必须是全匹配
3、如果域名白名单是空,则不做校验
示例
安全域名白名单:
www.a.com
b.com
image.c.com
以下值的交易情况:
值 | 校验结果 | 说明 |
---|---|---|
http://www.a.com/xx/xx.jpg | 通过 | 忽略http头 |
https://www.a.com/xx/xx.jpg | 通过 | 忽略https头 |
https://test.a.com/xx/xx.jpg | 不通过 | 需要域名全值匹配 |
www.a.com/xx/xx | 通过 | 只关注域名 |
a.b.com | 不通过 | 需要域名全值匹配 |
c.com/xx.jpg | 不通过 | 要域名全值匹配 |
实现说明
javashop配置类
com.enation.app.javashop.framework.JavashopConfig
自定义校验注解参考
com.enation.app.javashop.framework.validation.annotation.Mobile
com.enation.app.javashop.framework.validation.impl.MobileValidator
需要修改的参数列表
见excel