博客鸽了好多天了(数了下居然20天了
最近忙着出题 顺便补了点基础
正好今天空下来了 写一下刚刚学到的姿势(不如说是p神博客学习笔记

0x00 php临时文件简介

php在上传的时候会产生临时文件,也就是$_FILES['userfile']['tmp_name']
在Linux环境中 没有指定upload_tmp_dir的情况下,默认使用系统临时目录 /tmp
命名规则是php+六位随机
phpxxxxxx

0x01 从一道题目看临时文件getshell的姿势

 <!-- hint:?cmd= -->
    <?php
        if(isset($_GET['cmd'])){
            $cmd=$_GET['cmd'];
            highlight_file(__FILE__);
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){

                die("cerror");
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
                die("serror");
            }
            eval($cmd);

        }

     ?>

(感谢ctfshow的师傅出的题目
这个题乍一看是经典的无数字字母getshell 但是仔细看会发现过滤了 $、^、~这些常用的字符 甚至连括号都没给 显然不能用传统方法
再仔细观察第一个正则,会发现题目留了一个小写p
可用字符如下

用这几个字符搞事情 引用p神原文
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

shell下可以利用.来执行任意脚本
Linux文件名支持用glob通配符代替

glob通配符可以用?表示一个任意字符 而题目留下了p
就可以很方便的用/???/p?p??????来指定我们上传的临时文件
然后.运行就OK了
本地构造一个上传表单,然后抓包

成功getshell

00x2 文件包含getshell

[https://www.cnblogs.com/xiaoqiyue/p/10158702.html]
这篇文章讲的很详细
原理是直接读取socket,然后利用时间差包含临时文件getshell
因为临时文件在socket连接结束之后才会删除,而我们只要让上传的文件充满垃圾数据就可以延长这个时间 然后在phpinfo页面读取出tmpname之后第一时间就包含shell即可
这个利用必须有phpinfo页面

分类: 技术

0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注