1、首先我们尝试下上传一个php文件,发现文件类型被限制了
我们查看下源码
发现是使用js代码对文件类型进行限制。
那么我们使用火狐浏览器的插件Noscript,打开这个插件即可禁用掉js代码,然后成功上传PHP,文件。
2、当然这个太麻烦了,我们可以直接删除这个坚持文件格式的函数即可。
3、我们上传个正常的图片,图片的路径:http://127.0.0.1/upload-lab/upload/1.jpg
查看图片路径发现文件名没被修改,那么我们可以使用抓包,修改文件名类型,把php文件改为jpg文件,然后通过抓包再改为PHP文件。
使用第一题中的第三种方法即可。查看提示
mime的意思就是文件的后缀名
发现第二题的方法已经失效了,
我们查看下源码。
$is_upload = false;
$msg = null;
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); //收尾去空
if(!in_array($file_ext, $deny_ext)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if (move_uploaded_file($temp_file,$img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
可以看到代码使用黑名单来过滤,php的话有时候(配置的原因)php、php3、php4、php5、phtml、pht这些后缀也是可以被解析的,其他语言也有类似的情况,需要尝试:
由于我这里使用的是phpstudy+windows,由于配置原因是解析不了php3等等这些后缀的
第四题直接进制常见的.asp|.aspx|.php|.jsp等常见后缀文件,但是又一种文件格式没禁用,那就是
.htaccess
启用.htaccess,需要修改httpd.conf,启用AllowOverride(将该值改为all),并可以用AllowOverride限制特定命令的使用。如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 。
然后先上传,htaccess文件,文件内容如下
SetHandler application/x-httpd-php
.htaccess文件的内容的意思是 对2.jpg使用php重新解析
然后再上传jpg脚本,
观察源码我们可以发现,本题把.htaccess
文件也禁用了。但是认真对比与第四题的代码,本题去掉了大小写绕过的逃逸。
对比第五题的源码可以发现,本题源码少了
$file_ext = trim($file_ext); //首尾去空,那么我们可以上传PHP文件,然后使用burp suit抓包修改后缀名格式为php加空格。
但返回题目提示文件不允许上传,不慌
观察抓包的文件,其实文件已经上传,路径在抓包里有
与第六题源码对比,发现少了$file_name = deldot($file_name);//删除文件名末尾的点
这句代码。
那么我们就可以。
那么在文件名末尾加个点号就可以了,参考第6题
比第七题少了$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。
这一关是上面几关的综合,但是他有个逻辑漏洞
程序先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用类似one.php. .(两个点号之间有一个空格)绕过,这有点像sql注入中的re_place只过滤一次关键字。
操作与第6题类似.
上传php文件发现,文件后缀名没掉了。上传jpg文件一切正常。怀疑是绕过
观察下源码
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
由这3句可以看出,部分文件1后缀名被替换成了空格
那么我们抓包,该后缀名,双写绕过。
关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
这个时候可以使用%00截断,但这东西有点过气了,因为需要两个条件
php版本小于5.3.4
php的magic_quotes_gpc为OFF状态
如果要完成这一个题目就必须要实现上面的两个条件,但是现在都PHP7了,这东西也就很少见了,满足上面的条件的时候php就是把它当成结束符,后面的数据直接忽略,这也导致了很多的问题,文件包含也可以利用这一点
所以如果要绕过,我们可以这样去实现,另save_path等于下面的值
…/upload/4.php%00
1
这里的源代码就改了一点点,就是把get改为post类型,一样的方式绕过,只不过这里需要在二进制里面修改%00,因为post不会像get对%00进行自动解码。
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
观察源码可以发现只对文件的头2个字节做检测
$bin = fread($file, 2); //只读2字节
fclose($file);
制作木马图片,然后上传即可,上传图片后利用就要结和文件包含漏洞了。
制作木马图片最简单的方式
copy 1.jpg /b + 1l.php /a 1.jpg
是这里用getimagesize获取文件类型,还是直接就可以利用图片马就可进行绕过:
介绍下getimagesize
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。
如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。
这里用到php_exif模块来判断文件类型,还是直接就可以利用图片马就可进行绕过:
imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字符串。
该系列函数有:
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
imagecreatefromwbmp():创建一块画布,并从 WBMP 文件或 URL 地址载入一副图像
imagecreatefromstring():创建一块画布,并从字符串中的图像流新建一副图像
这一关对后缀名和文件类型啥的都进行了很严格的控制,而且在后面还对图片进行了二次编译
这一个题目的思路,寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传,下载下来后发现这一部分插入代码的没变但是其他部分都变了。其他部分与13题一样
参考这篇博客http://www.cnblogs.com/jinqi520/p/9977256.html