Web服务端发起请求的风险与测试方案

admin 2022年5月1日22:23:53安全文章评论11 views1333字阅读4分26秒阅读模式

CMS某些需求导致服务器主动向外发起请求,比如从外部URL添加资源:


Web服务端发起请求的风险与测试方案


目前很多成熟cms并不能有效控制该接口风险,我的第一个CVE就由它而来。


技术细节不再叙述,建议先阅读P神的文章,它给出了绕过方法和非常棒的Python解决方案。



防御策略



  1. 使用计数器确保30x跳转不会进入死循环

  2. 归一化IP,防止畸形IP(8/10/16进制、省略格式)绕过防御规则。

  3. 白名单验证协议(http/https)和端口号(80/8080/443)

  4. 黑名单验证IP是否属于内网

  5. 跳转之后注意要继续进行2,3,4步的验证


Python风险点



Python开发中常用三种http请求方法(pycurl/urllib/requests),这里简单分析其安全性及注意事项。


重定向


是否默认跟随重定向

  • pycurl(不跟随)

  • urllib/urllib2/requests(跟随)


默认最大重定向次数

  • pycurl(未限制)

  • urllib/urllib2(10次)

  • requests(30次)


风险点:使用pycurl开启跟随跳转之后,需手动限制最大跳转次数。


c = pycurl.Curl() c.setopt(pycurl.FOLLOWLOCATION, 1) c.setopt(pycurl.MAXREDIRS, 5)


协议支持


urllib/urllib2/requests -> http/https/ftp


pycurl支持协议如下:


supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTP. libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, Kerberos4), file transfer resume, http proxy tunneling and more!


风险点:pycurl未手动限定协议时可导致安全风险(如:file://读取本地内容造成DoS)


运维风险点



一些CMS喜欢使用配置项来控制是否允许“与内网地址通讯”,使用时请注意关闭该配置以保证安全性。



测试方案



白盒


源码中定位到过滤函数,分析其逻辑,要特殊注意正则表达式的使用。


黑盒


  1. fuzz协议(端口)

  2. 测试全部内网IP地址段(畸形IP)是否被过滤

  3. 测试重定向支持(循环重定向)

  4. 测试域名解析到内网时是否被过滤

  5. 综合2,3,4步,在重定向中测试域名解析到内网


辅助工具



搭建在公网服务器,提供 [循环重定向、延时响应、解析到内网IP、任意跳转] 四种功能,用于测试之前提到的安全风险,用法见代码。


https://github.com/Xyntax/pocserver/blob/master/ssrf-server/ssrf_server.py



原文始发于微信公众号(乐枕迭代日志):Web服务端发起请求的风险与测试方案

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月1日22:23:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Web服务端发起请求的风险与测试方案 http://cn-sec.com/archives/943603.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: