ディレクトリ
ブラシのタイトルレコード:[LCTF] bestphpの復讐
経常トピックリンク:https://buuoj.cn/challenges
参考リンク:https://xz.aliyun.com/t/3341#toc-22
LCTF WEBのPHPデシリアライズから問題を参照するには、符号
LCTF2018-bestphpの復讐詳細な説明
これは、WebサインLCTFの問題ですか??済みません。今日は、タイトルの後ろのビットとなっています。。。。
まず、知識
チェーンリンクによって形成され、これらの点の知識なので、私は話す
セッションデシリアライズ- >石鹸(SSRF + CRLF) - > call_user_func 石鹸ベース活性化
1、のSoapClientトリガ、デシリアライゼーションリードSSRF
異なる方法で2、serialize_hander処理セッションセッション噴射結果
3、CRLFの脆弱性
第二に、問題解決のためのアイデア
まず、PHPの直列化復元できませんクラスはPHPのネイティブクラス参照を呼び出すことができ
デシリアライズPHPのネイティブ型使用して、
ペーストソースとPOCスピーキングを
//index.php
<?php
highlight_file(__FILE__);
$b = 'implode';
call_user_func($_GET[f],$_POST);
session_start();
if(isset($_GET[name])){
$_SESSION[name] = $_GET[name];
}
var_dump($_SESSION);
$a = array(reset($_SESSION),'welcome_to_the_lctf2018');
call_user_func($b,$a);
?>
//flag.php
session_start();
echo 'only localhost can get flag!';
$flag = 'LCTF{*************************}';
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
$_SESSION['flag'] = $flag;
}
only localhost can get flag!
それは考えることは容易でf
入ってくるextract
、我々が何をしたいの関数としてカバーB、問題はバックセッションを使用することです。
前記第一SoapClient
の基準は、いくつかの質問からSOAPのセキュリティ問題を参照してくださいCTF
SOAP(シンプルオブジェクトアクセスプロトコル)は、クライアントとWebサービスやWebサービスとの間の接続またはインタフェースです。
データ転送として、基礎となる通信プロトコル、XML形式としてHTTPを採用した
SOAPメッセージが送信端から実質的に一方向送信終了を受け、彼らはしばしば同様の複合要求/応答モードを実行します。
私たちは、逆シリアル化を呼び出すことができるのであればSoapClient
するflag.php
要求を送信し、それがSSRFを達成することができます
私は、解決すべき問題点を取りました:
- どこトリガーデシリアライズ
- デシリアライズされたの内容を制御する方法
ここでは、知っている必要がありcall_user_func()
、着信パラメータがある場合、関数をarray
配列のメンバー、クラス名とメソッドになり、たとえば、あなたがこの質問を始めることができるように、例のタイプextract()
にカバーB call_user_func()
、reset($_SESSION)
つまり$_SESSION['name']
、我々は渡すことができますname=SoapClient
最終的には、その後は、call_user_func($b, $a)
となりcall_user_func(array('SoapClient','welcome_to_the_lctf2018'))
、つまりcall_user_func(SoapClient->welcome_to_the_lctf2018)
起因して、SoapClient
何のクラスにwelcome_to_the_lctf2018
この方法では、それは魔法のメソッドを呼び出しません__get()
要求を送信するために、
それSoapClient
どのようにコンテンツコントロールそれ、POCギャングのペースト
<?php
$target = "http://127.0.0.1/flag.php";
$attack = new SoapClient(null,array('location' => $target,
'user_agent' => "N0rth3ty\r\nCookie: PHPSESSID=tcjr6nadpk3md7jbgioa6elfk4\r\n",
'uri' => "123"));
$payload = urlencode(serialize($attack));
echo $payload;
ここでもCRLF、参照含む[予約]を例えばCRLFインジェクション脆弱性分析を使用し、私の理解は、HTTPリクエストは、2つの成立だからである\r\n
他の単語を%0d%0a
、体として残りの部分が、ヘッダ解析として前半意志頭が制御可能である場合ので、あなたはCRLFは、HTTP要求パケットを変更達成注入することができます。私の理解が間違っている場合は、私の兄を修正してください。
POCのCRLFはflag.php訪問し、としてクッキーに結果を保存するために偽の要求を使用することであるPHPSESSID=tcjr6nadpk3md7jbgioa6elfk4
セッション。
最後に、PHPは、制御結果をデシリアライズ作成する方法です。これは、機構のphp抗シーケンスを必要とします。
セッションのPHPの内容がメモリにではなく、ファイルを保存する方法、保存が決定されるべきものであり、デフォルトのファイルは、構成アイテムsession.save_handlerによって保存されています。
Sess_sessionid保存されたファイルは、ファイルの内容は、セッション値の後に、シーケンスの内容で、名前を付けることになっています。
php.iniの3つの設定項目が存在します:
session.save_path="" --设置session的存储路径
session.save_handler="" --设定用户自定义存储函数,如果想使用PHP内置会话存储机制之外的可以使用本函数(数据库等方式)
session.serialize_handler string --定义用来序列化/反序列化的处理器名字。默认是php(5.5.4后改为php_serialize)
内蔵の時間PHPプロセッサは、3つの異なる処理形式に対応し、あまり一般的に使用される$ _SESSIONデータシリアライゼーションおよびデシリアライゼーションを、格納するために使用されるであろう。
プロセッサ | ストレージ・フォーマットに対応 |
---|---|
PHP | + +キーを介して垂直シリアライズ()関数の値のデシリアライゼーション・プロセス |
php_binaryという | + +キーシリアライズ()関数の値をデシリアライズプロセスの後にキー名の長さに対応するASCII文字 |
php_serialize(PHP> = 5.5.4) | シリアライズ()アレイ処理機能の逆シリアル化後 |
設定オプションのsession.serialize_handlerオプションを使用して、デシリアライズシリアライズするとき、プロセッサが提供して使用することができます。
プロセッサは、PHP $ _SEESIONデータ保存デシリアライズに使用し、異なるプロセッサの使用をシリアル化した場合、原因のデータが正しく、特別な偽造、偽造、さらには任意のデータにより、デシリアライズすることはできません。
保存処理がphp_serialize処理呼び出すPHPは、次にある場合、噴射時間データ場合a=|O:4:"test":0:{}
、セッションの内容はa:1:{s:1:"a";s:16:"|O:4:"test":0:{}";}
、その後a:1:{s:1:"a";s:16:"
、PHPキーに分割すること、テストオブジェクトは、後で注射です。
我々は始まったばかりcall_user_func
、使用されていない構築することができsession_start(['serialize_handler'=>'php_serialize'])
、注射の効果を達成します。
第三に、問題解決の手順
得られた第1の噴射セッションPOC
トリガ、デシリアライゼーション送信要求のSoapClientので、
クッキーアクセスフラグPOCを担持することにより得ることができます