0x01:
檢查源代碼,發現JS前端驗證,關閉JS即可連接,或者手動添加.php,或者上傳1.jpg,再抓包修改為php
0X02:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
僅存在判斷connect-type,抓包修改為image/jpeg,image/png,image/gif,BP抓包,可上傳
0X03:
查看源碼,嘗試用php3,phtml繞過
0X04:
黑名單驗證:(包含了所有的黑名單文件)
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".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",".ini");
.htaccess文件,全稱為Hypertext(超文本入口),提供了針對目錄改編配置的方法,在一個特定的文檔中放置一個包含一個或者多個指令的文件,以作用於此目錄及其所有子目錄。作為用戶,所能使用的命令受限制,管理員可以通過Apache的AllowOverride來設置
0上傳.htaccess文件,寫入SetHandler application/x-httpd-php,所有文件解析為PHP
然后上傳<?php phpinfo(); ?> 可以解析
0x05:
邏輯繞過和第十關一樣 加上一個空格
0x06:
$file_name = strtolower($file_ext) //轉換為小寫
源碼沒有大小寫,轉為為2.PhP,可以上傳
0x07:
沒有$file_ext = trim($file_ext) 沒有首尾去空
0x08:
沒有進行.處理,利用windows特性,會自動去除后綴的.,后綴加.進行繞過
0X09:
沒有進行::DATA繞過,可在后綴名加::DATA繞過
::DATA會把這之后的數據當成文
件流處理,且不會檢查后綴名,保持之前的::DATA之前的文件名
$file_ext = str_ireplace('::DATA','',file_ext); 上傳成功出現403頁面,不能正常解析
0x0A:
先進行去除最后的.操作,再進行首位去空操作
修改文件名為info.php. . 經過處理后稱為upload_path/info.php.
0X0B:
$fire_name = str_ireplace("deny_")(deny_ext,"",$file_name) 把帶有黑名單中的后綴變為空
例子:
echo str_ireplace("world","shanghai","world world!")
hello shanghai
上傳.pphphp
循環過濾還是遞歸過濾
接下來為白名單繞過
0X0C:
00繞過。。。文件系統讀到0X00時,會認為文件已經結束。利用00截斷就是利用程序員在寫程序時對文件的上傳路徑過濾不嚴格,產生0X00,%00上傳截斷。
因為php的底層基於C語言開發的,c語言的截斷就是%00截斷
抓包將info.php.jpg后面的一個.換為0x00,在上傳時,當系統文件讀到0x00時,會認為文件已經結束。從而將info.php.jpg的內容寫入到evil.php中,從而達到攻擊的目的。
0X0D:
GET型和POST型
0X0E,OXOF:
getimagesize() 函數將測定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 圖像文件的大小並返回圖像的尺寸以及文件類型和一個可以用於普通 HTML 文件中 IMG 標記中的 height/width 文本字符串。 如果不能訪問 filename 指定的圖像或者其不是有效的圖像,getimagesize() 將返回 FALSE 並產生一條 E_WARNING 級的錯誤。
0XA1:
圖片馬
0XA2:
。。。圖片渲染 winhex可改
0XA3:
條件競爭
0XA4:
圖片馬
0XA5:
空格
0XA6:
數組
explode() 函數把字符串打散為數組,end() 函數將數組內部指針指向最后一個元素,並返回該元素的值(如果成功),這里是取post參數數組中的最后一個文件名。reset() 函數將內部指針指向數
組中的第一個元素,並輸出。
可控點是save_name:
傳空/字符串
則取上傳文件名
如果上傳conn19.php.jpg,會遇到explode分割為數組:
$file[0]=conn19,$file[1]=php $file[2]=jpg
$ext=jpg可以過白名單
但是reset($file)=conn19.$file[3-1]=jpg就是圖片了
所以這里應該用到save_name,而且要傳數組(傳字符串就和空一樣效果)
傳數組
save_name[3]=conn19.php
save_name[5]=jpg
$ext=jpg過白名單
reset($file)=conn19.php $file[1]=null
就成功上傳conn19.php.(多出個點但是windows自動去掉了沒影響)
還可以嘗試
1=conn19
2=php
3=jpg
或者Pass19的00截斷
0=conn19.php(0x00)
1=jpg
注:沒有詳細說明的靶場會在滲透測試體系化學習筆記會補充