打開url發現有三個鏈接,點進去都是.pl文件,且只有files可以上傳文件。
.pl文件都是用perl編寫的網頁文件
這里上傳了又將文件的內容全部打印出來,那么猜想后台應該用了param()函數。
param()函數會返回一個列表的文件但是只有第一個文件會被放入到下面的接收變量中。如果我們傳入一個ARGV的文件,那么Perl會將傳入的參數作為文件名讀出來。對正常的上傳文件進行修改,可以達到讀取任意文件的目的:
這里附上網上大佬們猜測的后台代碼:
use strict; use warnings; use CGI; my $cgi= CGI->new; if ( $cgi->upload( 'file' ) ) { my $file= $cgi->param( 'file' ); while ( <$file> ) { print "$_"; } }
bp進行抓包,將上傳的文件類型及文件內容處復制再粘貼一行,將filename去掉,然后內容填入ARGV
然后盲猜flag文件,讀取試試
或者直接先讀取file.pl文件,盲猜在/var/www/cgi-bin/file.pl或者/var/www/cgi-bin/file.pl兩個拿去試
發現確實使用了param()函數,然后我們利用bash來進行讀取當前目錄下的文件
payload為:
/cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS}/|
%20為空格,可換成+號
列出了當前目錄下的內容,發現flag,直接讀取