1。バックアップファイルを見つけます
1.カタログスキャンPython3 dirsearch.py.py -u http://10.10.10.175:32770 -E * 2。最後にindex.php.bkバックアップファイルを取得し、ダウンロードしてソースコードを表示すると、フラグ
flag:cyberpeace {855a1c4b3401294cb6604cccc98bde334} 010-10-101010101010101010101010101010101010101010101010101010101010101010情報が含まれています:cookie:look-here=cookie.php
2。次に、URL:http://220.249.52.13:41440/cookie.phpにアクセスし、テキストプロンプトを表示するHTTP応答を参照してください。 URL http://220.249.52.13:41440/cookie.phpにリクエストを行い、応答パッケージを表示すると、フラグ情報を確認できます。
4。最終フラグは、cyberpeace {71de0ba3c98781d7f78c4af6e5b684be}です。
3。Blag1ボタンの下に隠されています。 URLを開き、http://220.249.52.13:52359/、ボタンを見つけて、それを使用することはできません。現時点では、F12を通じて要素レビューが実行されます。2。 delete Disabled=''を削除し、[ボタン]をクリックしてフラグ
3を取得します。最終フラグは、cyberpeace {e61ed8f7f37f036a89f6d3c5622bb8e9} 4です。 URLを開き:http://220.249.52.1:35249/
2。ユーザー名管理者123456を入力すると、システムにログインしてフラグ3を取得できます。最終フラグは、CyberPeace {A136364C15E239B4F32B99D2D23E42CE} 3です。単純なファイルには、フラグを取得するための監査が含まれています
show_source(__ file__);
include( 'config.php'); $ a=@$ _ get ['a']; $ b=@$ _ get ['b'];
if($ a==0and $ a){
echo $ flag1;
}
if(is_numeric($ b)){
出口();
}
if($ b1234){
echo $ flag2;
}?このPHPコードの意味は、getメソッドを介してaとbの値を取得し、$ a==0と$ aがtrueの場合、flag1を取得します。Bが整数または数値文字列の場合、出口、$ b1234の場合、flag2を取得します。
基本知識:( PHPの弱いタイプの比較をマスター)PHP :の2つの比較記号
==:最初に文字列タイプを同じに変換し、次に比較します
===:最初に2つの文字列のタイプが等しいかどうかを判断し、次に比較します
==を使用すると、文字列は数値型に変換され、比較されます。
var_dump( 'a'==0); //true、この時点で、a stringの先頭に数値が見つからないため、a stringタイプは数に変換されます。
var_dump( '123a'==123); //true、here '123a'は123に変換されます
var_dump( 'a123'==123); //false、文字列の開始部分がその値を決定するというPHPに規定があるためです。文字列が法律番号で始まる場合、数は連続した最後の数字で終了するために使用されます。そうしないと、全体の値は比較すると0になります。
var_dump( 'root'==0);
var_dump( '22r22oot'==22); //true、最初に文字列22r222ootを0と同じ数値に変換します。文字列には法的価値があるため、継続的な法的価値が必要になります。 22==22なので、それは本当です。
var_dump( 'root22'==0); //true、最初に文字列root22を0と同じ数値に変換します。文字列には最初は法的値がないため、文字列root22は0に変換され、最後に0==0に変換されるため、真です。
var_dump( '0E170'=='0E180'); //true、文字列にはeで始まる値が含まれているため、PHPコードはそれを科学的表記全体と見なします。最後の0は170==0の電力に対するものです180のパワー、つまり0==0なので、それは真です
var_dump(0==='root'); //fals、===比較すると、最初に両側のタイプが等しいかどうかを判断します。値と文字列タイプは明らかに異なるため、有効ではありません
var_dump ('0e830400451993494058024219903391'=='0e830400451993494058024219904444');//true, first convert the strings 0e830400451993494058024219903391 and 0e830400451993494058024219904444それぞれ数値タイプに。両方の文字列は最初は法的価値を持っているため、文字列0E830400451993494058024219904444は0に変換され、最後に0==0に変換されるため、事実です。
var_dump( '123.a1bc'==123); //truevar_dump( '123.2abc'==123); //falsevar_dump( '123e2abc'==123); //falsevar_dump( '123ea1bc'==123);連続した数字が含まれている場合。 EまたはEは、文字列と数の比較を妨げます。浮動小数点数を表します。 EとEは科学的表記を表します。文字列にこれらが含まれている限り、上記の比較は、文字列の最初の部分を理想的に実装してその値を決定することはできません。文字列が法的値で始まる場合、この値を使用します。そうでなければ、その値は01です。ページを開き、コード監査を実施し、flag1が表示されると$ a==0と$ aの両方が満たされていることがわかります。
2。PHPの弱いタイプの比較は、「ABC」==0を真であるため、A=Cを入力すると、図に示すようにFLAG1を取得できます。 (ABCは任意の文字に置き換えることができます)。
http://220.249.52.13:53517/index.php?a=abc
3。IS_NUMERIC()関数は、それが数値文字列である場合、それが真で返され、それ以外の場合は偽りに戻り、PHPの弱いタイプの比較が比較されると、(「1234a」==1234)が真であると判断します。
a=abcb=1235aを入力すると、図に示すようにflag2を取得できます。
http://220.249.52.13:53517/index.php?a=abcb=12345f iv。 Post and Get Methodのflag1。 GETメソッドを構築して、http://220.249.52.133:48752/index.php?a=1
2。次に、ページのプロンプトに従って、Firefox、B=2のプラグインハックバーを介して投稿データを送信すると、フラグ
5。httpヘッダー擬似バイパス制限アクセスアクセスを取得してフラグの基本知識を取得できます。
通常、HTTPヘッダーのX-forwarded-forフィールドを直接変更して、リクエストの最終的なアイレファーをコピーすることができます。 XFFと同様に、参照者も直接変更できます。
1. URL http://220.249.52.1:54968/を開き、プロンプトはにアクセスするために123.123.123.123のソースIPでなければなりません
2。パケットをつかむことにより、HTTPヘッダーにXFFフォード要求ヘッダー、X-For:123.123.123.123を追加してから、応答ページが含まれていることを確認する必要があります。ここに追加する必要があります3:https://www.google.com、そしてフラグを取得するためにアクセス
最終的にflag:cyberpeace {f116fe3f881eef96edaaf3159a3131f8159a313131f81596
6。フラグの基本知識を取得するリモートコマンド実行: command1 command2 Windowsまたはlinux execute command1の下で、最初に実行してから、command2を実行します。 command1 | command2のみcommand2が実行されます。 command1 command2 execute command2を最初に実行し、次にcommand1を実行します。 command1 || command2 first execute command1。 FALSEの場合は、command21を実行します。 IPアドレスを入力してください。ここから127.0.0.1に最適です。エコーが発生した場合、コマンド実行2があります。コマンドを追加することにより:127.0.0.1 | /-name flag.txtをバックドアに検索すると、ディレクトリは /home/flag.txt
3です。コマンド127.0.0.1 |を使用しますflag.txt
のflagを表示するcat /home/flag.txtは、flag:cyberpeace {400F6C86F9DD25994AFB930D13CC28B8}を取得しました。
JSコードがフラグを取得して環境に入ると、パスワード入力が発生した後、パスワードを何気なく入力し、コード監査のためにOK をクリックして、何が入力されても、偽のパスワードにジャンプすることがわかりました。実際のパスワードは、Charcodeからの実行プロセスにあります。
1.最初に、deChiffreの機能を定義します。まだ呼ばれていないので、気にしないでください
注:最初に変換します\ x35 \ x35 \ x2c \ x35 \ x36 \ x2c \ x35 \ x34 \ x2c \ x37 \ x39 \ x2c \ x31 \ x31 \ x35 \ x2c \ x36 \ x39 \ x2c \ x31 \ x31 \ x34 \ x2c \ x31 \ x34 \ x2c \ x31 \ x31 \ x36 \ x2c \ x31 \ x30文字列への16進数、Python、またはURLで印刷:https://www.bejson.com/convert/ox2str/
出力結果55、56、54、79、115、69、114、116、107、49、50
2。decute string ['from charcode'](deChiffre('55、56,54,79,115,69,114,116,107,49,50)
'));
3. DeChiffreを呼び出し、DeChiffre関数を実行します
string ['fromcharcode'](deChiffre('55、56,54,79,115,69,114,116,107,49,50
'));
(1)最初、'55、56,54,79,115,69,114,116,107,49,50
'deChiffre関数を導入して実行します
')
(2)その後、パス変数が表示され、今のところそれを入れます
(3)pass_enc='55、56,54,79,115,69,114,116,107,49,50 '
pass_enc文字列を文字列配列に分割し、タブパラメーターに割り当てます。
TAB=[55,56,54,79,115,69,114,116,107,49,50]注:TABは現時点では文字列配列です!
(3)その後のパスセグメンテーションもその後です
Tab2=[70,65,85,88,32,80,65,83,83,87,82,68,32,72,65,72,65]
(4)変数割り当てコード分析:var i、j、k、l=0、m、n、o、p=''; i=0; j=tab.length;
最初は、I、j、k、m、n、o、割り当てがなく、未定義であり、他のパラメーターl=0、p=''、後でIが割り当てられ、jは11に割り当てられます
(5)この時点で、nは0に割り当てられているため、k=11+0+0に割り当てられ、最終的に等しい11注:ここ(l)は英語の文字lであり、ナンバー1ではありません
(6)10行目、n=18
(7)ループの最初の場合、コードを簡素化します。
for(i=0; i(18); i ++)
{o=tab [i-l]; p +=string.fromCharcode((o=tab2 [i]));
if(i==5)break;}
説明:前のo=tab [i-1]は役に立たない。これは、o=tab2 [i]の値によって再オーバーされるためです。
最初のループ:o=tab [0]; p=p+string.fromcharcode((o=tab2 [0])
=o=70; p=''+string.fromcharcode(70)=p=英語文字f
二度目.
三度目.
4回目.
5回目.
したがって、ループのこれの最後のPは(ここで知っている限り出力はありませんが)
(8)ループの2番目、コードを簡素化します。
for(i=0; i 18; i ++){
o=tab [i-l];
if(i 5 i 17)
p +=string.fromCharcode((o=tab2 [i]));
}
説明:ここのループの場合は、上記に似ています。ここでのP値は、最初のループが実行された後、今では偽物になることに注意してください。
ループの最初のp値を追加すると、最後のpはフェイクパスワードですhah
(9)P +=String.FromCharcode(Tab2 [17]);
Tab2=[70,65,85,88,32,80,65,83,83,87,82,68,32,72,65,72,65]
したがって、P=フェイクパスワードhah + a
したがって、最後のpはフェイクパスワードハハです
(10)pass=p;リターンパス;
つまり、pass=fauxパスワードhaha;フェイクパスワードを返しますハハ;
最後の関数出力はフェイクパスワードハハです
3。デコヒフル関数が実行された後、他のコードを実行し続けます。
h=window.prompt( 'パスワードを入力');
アラート(deChiffre(h));
H=ポップアップボックスに入力するコンテンツ
その後、DeChiffre(H)の価値がポップアップします。以前のすべてのコードから、コード内のPの値はタブとは何の関係もないことがわかります。最終的にはTab2の値に置き換えられるためです。したがって、入力は何であろうと、Pass_enc=h、入力hの等しいものに関係なく、タブを文字列配列に分割できるかどうか、または存在するかどうかに関係なく、Tab2のみを使用します。素人の用語では、タブのパラメーターと値の両方がなしと見なすことができるため、Pass_encパラメーターが何であるかは意味がありません。
4.最後に、結論は、ポップアップボックスにどのような価値を入力しても、偽のパスワードを返すだけであるということです
私はただ推測するだけですstring ['fromcharcode'](deChiffre( '\ x35 \ x35 \ x2c \ x35 \ x36 \ x2c \ x35 \ x34 \ x2c \ x37 \ x39 \ x2c \ x31 \ x31 \ x35 \ x2c \ x39 \ x39 \ x39 \ x2c \ x31 \ x31 \ x31 \ x34 \ x2c \ x36 \ x39 \ x2c \ x31 \ x31 \ x34 \ x2c \ x 31 \ x31 \ x36 \ x2c \ x31 \ x30 \ x37 \ x2c \ x34 \ x39 \ x2c \ x35 \ x30 '));この構文は間違っており、計算されていない最後の正しい値は正しい値ではありません。つまり、フラグ〜
したがって、Pass_encパラメーターへの入力に関係なく、Fauxパスワードの機能が表示されるように使用しません。また、私たちはそれを放棄し、コードを書き直し、自分で実行します。
!doctype html
HTML
頭
メタcharset='utf-8'
/頭
体
スクリプト
var n=string.fromCharcode(55,56,54,79,115,69,114,116,107,49,50);
document.write(n);
/スクリプト
/体
/HTML
最終結果は次のとおりです:786osertk12
Pythonスクリプトを介してヘキサデシマルをASICエンコードに変換します
a=[55,56