【漏洞】CSRF跨站请求伪造和SSRF服务端请求伪造

前言

跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。(维基百科

Server-side request forgery (SSRF) is a computer security vulnerability that enables an attacker to send requests from a vulnerable server to internal or external systems or the server itself.(维基百科

CSRF跨站请求伪造(Cross-Site Request Forgery)

漏洞原理

  • 当前客户端在被渗透网站处于已登录状态
  • 被渗透网站允许跨站请求
  • 攻击者知晓被渗透网站的请求结构,能构造出与被渗透网站相同结构的请求
  • 受害者触发攻击者的代码,从而促使攻击者伪造客户的身份发出请求

漏洞利用

  • 某网站的修改密码GET请求为http://example.com/reset?new_password=123456,此时可以创建一个以当前网站域名为文件名的网页文件example.com.html,并在文件中将修改密码请求的URI作为<img>标签的参数

文件名改为与当前网站同名是因为部分网站在接收请求时会检测请求中是否包含以当前网站域名的关键字,此时虽然伪造网站的域名不是与当前网站相同,但是如果当前网站源码中只做了检测是否包含关键字的代码进行验证,就依然能通过验证

更高级的请求需要分析原请求的结构进行伪造,此处只是给一个示例

example.com.html
1
<img src="http://example.com/reset?new_password=123456">
  • 此时进入这个网页的用户密码将被强制修改

防御

无效防御

  • 使用Cookie进行身份认证,所有Cookie,即便是加密的Cookie,也会随着每个请求一起提交
  • 仅接收POST请求,不仅仅是GET请求可以被伪造,POST依然可以被伪造,只需要在页面创建一个隐藏的表单即可构造POST请求
  • 多步交易,多步交易不足以防御CSRF,只要攻击者可以完整预测整个事务的每个步骤,就可以实现CSRF
  • URL重写,这可能被视为一种有用的CSRF防御技术,因为攻击者无法猜测受害者会话的ID。但是用户的会话ID通常在URL中公开,所以仍然可以被攻击者获取
  • HTTPS,HTTPS本身无法防御CSRF,但是应该作为任何防御的先决条件

有效防御

  • 验证请求头中的Referer,请求头中的Referer字段是请求发送者的源地址,通过验证源地址可以有效防御CSRF
  • 添加Token认证,在请求中添加用户不能伪造的的信息
  • 二次验证,在关键操作之前要求用户二次认证密码或验证码,有效防御CSRF
  • 用户养成良好的上网习惯,不要随意点击链接或图片;及时退出长时间不使用的已登录账户;安装合适的防护软件

SSRF服务端请求伪造(Server-Side Request Forgery)

漏洞原理

  • 传递其他网络资源地址作为请求参数
  • 服务器会通过curl向url发送请求
  • 将请求得到的数据以文件的形式存储在当前目录下
  • 将请求得到的数据回显在页面中

漏洞利用

通过HTTP协议读取网页

<ip>:服务器所在内网的其他IP地址
<webapp>:其他web应用的访问路径

request
1
GET http://example.com/index.php?url=http://<domain>

通过dict协议探测端口号是否开放

  • 通过字典协议探测端口,只有当端口开放的情况下,页面才会正常返回

<ip>:服务器所在内网的其他IP地址
<port>:端口

request
1
GET http://example.com/index.php?dict://<ip>:<port>

通过file协议读取文件

1
http://example.com/index.php?file://<file>

代码审计

PHP

  • 查找fopenfile_get_contentsfile_put_contentsfreadfclose相关代码

漏洞挖掘

  • 从Web应用的功能上寻找,当Web服务中出现服务器需要发送请求来得到回显内容时,可能会出现SSRF漏洞
    • 分享功能
    • 转码功能
    • 在线翻译
    • 图片的加载与下载
    • 收藏功能
    • 未公开的API及其他调用URL的功能
  • 从URL关键字中寻找
    • share
    • wap
    • url
    • link
    • src
    • source
    • target
    • u
    • 3g
    • display
    • sourceURI
    • imageURL
    • domain

防御

  • 限制协议,仅允许httphttps协议的请求
  • 限制请求的端口为常用的端口
  • 限制IP,避免应用被用来获取内网数据
  • 过滤返回信息,统一报错信息 ,避免用户可以根据报错判断服务器的端口状态,例如将所有不正常的页面都返回404

绕过

  • 如果服务端做了域名白名单正则过滤,可以将白名单关键字作为用户名http://white.com@example.com进行绕过

  • 如果服务端做了IP地址正则过滤,可以将IP地址转换为其他进制

    • 8进制:30052000001
    • 10进制:3232235521
    • 16进制:0xc0a80001

完成

参考文献

哔哩哔哩——千锋教育网络安全学院
哔哩哔哩——xiaodisec