文章目錄
- 前言
- Pass-01
- Pass-02
- Pass-03
- Pass-04
- Pass-05
- Pass-06
- Pass-07
- Pass-08
- Pass-09
- Pass-10
- Pass-11
- Pass-12
- Pass-13
- Pass-14
- Pass-15
- Pass-16
- 解題感悟
前言
美好的一天從刷題開始
Pass-01
我淦20道題???一道一道來吧
先看第一道題
先在home里搞一個圖片和一個php文件
上傳個圖片試試
再上傳個php文件試試
翻一翻檢查發現了一個checkFile函數
直接刪掉return checkFile()
試試
上傳成功
看看提示吧
很好,和咱們的嘗試一樣
Pass-02
界面和第一題的一樣
用第一題的方法試試,發現不行意料之中
抓包試試,burp啟動!啟動后切換代理
先新建一個模擬的php,擴展名偽裝成jpg
攔截打開然后上傳偽裝成圖片的php文件
把.jpg改成.php,然后放包
拿下
看一看提示叭
emmmmm差不多,那咱們根據提示的方法再做一遍叭
攔截,上傳php
Content-Type中改成image/jpeg
改完后放包
搞定
Pass-03
第三題先看提示
禁止asp,aspx,php,jsp后綴,這是不是意味著其他的都可以,咱們試一下
因為我懶得建文件了,所以我就直接用burp模擬了
改成php5試試
成功
Pass-04
這道題有點像第三題的升級版
細節的朋友立馬就會想到.htaccess。沒錯和第三題的方法一樣攔截,抓包,修改,放包。嘗試一下
成功
Pass-05
6…這下連.htaccess也禁了,這就過分了
既然這樣咱們就只能直接代碼審計了
$is_upload = false; // 初始化上傳標志,默認為false
$msg = null; // 初始化消息變量,默認為null// 檢查是否有表單提交
if (isset($_POST['submit'])) {// 檢查上傳路徑是否存在if (file_exists(UPLOAD_PATH)) {// 定義不允許上傳的文件擴展名$deny_ext = array(".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht", ".pHp", ".phP", ".pHP", ".PhP", ".pHp3", ".pHp2", ".Html", ".Htm");// 獲取上傳文件的原始名稱并去除空白$file_name = trim($_FILES['upload_file']['name']);// 刪除文件名末尾的點$file_name = deldot($file_name);// 獲取文件擴展名$file_ext = strrchr($file_name, '.');// 去除擴展名中的特殊字符串$file_ext = str_ireplace(':$DATA', '', $file_ext);// 去除空白字符$file_ext = trim($file_ext);// 檢查文件擴展名是否在禁止列表中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳文件的臨時路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 生成保存路徑和文件名,包含當前日期和隨機數$img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;// 嘗試將文件從臨時目錄移動到目標目錄if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 上傳成功,設置標志為true} else {$msg = '上傳出錯!'; // 移動文件失敗,設置錯誤消息}} else {$msg = '此文件類型不允許上傳!'; // 文件擴展名在禁止列表中,設置錯誤消息}} else {$msg = UPLOAD_PATH . ' 文件夾不存在,請手工創建!'; // 上傳路徑不存在,設置錯誤消息}
}
通過分析咱們可以發現他并沒有對擴展名的大小寫進行統一轉換,這不就意味著我把.php改成。PHP或者PHp就ok了,嘗試一下
還是那套步驟試一下
成功
Pass-06
目測可以用第四題的方法破解,試一試.htaccess
好吧不行…
那就淺淺審計一下代碼叭
$is_upload = false; // 初始化上傳標志,默認情況下設置為false
$msg = null; // 初始化消息變量,默認情況下設置為null// 檢查表單是否通過POST方法提交
if (isset($_POST['submit'])) {// 檢查上傳路徑是否存在if (file_exists(UPLOAD_PATH)) {// 定義不允許上傳的文件擴展名數組$deny_ext = array(".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess");// 獲取上傳文件的原始名稱$file_name = $_FILES['upload_file']['name'];// 刪除文件名末尾的點$file_name = deldot($file_name);// 獲取文件擴展名$file_ext = strrchr($file_name, '.');// 將擴展名轉換為小寫$file_ext = strtolower($file_ext);// 去除字符串::$DATA$file_ext = str_ireplace('::$DATA', '', $file_ext);// 檢查文件擴展名是否在禁止列表中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳文件的臨時路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 生成保存路徑和文件名,包含當前日期和隨機數$img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;// 嘗試將文件從臨時目錄移動到目標目錄if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 上傳成功,設置標志為true} else {$msg = '上傳出錯!'; // 移動文件失敗,設置錯誤消息}} else {$msg = '此文件不允許上傳'; // 文件擴展名在禁止列表中,設置錯誤消息}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳路徑不存在,設置錯誤消息}
}
分析可發現限制了大小寫,但是沒有對空格進行過濾,那咱們加個空格不就行了。試一試
成功
Pass-07
全禁止了?尊嘟假嘟,不信。我就要找一找試試先不看源碼
信了…
老老實實審計代碼吧
$is_upload = false; // 初始化上傳標志,默認情況下設置為false
$msg = null; // 初始化消息變量,默認情況下設置為null// 檢查表單是否通過POST方法提交
if (isset($_POST['submit'])) {// 檢查上傳路徑是否存在if (file_exists(UPLOAD_PATH)) {// 定義不允許上傳的文件擴展名數組$deny_ext = array(".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess");// 獲取上傳文件的原始名稱并去除空白$file_name = trim($_FILES['upload_file']['name']);// 獲取文件擴展名$file_ext = strrchr($file_name, '.');// 將擴展名轉換為小寫$file_ext = strtolower($file_ext);// 去除擴展名中的特殊字符串$file_ext = str_ireplace('::$DATA', '', $file_ext);// 去除空白字符$file_ext = trim($file_ext);// 檢查文件擴展名是否在禁止列表中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳文件的臨時路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 生成保存路徑和文件名$img_path = UPLOAD_PATH . '/' . $file_name;// 嘗試將文件從臨時目錄移動到目標目錄if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 上傳成功,設置標志為true} else {$msg = '上傳出錯!'; // 移動文件失敗,設置錯誤消息}} else {$msg = '此文件類型不允許上傳!'; // 文件擴展名在禁止列表中,設置錯誤消息}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳路徑不存在,設置錯誤消息}
}
分析后可以發現他沒有過濾末尾的.。也就是說在擴展名的末尾加個.就好了。
試一下
成功
Pass-08
咋和第五題的提示一樣,話不多說直接上源碼
$is_upload = false; // 初始化上傳標志,默認情況下設置為false
$msg = null; // 初始化消息變量,默認情況下設置為null// 檢查表單是否通過POST方法提交
if (isset($_POST['submit'])) {// 檢查上傳路徑是否存在if (file_exists(UPLOAD_PATH)) {// 定義不允許上傳的文件擴展名數組$deny_ext = array(".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess");// 獲取上傳文件的原始名稱并去除空白$file_name = trim($_FILES['upload_file']['name']);// 刪除文件名末尾的點$file_name = deldot($file_name);// 獲取文件擴展名$file_ext = strrchr($file_name, '.');// 將擴展名轉換為小寫$file_ext = strtolower($file_ext);// 去除空白字符$file_ext = trim($file_ext);// 檢查文件擴展名是否在禁止列表中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳文件的臨時路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 生成保存路徑和文件名,包含當前日期和隨機數$img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;// 嘗試將文件從臨時目錄移動到目標目錄if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 上傳成功,設置標志為true} else {$msg = '上傳出錯!'; // 移動文件失敗,設置錯誤消息}} else {$msg = '此文件類型不允許上傳!'; // 文件擴展名在禁止列表中,設置錯誤消息}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳路徑不存在,設置錯誤消息}
}
可以發現本題沒有去除字符串::$DATA,那咱們就加上試一試
成功
Pass-09
代碼審計
$is_upload = false; // 初始化上傳標志,默認情況下設置為false
$msg = null; // 初始化消息變量,默認情況下設置為null// 檢查表單是否通過POST方法提交
if (isset($_POST['submit'])) {// 檢查上傳路徑是否存在if (file_exists(UPLOAD_PATH)) {// 定義不允許上傳的文件擴展名數組$deny_ext = array(".php", ".php5", ".php4", ".php3", ".php2", ".html", ".htm", ".phtml", ".pht",".pHp", ".pHp5", ".pHp4", ".pHp3", ".pHp2", ".Html", ".Htm", ".pHtml",".jsp", ".jspa", ".jspx", ".jsw", ".jsv", ".jspf", ".jtml", ".jSp", ".jSpx", ".jSpa", ".jSw", ".jSv", ".jSpf", ".jHtml", ".asp", ".aspx", ".asa", ".asax", ".ascx", ".ashx", ".asmx", ".cer", ".aSp", ".aSpx", ".aSa", ".aSax", ".aScx", ".aShx", ".aSmx", ".cEr", ".sWf", ".swf", ".htaccess");// 獲取上傳文件的原始名稱并去除空白$file_name = trim($_FILES['upload_file']['name']);// 刪除文件名末尾的點$file_name = deldot($file_name);// 獲取文件擴展名$file_ext = strrchr($file_name, '.');// 將擴展名轉換為小寫$file_ext = strtolower($file_ext);// 去除特殊字符串 '::$DATA'$file_ext = str_ireplace('::$DATA', '', $file_ext);// 去除擴展名首尾的空白字符$file_ext = trim($file_ext);// 檢查文件擴展名是否在禁止列表中if (!in_array($file_ext, $deny_ext)) {// 獲取上傳文件的臨時路徑$temp_file = $_FILES['upload_file']['tmp_name'];// 生成保存路徑和文件名,包含當前日期和隨機數$img_path = UPLOAD_PATH . '/' . date("YmdHis") . rand(1000, 9999) . $file_ext;// 嘗試將文件從臨時目錄移動到目標目錄if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true; // 上傳成功,設置標志為true} else {$msg = '上傳出錯!'; // 移動文件失敗,設置錯誤消息}} else {$msg = '此文件類型不允許上傳!'; // 文件擴展名在禁止列表中,設置錯誤消息}} else {$msg = UPLOAD_PATH . '文件夾不存在,請手工創建!'; // 上傳路徑不存在,設置錯誤消息}
}
分析發現過濾了大小寫,空格,點以及數據流 , 但只過濾了一遍點和空格 , 我們在文件后綴名添加空格點空格點 ,或者是點空格點來繞過黑名單
搞定
Pass-10
會去除擴展名的話直接雙寫試試
成功
Pass-11
路徑,大概率是直接%00截斷
看一看源碼叭
用的是白名單那咱們就直接試一試
本題要求php版本小于等于5.3.4,否則會顯示上傳失敗
Pass-12
emmm直接代碼審計吧
依舊是白名單,只不過這個是post,和上一個操作方式一樣。
版本問題所以會顯示上傳失敗
Pass-13
先建一個php文件輸入內容
<?php echo "Are you OK";
?>
先自己生成一個圖片馬在Linux上需要用cat指令
cat 222.jpg 111.php > 333.jpg
cat 222.jpg 111.php > 333.png
cat 222.jpg 111.php > 333.gif
直接上傳圖片然后可以進入burp看一看抓到的這個post包進行分析,可以看到我在php里寫的內容
完成
Pass-14
和上一題一樣直接上傳圖片馬
檢驗方法和上題一樣
結案下一題
Pass-15
和上題一樣,直接上傳圖片馬
檢驗方法和上題一樣
這三題雖然步驟一樣,但是考點是不一樣
Pass-16
代碼審計
$is_upload = false; // 初始化上傳標志,默認情況下設置為false
$msg = null; // 初始化消息變量,默認情況下設置為nullif (isset($_POST['submit'])){ // 檢查表單是否通過POST方法提交// 獲得上傳文件的基本信息,文件名,類型,大小,臨時文件路徑$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];// 定義目標路徑$target_path = UPLOAD_PATH . '/' . basename($filename);// 獲得上傳文件的擴展名$fileext = substr(strrchr($filename, "."), 1);// 判斷文件后綴與類型,合法才進行上傳操作if (($fileext == "jpg") && ($filetype == "image/jpeg")) {if (move_uploaded_file($tmpname, $target_path)) {// 使用上傳的圖片生成新的圖片$im = imagecreatefromjpeg($target_path);if ($im == false) {$msg = "該文件不是jpg格式的圖片!";@unlink($target_path);} else {// 給新圖片指定文件名srand(time());$newfilename = strval(rand()) . ".jpg";// 顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH . '/' . $newfilename;imagejpeg($im, $img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}} else if (($fileext == "png") && ($filetype == "image/png")) {if (move_uploaded_file($tmpname, $target_path)) {// 使用上傳的圖片生成新的圖片$im = imagecreatefrompng($target_path);if ($im == false) {$msg = "該文件不是png格式的圖片!";@unlink($target_path);} else {// 給新圖片指定文件名srand(time());$newfilename = strval(rand()) . ".png";// 顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH . '/' . $newfilename;imagepng($im, $img_path);@unlink($target_path);$is_upload = true; }} else {$msg = "上傳出錯!";}} else if (($fileext == "gif") && ($filetype == "image/gif")) {if (move_uploaded_file($tmpname, $target_path)) {// 使用上傳的圖片生成新的圖片$im = imagecreatefromgif($target_path);if ($im == false) {$msg = "該文件不是gif格式的圖片!";@unlink($target_path);} else {// 給新圖片指定文件名srand(time());$newfilename = strval(rand()) . ".gif";// 顯示二次渲染后的圖片(使用用戶上傳圖片生成的新圖片)$img_path = UPLOAD_PATH . '/' . $newfilename;imagegif($im, $img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上傳出錯!";}} else {$msg = "只允許上傳后綴為.jpg|.png|.gif的圖片文件!";}
}
圖片進行二次渲染處理,這樣的話就算上傳圖片馬內容也會被重寫啊…
是我太菜了沒有一點思路
于是我在網上找了一些相關文章發現兩篇不錯的教程:
https://www.cnblogs.com/forforever/p/13191999.html
https://xz.aliyun.com/t/2657?time__1311=n4%2BxnieDw4uneG%3DD%2FWT4BKg34fobDGqIhD
初學者能力有限請見諒
解題感悟
掌握了很多思路與方法,這個靶場涵蓋了常見的漏洞,就算我不理解網上的教程咋都是在本地部署的環境,讓我這個在kali上進行解題的格格不入。。。。