0

    文件上传漏洞学习笔记 —原理、危害、解析、绕过、编辑器、服务器

    2023.08.16 | admin | 129次围观

    本期零基础入学的一位同学的

    学!习!笔!记!

    这样的学习精神值得大家学习哦

    文件上传解析漏洞文件上传漏洞

    文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。

    由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。

    打个比方来说,如果你使用 windows 服务器并且以 asp 作为服务器端的动态网站环境,那么在你的网站的上传功能处,就一定不能让用户上传 asp 类型的文件,否则他上传一个 webshell,你服务器上的文件就可以被他任意更改了。因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

    文件上传漏洞危害

    上传漏洞与SQL注入或 XSS相比,其风险更大,如果 Web应用程序存在上传漏洞,攻击者上传的文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为。

    如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片文件发出去是乱码,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个webshell到服务器上 完全控制系统或致使系统瘫痪。

    文件上传漏洞原理

    大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。

    这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

    文件上传漏洞满足条件

    1.文件上传功能能正常使用

    2.上传文件路径可知

    3.上传文件可以被访问

    4.上传文件可以被执行或被包含

    文件上传数据包解析

    Content-Length:即上传内容大小

    MAX_FILE_SIZE:即上传内容的最大长度

    Filename:即上传文件名

    Content-Type:即上传文件类型

    请求包中的乱码字段,即是所上传文件的内容

    文件上传漏洞绕过技巧

    1、客户端校验(js检测):

    一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名的合法性问题。

    在检查扩展名是否合法的时候,有两种策略:白名单策略和黑名单策略。

    判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包,所以可以通过抓包来判断,如果弹出不准上传,但是没有抓到数据包,那么就是前端验证。其实,也可以直接查看网页源代码,源代码中如果没有js前端效验,那么就一定是后端效验喽。

    绕过方法:这个限制是在客户端进行的,这种限制形同虚设。传正常文件改数据包就可以绕过,甚至关闭JS都可以尝试绕过。

    黑白名单机制:

    黑名单:不允许上传什么,文件扩展名在黑名单中的为不合法。

    白名单:只允许上传什么,文件扩展名不在白名单中的均为不合法。

    白名单比黑名单更安全

    2、服务端检测:

    检查Content-Type (内容类型)

    检查后缀(检查后缀是主流)

    检查文件头

    绕过方法:假如将webshell代码文件后缀改为其它被服务器认为是安全的后缀,再通过解析漏洞让其按照脚本文件进行解析,就达到了最终的目的。

    服务端MIME检测绕过(Content-Type检测)

    HTTP协议规定了上传资源的时候在Header中加上一项文件的MIMETYPE,来识别文件类型,这个动作是由浏览器完成的,服务端可以检查此类型不过这仍然是不安全的,因为HTTP header可以被发出者或者中间人任意的修改,不过加上一层防护也是可以有一定效果的。

    绕过方法:使用burp代理,修改Content-Type的参数。

    text/plain(纯文本)

    text/html(HTML文档)

    text/javascript(js代码)

    application/xhtml+xml(XHTML文档)

    image/gif(GIF图像)

    image/jpeg(JPEG图像)

    image/png(PNG图像)

    video/mpeg(MPEG动画)

    application/octet-stream(二进制数据)

    application/pdf(PDF文档)

    application/(编程语言) 该种语言的代码

    application/msword(Microsoft Word文件)

    message/rfc822(RFC 822形式)

    multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)

    application/x-www-form-urlencoded(POST方法提交的表单)

    multipart/form-data(POST提交时伴随文件上传的表单)

    服务端扩展名检测绕过:

    在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传。在检查扩展名是否合法的时候,有两种策略:黑名单策略和白名单策略。

    白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破。

    绕过方法:

    文件名大小写绕过,例如Php,AsP等类似的文件名

    后缀名字双写嵌套,例如pphphp,asaspp等

    可以利用系统会对一些特殊文件名做默认修改的系统特性绕过

    可以利用asp程序中的漏洞,使用截断字符绕过

    可以利用不再黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制。

    可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过。

    1.老版本的IIS中的目录解析漏洞文件发出去是乱码,如果网站目录中有一个 /.asp/目录,那么此目录下面的一切内容都会被当作asp脚本来解析

    2.老板本的IIS中的分号漏洞:IIS在解析文件名的时候可能将分号后面的内容丢弃,那么我们可以在上传的时候给后面加入分号内容来避免黑名单过滤,如 a.asp;jpg

    3.旧版Windows Server中存在空格和dot漏洞类似于 a.php. 和 a.php[空格] 这样的文件名存储后会被windows去掉点和空格,从而使得加上这两个东西可以突破过滤,成功上传,并且被当作php代码来执行

    4.nginx空字节漏洞 xxx.jpg.php 这样的文件名会被解析为php代码运行

    5.apache的解析漏洞,上传如a.php.rar a.php.gif 类型的文件名,可以避免对于php文件的过滤机制,但是由于apache在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar等扩展名是apache不能识别的,因此就会直接将类型识别为php,从而达到了注入php代码的目的

    服务端文件头内容检测绕过:

    这种方法利用的是每一个特定类型的文件都会有不太一样的开头或者标志位。可以通过比如php的exif_imagetype()函数来检测。

    通过检查头几位字节,可以分辨是否是图片文件。

    不同类型的文件都有对应的文件类型签名(也叫类型幻数,简称文件头),比如,PNG 的文件头为十六进制的 89 50 4E 47 0D 0A 1A 0A;GIF 为 47 49 46 38 37 61、JPG 为 FF D8 FF E0。

    通过在文件中添加正常文件的标识或其他关键字符绕过。

    给上传脚本加上相应的幻数头字节就可以,php引擎会将

    的文件,然后访问xx.jpg/.php或xxx.jpg/1.php,在这个目录下就会生成一句话木马 shell.php文件。

    Nginx

    Nginx如下版本:

    0.5.*,0.6.*,0.7

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论