通用漏洞

COSP跨域资源

原理

  • CORS,即跨源资源共享(Cross-Origin Resource Sharing)。同源策略(Same OriginPolicy)要求不同源之间是无法通信的,而CORS则是放宽同源策略以通过浏览器实现网站之间通信的机制。
  • CORS全称为Cross-Origin Resource Sharing即跨域资源共享,用于绕过SOP(同源策略)来实现跨域资源访问的一种技术。
    CORS漏洞则是利用CORS技术窃取用户敏感数据,CORS漏洞的成因是服务端配置的规则不当所导致的,服务器端没有配置Access-Control-Allow-Origin等字段

危害

1、获取用户数据

2、客户端缓存中毒:这种配置允许攻击者利用其他的漏洞,更改没有验证的字段,看是否正常回显。比如,一个应用返回数据报文头部中包含“X-User”这个字段,这个字段的值没有经过验证就直接输出到返回页面上,此时就可以结合XSS漏洞来利用。

3、服务端缓存中毒:利用CORS的错误配置注入HTTP头部,这可能会被服务器端缓存下来,比如制造存储型xss

防御

1、仔细评估是否开启CORS,如果不必要就不要开启CORS。

2、如果是绝对必要的话,要定义“源”的白名单。尽量不使用正则表达式配置,不要配置“Access-Contol-Allow-Origin”为通配符“*”,同时严格校验来自请求的Origin值。

3、仅仅允许安全的协议,有必要验证协议以确保不允许来自不安全通道(HTTP)的交互,否则中间人(MitM)将绕过应用是所使用的HTTPS。

4、要尽可能的返回”Vary: Origin”这个头部,以避免攻击者利用浏览器缓存。、

5、如果可能的话避免使用“Credentials”头,由于“Access-Control-Allow-Credentials”标头设置为“true”时允许跨域请求中带有凭证数据,因此只有在严格必要时才应配置它。此头部也增加了CSRF攻击的风险;因此,有必要对其进行保护。

6、限制使用的方法,通过“Access-Control-Allow-Methods”头部,还可以配置允许跨域请求的方法,这样可以最大限度地减少所涉及的方法。

7、限制缓存的时间,通过“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”头部,限制浏览器缓存信息的时间。可以通过使用“Access-Control-Max-Age”标题来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间。配置相对较低的值(例如大约30分钟),确保浏览器在短时间内可以更新策略(比如允许的源)。

8、仅配置所需要的头,仅在接收到跨域请求的时候才配置有关于跨域的头部,并且确保跨域请求是合法的(只允许来自合法的源)。

参考

https://wh0ale.github.io/2018/12/26/2018-12-26-CORS漏洞/

https://www.cnblogs.com/Xy--1/p/13069099.html

https://its301.com/article/BHSZZY/119024992

项目

https://github.com/chenjj/CORScanner

JSONP跨域回调

原理

JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写。

JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。

JSONP就是为了跨域获取资源而产生的一种非官方的技术手段(官方的有 CORS 和 postMessage),它利用的是 <script> 标签的 src 属性不受同源策略影响的特性。

危害

1.攻击者利用存在漏洞的网站,将链接通过邮件等形式推送给受害者,如果受害者点击了链接,则攻击者便可以获取受害者的个人敏感的信息。所以JSONP劫持漏洞会泄露信息。

2.可能导致用户权限被盗用;
攻击者通过JSON劫持构造盗取管理员或高权限用户的脚本,一旦被访问,权限立即被盗用。

3. 可以通过劫持对网页进行挂马;
在JSON劫持点构造引向漏洞后门木马,但访问直接利用漏洞批量挂马。

4. 可对劫持页进行网站钓鱼;
利用JSON劫持直接导向伪装网站地址。

5. 可做提权攻击;

6. 变种拒绝服务攻击;
劫持后将流量导向受害网站,直接发动DDOS攻击。

防御

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 远程调用。

参考

https://xz.aliyun.com/t/10051

https://www.k0rz3n.com/2018/06/05/由浅入深理解JSONP并拓展/

https://www.k0rz3n.com/2019/03/07/JSONP 劫持原理与挖掘方法/

https://yinwc.github.io/2021/04/29/JSONP漏洞/

项目

https://github.com/p1g3/JSONP-Hunter

子域名接管

原理

子域名接管是注册不存在的域名以获得对另一个域的控制权的过程,常出现在CNAME记录中。
此过程最常见的情况如下

1.域名(例如,sub.example.com)将CNAME记录用于另一个域(例如,sub.example.com CNAME anotherdomain.com)。
2.在某个时间点,anotherdomain.com到期并可供任何人注册。
3.由于未从example.com DNS区域删除CNAME记录,因此注册anotherdomain.com的任何人都可以完全控制sub.example.com,直到存在DNS记录为止。

危害

子域接管的含义非常重要。通过使用子域名托管,攻击者可以从合法的域名发送网络钓鱼电子邮件,执行跨站脚本(XSS)或破坏与该域相关联的品牌的声誉。

防御

  • 提高资产管理能力 (避免云服务过期或被关闭,被他人"抢注")
  • 可以考虑使用名称不可自定义(随机hash值)的云服务商 如258ea2e57bca0.Acloud.com (避免云服务过期或被关闭,被他人"抢注")
  • 如果被"抢注" 重新设置域名的CNAME

参考

https://xz.aliyun.com/t/4673

https://cloud.tencent.com/developer/article/1728668

https://www.cnblogs.com/Icedisaster/p/15975546.html

https://zhuanlan.zhihu.com/p/136694063

http://heikesz.cooou.com/web/81169.html

项目

https://github.com/pwnesia/dnstake

https://github.com/anshumanbh/tko-subs

https://github.com/mhmdiaa/second-order

https://github.com/r3curs1v3-pr0xy/sub404

https://github.com/Echocipher/Subdomain-Takeover

CRLF注入

解析

描述

HTTP响应头拆分漏洞(CRLF)”是一种新型的web攻击方案,当用户将CRLF字符插入到应用中而触发漏洞的攻击技巧。当该字符与HTTP协议请求和响应的头部一起联用时就有可能会出现各种各样的漏洞,包括http请求走私(HTTP Request Smuggling)和http响应拆分(HTTP Response Splitting)。

在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP 内容并显示出来。所以,一旦我们能够控制HTTP 消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码,所以CRLF Injection又叫HTTP Response Splitting(HRS)。

CRLF指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)

原理

HRS漏洞存在的前提是 :url当中输入的字符会影响到文件,比如在重定位当中可以尝试使用%0d%0a作为crlf.

一般网站会在HTTP头中加上Location: http://baidu.com的方式来进行302跳转,所以我们能控制的内容就是Location:后面的XXX网址,对这个地址进行污染。

假设服务端(PHP)的处理方式:

if($_COOKIE("security_level") == 1)
{
    header("Location: ". $_GET['url']);
    exit;
}

代码意思是说当条件满足时,将请求包中的url参数值拼接到Location字符串中,并设置成响应头发送给客户端。

此时服务器端接收到的url参数值是我们修改后的:http://baidu.com/xxx%0a%0dSet-Cookie: test123=123

在url参数值拼接到Location字符串中,设置成响应头后,响应头就会看到:Set-Cookie: test123=123

危害

1.缓存污染,它是一种场景,攻击者可以修改缓冲中的条目,并托管恶意页面(即包含 JavaScript)而不是合理的页面。

2.防火墙绕过,它是一种场景,请求被构造,用于避免安全检查,通常涉及 CRLF 和过大的请求正文。

3.请求劫持:它是一种场景,攻击者恶意盗取 HTTPOnly 的 Cookie,以及 HTTP 验证信息。这类似于 XSS,但是不需要攻击者和客户端之间的交互。

防御

过滤 \r\n之类的换行符,避免输入的数据污染到其他HTTP头。

所以这个过滤也应该添加到 XSS FILTER 中。

项目

通过模糊测试检查是否有CRLF然后人判定

https://github.com/dwisiswant0/crlfuzz

参考

https://houbb.github.io/2020/08/09/web-safe-03-crlf

https://codeantenna.com/a/qDHFQzTzR6

实例:https://www.freebuf.com/articles/web/245688.html

URL重定向

解析

描述

url重定向漏洞也称url任意跳转漏洞

攻击者可通过将跳转地址修改为指向恶意站点,即可发起网络钓鱼、诈骗甚至窃取用户凭证等。

跳转中最常见的跳转在登陆口,支付口,也就是一旦登陆将会跳转任意自己构造的网站,如果设置成自己的url则会造成钓鱼。

原理

输入图片说明

假设有一个正规网站http://nerddinner.com/,还有一个恶意网站或钓鱼网站http://nerddiner.com/(注意:这里少了个n)。

一天,小白收到了别人发的链接:http://nerddinner.com/Account/LogOn?returnUrl=http://nerddiner.com。

  1. 打开链接后进入了登录界面,小白输入了自己的帐号名密码进行登录。
  2. 登录成功后重定向到了恶意网站。
  3. 恶意网站是一个仿造正规网站的登录页面,并在上面提示用户名或密码错误。
  4. 小白按照提示重新输入了帐号密码信息。
  5. 恶意网站保存了客户的用户名密码,然后重定向会正规网站。
  6. 小白继续平时正常的操作。

危害

  1. 攻击者可能会使用Web服务器攻击其他站点;
  2. 如果对输出没有做严格限制,将可能导致反射性XSS漏洞;
  3. 黑产将利用此漏洞,从信任网站跳转到攻击者构造的恶意网站用来进行钓鱼、诈骗等行为;

防御

  1. 严格控制将要跳转的域名,如果某个业务事先已经确定将要跳转的网站,最稳妥的方式是将其直接编码在源代码中,通过URL中传入的参数来映射跳转网址。

  2. 严格验证跳转URL参数的有效性、合法性。

  3. 校验传入的URL参数是否为可信域名。

挖掘技巧

1.谷歌语法

用inurl:{参数名},可以找出可能存在漏洞的页面,然后进行进一步测试。

2.黑盒测试

黑盒测试的话,除了用上面的谷歌语法,还需要我们留意网站跳转的地方。那么根据常识经验以及我的一些收集整理,这里给出可能存在漏洞的一些功能点:

用户登录、统一身份认证处

用户分享、收藏内容处

跨站点认证、授权后

站内点击其它网址链接时

注册、注销、修改密码处

账号切换、保存设置处

3.白盒审计

如果是审计代码,那么下面给出的是我收集的不同语言可能产生漏洞的地方

java

response.sendRedirect(request.getParameter("url"));

PHP

$redirect_url = $_GET['url'];
header("Location: " . $redirect_url);

.NET

string url = request.QueryString["url"];
Response.Redirect(url);

Rails

redirect_to params[:url]

Django

redirect_url = request.GET.get("url")HttpResponseRedirect(redirect_url)

Flask

redirect\_url = request.form\['url'\] redirect(redirect\_url)

4.fuzz测试

可以用下面提供的payload进行测试,注意使用的时候需要修改一下相关url

https://github.com/cujanovic/Open-Redirect-Payloads/blob/master/Open-Redirect-payloads.txt

参考

https://houbb.github.io/2020/08/09/web-safe-06-redirect

https://xz.aliyun.com/t/5189

https://www.freebuf.com/articles/web/286334.html

https://juejin.cn/post/6940962209933557796

https://www.jianshu.com/p/6ecff0722c56

web拒绝服务

https://websec.readthedocs.io/zh/latest/misc/dos.html

解压炸弹制作方法

https://zhuanlan.zhihu.com/p/234699711

posted @ 2022-05-15 14:49  阿力先生  阅读(288)  评论(0)    收藏  举报