专栏首页Deen的代金券日记2018上海大学生安全竞赛web3解析
原创

2018上海大学生安全竞赛web3解析

直接给源码吧:

<?php
    //error_reporting(0);
    //$dir=md5("icq" . $_SERVER['REMOTE_ADDR']);
    $dir=md5("icq");
    $sandbox = '/var/sandbox/' . $dir;
    @mkdir($sandbox);
    @chdir($sandbox);

    if($_FILES['file']['name']){
        $filename = !empty($_POST['file']) ? $_POST['file'] : $_FILES['file']['name'];
        if (!is_array($filename)) {
            $filename = explode('.', $filename);
        }
        $ext = end($filename);
        if($ext==$filename[count($filename) - 1]){
            die("emmmm...");
        }
        $new_name = (string)rand(100,999).".".$ext;
        move_uploaded_file($_FILES['file']['tmp_name'],$new_name);
        $_ = $_POST['hehe'];
        if(@substr(file($_)[0],0,6)==='@<?php' && strpos($_,$new_name)===false){
            include($_);
        }
        unlink($new_name);
    }
    else{
        highlight_file(__FILE__);
        

先看后缀名绕过吧。看着有点熟悉,总感觉在哪见过,后来才想起是pwnhub的公开赛里见过,考察的是end()函数。给个例子输出就清楚了。

<?php
	$a[2] = '222';
	$a[1] = '111';
	$a[0] = '000';
	
	$end = end($a);
	var_dump($end);
	
	$arr = $a[count($a)-1]
	var_dump($arr);


?>

输出结果:

end输出输入顺序最后一个

所以这里绕过是文件名取$_POST'file'绕过

至于下面unlink的绕过,有两种解法,一种是加/.,一种是../绕过。

我本地搭建更换了目录,可以看到已经成功写入

加/. unlink无法删除是linux下的特性,windows并不适用。

接下来传入hehe参数,爆破包含即可。

至于加../,产生的随机数会生成会被当成路径。

然后直接包含我们的文件即可。

看下当前目录

生成了shell.php,也成功写入了。

这里加 /. 和 ../ unlink都没删除,p牛小密圈给过解释

查看php源码,其实我们能发现,php读取、写入文件,都会调用php_stream_open_wrapper_ex来打开流,而判断文件存在、重命名、删除文件等操作则无需打开文件流。

我们跟一跟php_stream_open_wrapper_ex就会发现,其实最后会使用tsrm_realpath函数来将filename给标准化成一个绝对路径。而文件删除等操作则不会,这就是二者的区别。

所以,如果我们传入的是文件名中包含一个不存在的路径,写入的时候因为会处理掉“../”等相对路径,所以不会出错;判断、删除的时候因为不会处理,所以就会出现“No such file or directory”的错误。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • thinkphp5 RCE分析及复现

    tp5最近爆了个rce,最先看到是在斗鱼src公众号上发的分析文章,这么大的洞,到了第二天那些什么安全网站连个预警都没有,估计tp5的站都被撸穿了。

    Deen_
  • 我的GraphQL安全学习之旅

    GraphQL是Facebook的一个开源项目,定义了一种查询语言,用来代替传统的RESTful API。看到QL这样的字眼,很容易产生误解,以为是新的数据库查...

    Deen_
  • 破解某单机游戏到学习fiddler脚本改包

    前段日子出去玩了,游山玩水的,网太差,就下了个单机耍耍。水墨风,打斗效果挺不错的(那么,请问哪里能够下载到呢?)

    Deen_
  • 【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈

    这几年物联网发展迅猛,各种新产品、新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议栈。

    armfly
  • Python提取PDF第一页为封面图片【批量提取】

    近期要处理一批PDF文件,大约在20G,具体数量不详,需求是把每个文件的页数和第一页转换成图片,在网上查阅各种类库,最终选择的是PyMuPDF模块。最后核心代码...

    申霖
  • 使用vue实现行列转换的一种方法。

      行列转换是一个老生常谈的问题,这几天逛知乎有遇到了这个问题。一个前端说,拿到的数据是单列的需要做转换才能够绑定,折腾了好久才搞定,还说这个应该后端直接出数据...

    用户1174620
  • 真的吗?算法谋取暴利,让你多花钱

    大数据文摘
  • 行为型模式:命令模式

    Encapsulate a request as an object,thereby letting you parameterize clients with...

    LieBrother
  • 基于OpenCV无参考图像的质量评价

    opencv 3.4.4 安装:pip install opencv-python

    用户2249745
  • 几个JQuery,Html5,MVC开发资料链接

    老板给了任务去上个课学习一下ASP.Net MVC 4的开发,大致的了解了一下,需要学习的东西挺多,暂时把官方的几个链接放在这里,提醒自己抽出时间来学习。

    崔文远TroyCui

扫码关注云+社区

领取腾讯云代金券