CTFHUB-WEB-POST请求
- 点击题目给出的链接:
http://challenge-b97f433c0cb97c5f.sandbox.ctfhub.com:10800
利用伪协议去读flag.php的源码:
<?php
error_reporting(0);
if ($_SERVER["REMOTE_ADDR"] != "127.0.0.1") {
echo "Just View From 127.0.0.1";
return;
}
$flag=getenv("CTFHUB");
$key = md5($flag);
if (isset($_POST["key"]) && $_POST["key"] == $key) {
echo $flag;
exit;
}
?>
<form action="/flag.php" method="post">
<input type="text" name="key">
<!-- Debug: key=<?php echo $key;?>-->
</form>
可以知道访问这个文件的时候,我们需要从127.0.0.1的地址进入,然后同时提交一个key,才可以输出$flag,但问题是我们怎么从本地换回地址进入呢,想了想试试XFF,不行,那就上网搜,然后找到一个协议gopher,它可以确保从127.0.0.1去发送,这个协议有一个具体的格式,url=gopher://127.0.0.1:80/_POST要发送的数据。
查看源代码发现了key的值:view-source:challenge-b97f433c0cb97c5f.sandbox.ctfhub.com:10800/?url=127.0.0.1/flag.php。
先抓一个包,写入post的请求,key=639a00c8f5a232d3b8561e3be857a8d9,然后将其中的空格,回车都进行两次编码,一次是因为本身浏览器要发一次,一次是因为gopher协议的缘故,需要在服务器内部再进行一次编码(就和我们用bp进行sql注入的时候一样,发送出去之前都需要将空格换成+一样),然后将这个数据包当作是url后面的部分,抓一个包,发过去。
进行编码的时候也要注意了,第一次选1,第二次选2
我这里替换空格回车实在太麻烦了,干脆直接写了一个脚本,将我的东西替换了,为了避免将空格多敲,这个东西关乎Content-Type的值,而这个的值是发送的内容的有效长度,如果我发多了,不会相应正确的数据给我。所以我先编码,然后再将空格回车替换成两个特定的字母,然后再将所有的编码恢复到编码之前的内容,然后再将空格回车编码,其实如果出现空行,也就是两个回车,在行开始我就编码了,一个空格编码之后确实是两个回车的编码,这样就保证后面会被替换成该有的东西。
import urllib.parse
file='./url_encode.txt'
with open(file,'r') as file:
string = file.read()
file.close()
string = string.replace('%20','alpo')
string = string.replace('%0d%0a','alpq')
string = urllib.parse.unquote(string)
string = string.replace('alpo','%2520')
string = string.replace('alpq','%250d%250a')
file_print=open('./result.txt','w')
print(string,file=file_print)
运行python 1.py,直接替换,文件目录如下,将要替换的内容放到url…中,
最后获取flag,提交完结!