ブラシのタイトルレコード:[LCTF] bestphpの復讐

ブラシのタイトルレコード:[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を担持することにより得ることができます

おすすめ

転載: www.cnblogs.com/20175211lyz/p/11515519.html