WebGoat (A8:2013) Request Forgeries -- Cross-Site Request Forgeries

目录

一、习题通关

第3页

第4页

第7页

第8页

二、热乎的知识


一、习题通关

第3页

任务:下图的提交按钮会发送一个请求,这题的要求是在webgoat用户登录的情况下,从其他网站触发这个请求,以获取flag,提交flag即可通关。

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

解题步骤:

首先注意这页有个狼的图标,表示可以借助webwolf。其实不借助也可以,自己可以简单起个http服务(比如用python)。这里还是用webwolf演示,关于webwolf的安装和使用见WebGoat (A2) Broken Authentication -- Password reset (密码重置)_箭雨镜屋-CSDN博客

1、首先在提交按钮上点鼠标右键,再点 检查 ,可以看到一个隐藏的表单

2、在form标签上点鼠标右键,选copy --> copy element,然后到notepad++等编辑器中粘贴一下。

3、整理一下form,主要是注意下图红框里面,action的值要把url补全

4、把上图中的html代码保存为3.html,并上传到webwolf,然后点它同一行右边的link

5、点一下提交按钮,得到flag,webgoat中输入flag并提交即可通关

 

第4页

任务:从其他网站以当前用户身份提交一条评论

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

解题步骤:

1、这页有两个输入框,在攻击之前先尝试一下,可以发现第一个输入框是用来输入评论的,第二个输入框不要填写任何东西,否则提交不了。

2、接下来就可以开始做payload了,首先在评论输入框点鼠标右键,再点 检查,在弹出的开发者工具中找到下图所示的form

3、和上一页一样,copy element把form拷贝到notepad++中,action补全,id为reviewText的input标签中placeholder属性改成value属性,并修改属性值。将这个文件命名为4.html

4、把4.html上传到webwolf中,点击其右侧的link

点击submit review按钮

过关了

 

第7页

这关有点难,还有点迷惑性,但是如果认真看了这页的参考资料,并且大胆尝试,就还挺简单的

任务:从其他网站向webgoat服务器发送下图中的JSON消息

这题最迷惑的就是任务描述容易让人误以为发送的JSON消息要和页面显示的一字不差,实际上可以不一样。

前提:(1)webgoat用户需要登录(2)触发评论的页面需要在webgoat登录的浏览器上打开

参考资料:点击上图中的here,会跳转到本页的参考资料(http://pentestmonkey.net/blog/csrf-xml-post-request),这个对于本页的任务是非常有用的。

这个参考资料主要解决的是利用CSRF发送xml的问题,主要有两个难点:

难点1:发送的xml会被浏览器自动进行url编码

解决方法:payload中form标签加属性ENCTYPE="text/plain"

难点2:由于POST数据都是name=value的形式,因此当input标签只有name属性没有value属性的时候,发送的数据末尾还是会自动加上等号,导致服务器无法解析xml数据。

解决方法:通过巧妙构造name和value属性的值,使name=value中的等号替代xml数据中的等号。

解题步骤:

1、把下面这段html代码保存为7.html

这段代码的form标签属性我还是用之前的方法从开发者工具里面拷贝的,另外需要注意两点:

(1)form标签必须要有属性ENCTYPE="text/plain"

(2)要巧妙构造payload使POST数据name=value中的等号成为json数据的一部分,而不是在json数据结构之外,以免引起解析错误。

<html>
    <script>                                                                                                       <!-- 这个script是用来自动提交表单的 -->
        window.onload = function() {
        document.getElementById("submit").click();
        }
    </script>   
	<body>                            
		<form class="attack-form" accept-charset="UNKNOWN" id="csrf-feedback" method="POST" preparedata="feedback" action="http://192.168.101.16:8222/WebGoat/csrf/feedback/message" contenttype="application/json" ENCTYPE="text/plain">
			<input type="hidden" name='{"name": "WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!' value='"}'>
            <input id="submit" type="submit" value="Submit request" style="display:none"/>
		</form>
	</body>
</html>

2、把7.html上传到webwolf,然后点它右边的link

表单会自动提交,页面中有一串flag,把这串flag填入第7页填写flag的框框并提交后即可过关

下图是点link过程中burpsuite抓到的包,需要关注两点:

(1)ENCTYPE="text/plain"会使请求报文中Content-Type: text/plain

(2)通过上述html代码的巧妙构造,请求内容是正经的json数据,所以才能被服务器解析,不报错;如果input标签只有name属性没有value属性,构造出来的会是这样:{"name": "WebGoat","email":"webgoat@webgoat.org","content":"WebGoat is the best!!"}=,服务器会报无法解析为json数据之类的错误。

还要特别注意两点:

(1)webgoat源代码里面给的solution不对,没有value属性

(2)burpsuite自动生成的csrf payload不对,虽然有value属性,但value属性为空,毛用没有。。。

 

第8页

这关有点神奇也有点搞笑。。

一般CSRF都是攻击者利用良民的身份去做一些猥琐的事情,但是login CSRF是攻击者欺骗良民用攻击者的身份登录,这样攻击者就可以做猥琐的事情了,良民用攻击者的账号做的所有行为都会被记录,并可以被攻击者收集和分析。

搞笑的是,这关任务是在保持当前页面(页面1)打开的情况下,在新页面(页面2)上创建以csrf-为前缀的新用户,并以该新用户登录。然后在页面1上点击下图这个solved按钮。

搞笑就搞笑在,在页面2上点击这个按钮也能通关,并且在页面1如果不重新登录根本点不了这个按钮,因为使用csrf用户登录需要先让原本的用户退出登录,而页面2上原本的用户退出了登录,页面1也会自动跳转到登录页面了。。

 

二、热乎的知识

CSRF(读作sea-surf)全称Cross-site request forgery,有的地方也缩写为XSRF,有时候也叫 one-click attack或者session riding。这个攻击利用服务器对合法用户的信任(存储在用户浏览器中),在用户不知道的情况下发送指令。

它有以下特征:

  • 攻击对象是依赖对用户身份的信任的网站(不对特殊行为进行认证授权)

  • 利用的是网站对合法用户身份的信任(经过身份认证的用户有cookie存储在浏览器中)

  • 利用合法用户的浏览器发送HTTP请求到目标网站

  • 其目标是提供服务器端状态变化功能的网站(比如修改用户信息,购买物品等),对于获取返回信息无效,因为返回的信息可以被合法用户看到,但不能被攻击者看到。

即使只有JSON API并且有CORS的保护,也有可能受到CSRF的攻击,因此对于CSRF的防御不能依赖 content-type,而是需要部署防御措施。

防御:

1、很多框架有默认的CSRF防御措施,比如XSRF-TOKEN

2、自定义请求头,但是这种方法可以被绕过,并不安全。

3、cookie的same site属性(Cookie 的 SameSite 属性 - 阮一峰的网络日志 (ruanyifeng.com)

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值