secskill
  • Introduction
  • 1.web应用漏洞
    • 1.1 SQL注入漏洞
      • 1.1.1 type注入利用
      • 1.1.2 mothod注入利用
      • 1.1.3 按照效果注入利用
      • 1.1.4 order,limit和from后的注入
      • 1.10.1 sqlmap使用
    • 1.2 目录遍历漏洞
    • 1.3 跨站脚本漏洞
      • 1.3.10 flash xss
      • 1.3.11 Uxss
    • 1.4 未过滤HTML代码漏洞
    • 1.5 数据库运行出错
    • 1.6 Flash安全配置缺陷漏洞
    • 1.7 编辑器漏洞
      • 1.7.1 kindeditor编辑器漏洞
        • 1.7.1.1 kindeditor<=4.1.5文件上传漏洞
      • 1.7.2 fckeditor编辑器漏洞
        • 1.7.2.1 fckeditor<=2.6.4文件上传漏洞
    • 1.8 URL Redirect漏洞
    • 1.9 任意文件上传漏洞
    • 1.10 敏感信息泄露漏洞
    • 1.11 未加密登陆请求漏洞
    • 1.12 后台弱口令漏洞
    • 1.13 后台口令暴力破解漏洞
    • 1.14 跨站请求伪造漏洞
    • 1.15 Unicode 编码转换漏洞
    • 1.16 Possible .Net Error Message
    • 1.17 发生内部错误漏洞
    • 1.18 旁站攻击漏洞
    • 1.19 后台登录页面绕过
    • 1.20 Possible PHP Error Message
    • 1.21 UrlPath Pollution
    • 1.22 File Operation-Web.xml漏洞
    • 1.23 短文件名泄漏漏洞
    • 1.24 OS注入漏洞
    • 1.25 SOAP注入漏洞
    • 1.26 SMTP注入漏洞
    • 1.27 LDAP注入漏洞
    • 1.28 命令执行漏洞
    • 1.29 HTTP消息头注入漏洞
    • 1.30 验证机制缺陷漏洞
    • 1.31 越权漏洞
    • 1.31 服务端请求伪造漏洞
    • 1.32 xxe漏洞
    • 1.33 逻辑漏洞
    • 1.34 支付漏洞
      • 1.34.1 支付漏洞
    • 1.35 cors漏洞
      • 1.35.1 cors
    • 1.36 jsonp漏洞
    • 1.37 点击劫持漏洞
    • 1.38 框架注入漏洞
    • 1.39 文件包含漏洞
    • 1.40 CRLF注入漏洞
    • 1.41 SSTI漏洞
  • 2.中间件漏洞
    • 2.1 IIS
      • 2.1.1 CVE-2017-7269
    • 2.2 Apache
    • 2.3 Axis2
    • 2.4 lighttpd
    • 2.5 Tomcat
      • 2.5.1 CVE-2017-12615
    • 2.6 Nginx
    • 2.7 WebLogic
    • 2.8 JBoss
    • 2.9 Websphere
    • 2.10 Struct2
    • 2.11 XAMMP
    • 2.12 LAMPP
    • 2.13 FastCGI
    • 2.14 PHPCGI
    • 2.15 JOnAS
    • 2.16 Joomla
      • 2.16.1 CVE-2017-8917
    • 2.17 Padding oracle
    • 2.18 Jenkins
      • 2.18.1 CVE-2019-1003000
      • 2.18.2 CVE-2017-1000353
    • 2.18 Drupal
      • 2.18.1 CVE-2019-6340l
    • 2.19 PHPGD
      • 2.19.1 CVE-2019-6977
    • 2.20 PhpMyAdmin
      • 2.20.1 CVE-2016-5734
      • 2.20.2 反序列化漏洞
      • 2.20.3 CVE-2018-12613
    • 2.21 PHP
      • 2.21.1 extract
      • 2.21.2 strcmp
      • 2.21.3 urldecode
      • 2.21.4 md5
      • 2.21.5 strpos
      • 2.21.6 is_numeric
      • 2.21.7 sha
      • 2.21.7 ereg
      • 2.21.8 creat
  • 3.系统漏洞
    • 3.1 DNS域传送漏洞
    • 3.2 SSH Services Port 22 Enabled
    • 3.3 NetBIOS Services Port 139 Enabled
    • 3.4 OpenSSL 漏洞
    • 3.5 docker remote API漏洞
    • 3.6 Samba远程代码执行漏洞
    • 3.7 Windows系统漏洞
      • 3.7.1 ms17-010
      • 3.7.2 ms08-067
      • 3.7.3 ms16-075
      • 3.7.4 CVE-2017-0213
      • 3.7.5 ms16-135
      • 3.7.6 CVE-2018-8120
      • 3.7.7 CVE-2018-0824
    • 3.8 linux系统漏洞
      • 3.8.1 ubuntu
        • 3.8.1.1 CVE-2015-1328
        • 3.8.1.2 CVE-2017-16995
    • 3.9 openssh漏洞
      • 3.9.1 cve-2016-6515
  • 4.网络漏洞
    • 4.1 ARP欺骗嗅探漏洞
    • 4.2 反弹shell的N种姿势
    • 4.3 DNS欺骗
  • 5.cms漏洞
    • 5.1 08cms
    • 5.2 74cms
    • 5.3 Appcms
    • 5.4 Aspcms
    • 5.5 Bluecms
    • 5.6 Cscms
    • 5.7 Dedecms
    • 5.8 Discuz
      • 5.8.1 Discuz任意文件删除
    • 5.9 Dkcms
    • 5.10 Ecshop
    • 5.11 Finecms
    • 5.12 Fscms
    • 5.13 Jeecms
    • 5.14 Ibcms
    • 5.15 Maccms
    • 5.16 Php168
    • 5.17 Phpcms
    • 5.18 Phpmywind
    • 5.19 Phpwind
    • 5.20 Phpweb
    • 5.21 Qibocms
    • 5.22 Seacms
    • 5.23 Shopex
    • 5.24 Thinkphp
      • 5.24.1 SQL
      • 5.24.2 RCE
      • 5.24.3 RCE2
    • 5.25 Typecho
    • 5.26 Wordpress
      • 5.26.1 Wordpress Plugin_sql
    • 5.27 Xycms
    • 5.28 Zabbix
    • 5.29 Zblog
    • 5.30 Zzcms
Powered by GitBook
On this page
  • extract()
  • 齐博cms7.0分析
  • 修复

Was this helpful?

  1. 2.中间件漏洞
  2. 2.21 PHP

2.21.1 extract

Previous2.21 PHPNext2.21.2 strcmp

Last updated 6 years ago

Was this helpful?

extract()

extract()函数使用参考

漏洞产生原因:

extract()函数当只有一个参数时,默认的第二参数是:EXTR_OVERWRITE,如果有变量发生冲突,则覆盖已有的变量。

参考代码:

    <?php
    $flag='xxx';
    extract($_GET);
    if(isset($shiyan))
    {
        $content=trim(file_get_contents($flag));
        if($shiyan==$content)
        {
            echo'flag{xxx}';
        }
        else
        {
            echo'Oh.no';
        }
    }
    ?>

我们大体上分析一下代码逻辑,使用get方式获取一个值,然后使用extract方法使他变成一个变量,然后判断是否已经声明了$shiyan这个变量名,若未声明则输出‘Oh.no’,若已经声明,则使用file_get_contents方法将$flag的值转换为字符串,然后使用trim方法去除字符串两侧的空白字符或其他预定义字符,然后判断$shiyan的值是不是==$content的值,若等于,则输出flag

在之前我们已经说过,extract()函数当只有一个参数时,默认的第二参数是:EXTR_OVERWRITE,如果有变量发生冲突,则覆盖已有的变量。而在php中null == "string" --> true

所以我们现在需要解决的问题就是:

  • if(isset($shiyan)) --> TRUE

  • if($shiyan==$content) --> TRUE

先给出最后的payload:

http://123.206.87.240:9009/1.php?shiyan=
http://123.206.87.240:9009/1.php?shiyan=&flag=
http://123.206.87.240:9009/1.php?shiyan=&content=
http://123.206.87.240:9009/1.php?shiyan
http://123.206.87.240:9009/1.php?shiyan&flag
http://123.206.87.240:9009/1.php?shiyan&content
http://123.206.87.240:9009/1.php?shiyan=999&flag=data://,999

因为我们知道,最基本的条件就是需要一个变量$shiyan才能进行下面的操作,所以我们最基本的就是传入一个$shiyan变量。

以第一个payload为例:

http://123.206.87.240:9009/1.php?shiyan=
http://123.206.87.240:9009/1.php?shiyan

此时就相当于传入了一个值为null的变量$shiyan,而null==string,所以可以输出flag

第二个payload:

http://123.206.87.240:9009/1.php?shiyan=&flag=
http://123.206.87.240:9009/1.php?shiyan&flag

此时就相当于传入了一个值为null的变量$shiyan和一个值为null的变量$flag,而传入的flag又会覆盖掉本来存在的$flag,使得$content的值=null,所以可以输出flag

第三个payload:

http://123.206.87.240:9009/1.php?shiyan=&content=
http://123.206.87.240:9009/1.php?shiyan&content

这个跟第二个同理,只是这个覆盖了$content的值,使得$content的值=null,所以可以输出flag

第四个请自行思考。

另一个例子:

    extract($_POST);
    function goAway() {
      error_log("Hacking attempt.");
      header('Location: /error/');
    }
    if (!isset($pi) || !is_numeric($pi)) {
      goAway();
    }
    if (!assert("(int)$pi == 3")) {
      echo "This is not pi.";
    } else {
      echo "This might be pi.";
    }

这个很明显就是存在一个变量覆盖漏洞,如我们传入一个?pi=phpinfo();进去,就会导致任意代码执行。

齐博cms7.0分析

具体分析地址:

漏洞的原因就是 inc/common.inc.php 中的这一段代码:

    if(!ini_get('register_globals')){  
        @extract($_FILES,EXTR_SKIP);  
    }

这段代码的含义就是把 php接收到的$_Files 请求的数组转换成一些变量。而我们知道,这些变量是不会经过魔术引号的转义的。 再看 member/comment.php 这个文件,如下代码:

    if($job=='del'){  
          foreach( $cidDB AS $key=>$value){  
            $rs=$db->get_one("SELECT aid FROM {$pre}comment WHERE cid='$value'");  
            $erp=get_id_table($rs[aid]);  
            $rsdb=$db->get_one("SELECT C.cid,C.uid AS commentuid,C.aid,A.uid,A.fid FROM {$pre}comment C LEFT JOIN {$pre}article$erp A ON C.aid=A.aid WHERE C.cid='$value'");  
            if($rsdb[uid]==$lfjuid||$rsdb[commentuid]==$lfjuid||$web_admin||in_array($rsdb[fid],$fiddb)){  
                $db->query("DELETE FROM {$pre}comment WHERE cid='$rsdb[cid]'");  
            }  
            $db->query("UPDATE {$pre}article$erp SET comments=comments-1 WHERE aid='$rsdb[aid]'");  
        }  
        refreshto("$FROMURL","删除成功",0);  
    }

其中 $cidDB 这个变量本应该是从URL里面通过get方式获取的留言的id ,然后拼到sql语句里面执行sql的。

但是因为 comment.php引用了common.inc.php,并且$cidDB并没有初始化,所以这边我们可以用 $_Files里面的变量去直接给 $cidDB 赋值,并且没有转义。

构造poc:

然后将我们的payload命名为文件名即可。

修复

1、设置register_globals=OFF

2、在调用extract()时使用EXTR_SKIP

http://www.w3school.com.cn/php/func_array_extract.asp
http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.96tpib&id=13