Ce qui suit est une introduction à l'audit du framework ThinkPHP de la colonne du didacticiel du framework thinkphp. J'espère que cela sera utile aux amis dans le besoin !
Introduction à ThinkPHP
ThinkPHP est a Il s'agit d'un framework de développement PHP léger, orienté objet, gratuit et open source, rapide et simple. Il a été fondé début 2006 et publié dans le cadre de l'accord open source Apache2. Il est né pour le développement d'applications WEB agiles et le développement simplifié d'applications d'entreprise. ThinkPHP adhère au principe de conception simple et pratique depuis sa naissance tout en conservant d'excellentes performances et un code minimal, il se concentre également sur la facilité d'utilisation. Il possède de nombreuses fonctions et fonctionnalités originales. Grâce à la participation active de l'équipe communautaire, il a été continuellement optimisé et amélioré en termes de facilité d'utilisation, d'évolutivité et de performances. Il est devenu le cadre de développement d'applications WEB le plus leader et le plus influent en Chine. , avec de nombreux cas typiques, garantit qu'il peut être utilisé de manière stable pour le développement commercial et au niveau du portail.
Brève description de la vulnérabilité
Bien que le framework ThinkPHP 5.0.x utilise des requêtes pour faire fonctionner la base de données, mais dans les méthodes d'insertion et de mise à jour, les paramètres transmis sont contrôlables et non strictement filtrés, ce qui a finalement conduit à l'apparition de cette vulnérabilité d'injection SQL.
Analyse de la vulnérabilité d'injection SQL dans le framework ThinkPHP 5.0.x
thinkphpTéléchargez la version 5.0.15 sur le site officiel : http://www.thinkphp.cn/down/1125.html . Configurez la base de données, la base de données est tp, le nom de la table est utilisateur et il y a deux champs identifiant et nom d'utilisateur.
Modifier les informations de configuration de la base de données application/database.php, dans application/config.php Activez le débogage et la trace.
Ajouter une méthode à la classe Index dans application/index/controller/Index.php :
public function testsql() { $username = input('get.username/a'); db('user')->where(['id'=> 1])->insert(['username'=>$username]); }
Notre charge utile cette fois est :
http://127.0.0.1/thinkphp5.0.15/public/index.php/index/index/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1
L'explication est la suivante :
http://127.0.0.1/thinkphp/ public/ index.php/ index/ index/ index 域名 网站目录 对外访问目录 入口文件 前台 控制器 方法名
Extension :
À propos de la fonction updatexml UPDATEXML (XML_document, XPath_string, new_value) ;
Le premier paramètre : XML_document est au format String et est le nom de l'objet document XML. Le texte est Doc
Le deuxième paramètre : XPath_string (chaîne au format XPath). Si vous ne comprenez pas la syntaxe XPath, vous pouvez trouver des tutoriels sur Internet.
Le troisième paramètre : new_value, format String, remplace les données qualifiées trouvées
Fonction : Modifier la valeur du nœud qualifié dans le document
Accéder à la charge utile pour déclencher la vulnérabilité.
Analyse de vulnérabilité
首先,我们知道 insert 方法存在漏洞,那就查看 insert 方法的具体实现。
通过input获取到参数后,username变量情况如下:
跟入insert,thinkphp/library/think/db/Query.php
然后执行insert语句
$sql = $this->builder->insert($data, $options, $replace);
跟入 thinkphp/library/think/db/Builder.php
跟入parseData至 thinkphp/library/think/db/Builder.php
可以看出$val是数组,且根据$val[0]值为inc,会通过switch语句进入到’inc’:
此处的parseKey,即thinkphp/library/think/db/builder/Mysql.php
此处并未对传入的$key进行更多的过滤与检查,将其与前面经过parseKey的结果进行拼接后返回给result
至此注入成功。
漏洞修复
https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b
在进行dec和inc操作之前对$val[1]的值进行了再次确认。
总结
第一次审计Thinkphp框架 ,结合Thinkphp5.0手册以及网上教程完成此次漏洞的审计。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!