menu 绝望的肉
面试用渗透测试知识点梳理-SSRF和CSRF
2551 浏览 | 2021-03-22 | 阅读时间: 约 5 分钟 | 分类: 日常 | 标签:
请注意,本文编写于 188 天前,最后修改于 188 天前,其中某些信息可能已经过时。

SSRF

​ SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

​ curl_exec,file_get_contents

1.危害

  1. 内网ip/端口扫描
  2. 服务器敏感数据读取
  3. 内网主机应用程序漏洞利用
  4. 内网web站点漏洞利用

2.协议

1.file读文件

2.dict协议查看端口开放情况

3.gopher

gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议

3.绕过

1)http://www.baidu.com@10.10.10.10与http://10.10.10.10 请求是相同的,利用[::]绕过localhost

2)ip地址转换成进制来访问

3)可以指向任意ip的域名:xip.io

4)短链接

5)302转跳

6)DNS解析

4.防护

1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3,限制请求的端口为http常用的端口

4,黑名单内网IP

5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

6.安全包,对转跳进行追踪

5.DNS重绑定

  • 由于我们无法在程序运行时以毫秒为单位手动更改dns记录,因此需要配置一个自定义DNS服务器,并设定好某些域名的解析IP,再将TTL设置为0,这样后端就不会有缓存
  • 一些用来配置域的“接口”——它应该解析什么,解析多少次之类的

CSRF

1.原理

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。

2.防御

  1. 验证码:懂的都懂
  2. CSRF token:

    服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面,服务端设置setCookie,把该随机数作为cookie或者session种入用户浏览器 当用户发送 GET 或者 POST 请求时带上_csrf_token参数 后台在接受到请求后解析请求的cookie获取_csrf_token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求是合法的。

  3. 验证 HTTP Referer 字段:

    在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。

  4. 避免全站通用的Cookie,严格设置Cookie的域

5.在 HTTP 头中自定义属性并验证:

通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

4.绕过:

  1. https向http跳转的时候Referer为空
  2. 利用ftp://,http://,https://,file://,javascript:,data:这个时候浏览器地址栏是file://开头的,如果这个HTML页面向任何http站点提交请求的话,这些请求的Referer都是空的。
  3. 构造相关域名或关键词
  4. Referrer-Policy用户可以通过浏览器配置或者Referrer-Policy 关闭 referer 的发送。

    如果页面中包含了如下 meta 标签,所有从当前页面中发起的请求将不会携带 referer:

    <<span class="title">meta name="referrer" content="never">
    

5.JSON CSRF

json发包格式是Content-Type:application/json,可尝试使用text/plain发包

<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://xxx.com/csrf" method="POST" enctype="text/plain">
      <input type="hidden" name='{"data":"我是数据","address":"' value='"}' />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

因为 input框 的组成方式就是 name=value 这种格式所以肯定会在最后带一个 =

添加 value='"}' 是为了闭合 json 防止爆错

6.CORS(跨域资源共享)

CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。

  • Access-Control-Allow-Origin 指定哪些域可以访问本域的资源。例如,如果requester.com想要访问provider.com的资源,那么开发人员可以用此授予requester.com访问provider.com资源的权限。

利用:

1.同于csrf跨站请求伪造,发送钓鱼链接,读取用户敏感数据。

2.结合xss漏洞利用漏洞,针对httponly js代码无法读取

漏洞:Origin 校验/语法错误;信任null

防护:

  • 正确配置跨域请求
    如果Web资源包含敏感信息,则应在Access-Control-Allow-Origin标头中正确指定来源。
  • 只允许信任的网站
    看起来似乎很明显,但是Access-Control-Allow-Origin中指定的来源只能是受信任的站点。特别是,使用通配符来表示允许的跨域请求的来源而不进行验证很容易被利用,应该避免。
  • 避免将null列入白名单
    避免使用标题Access-Control-Allow-Origin: null。来自内部文档和沙盒请求的跨域资源调用可以指定null来源。应针对私有和公共服务器的可信来源正确定义CORS头。
  • 避免在内部网络中使用通配符 Access-Control-Allow-Origin:*
    避免在内部网络中使用通配符。当内部浏览器可以访问不受信任的外部域时,仅靠信任网络配置来保护内部资源是不够的。
  • CORS不能替代服务器端安全策略
    CORS定义了浏览器的行为,绝不能替代服务器端对敏感数据的保护-攻击者可以直接从任何可信来源伪造请求。因此,除了正确配置的CORS之外,Web服务器还应继续对敏感数据应用保护,例如身份验证和会话管理。

7.JSONP

什么是Jsonp

在受到同源规则的限制下(同协议、同域名、同端口),资源不允许跨域访问,但是在实际的使用过程中总有一些地方需要跨域去调用其他域下的资源。

这时候jsonp身为跨域的方法中的一个就孕育而生了,由于html标签中的<script><img><iframe> 这三个标签是允许进行资源的跨域获取的,jsonp就是利用了这三个标签中的其中一个 <script> 利用js代码动态生成script标签然后利用标签中的src属性来进行资源的跨域调用。

利用回调函数'包'住我们的json数据返回

成因

厂商没有对jsonp请求对来源进行校验和过滤导致任意域都能获取到数据

危害

攻击者构造恶意的html页面,利用链接诱导受害者进行点击,从而获取到受害者的敏感信息

防御

1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。
3、严格过滤 callback 函数名及 JSON 里数据的输出。
4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。
5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。

与CORS的区别

JSONP 只支持 GET 请求,CORS 支持所有类型的 HTTP 请求。JSONP 的优势在于支持老式浏览器,以及可以向不支持 CORS 的网站请求数据。

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!