文件上传漏洞---Web渗透学习

文件上传本身是一个系统的正常需求,但是由于开发人员在开发时欠缺相关的安全知识,在对用户文件上传部分的控制不足或者缺陷,而导致用户越过其本身权限向服务器上传可执行的动态脚本文件。
这里上传的文件可以是木马,病毒、恶意脚本或webshell等。
这种攻击最为直接有效但是预防相对简单,除了开发语言方面,主要通过安全设备WAF(web application firewall,本文不对此进行讨论)来进行防护。
同时要对服务器的处理逻辑和业务处理逻辑进行深入理解,减少开发的系统的安全漏洞,以便预防黑客利用这些漏洞,对公司造成声誉和财产上的伤害。

造成文件上传的原因及原理
原因:
1.对上传文件的后缀名(扩展名)没有较为严格的限制;
2.对上传文件的MIMETYPE没有做检查;
其他试验中为涉及暂不列出。

原理:
在WEB中进行文件上传的原理通常是将表单设置为multipart/form-data,同时加入文件域,而后通过HTTP协议将文件内容发送到服务器,服务器读取这个分段(multipart)的数据信息,并将其中的文件内容提取出来并保持。通常,在进行文件保持的时候,服务器端会读取文件的原始文件名,并从这个原始文件中得出文件的扩展名,而后随机为文件起一个文件名(为防止重复),并加上文件的扩展名来保持到服务器上。

owasp-bwa提供了低中高三个级别的文件上传代码,如下:
低安全级别(开发小白):

';
                echo 'Your image was not uploaded.';
                echo '
'; } else { echo '
';
                echo $target_path . ' succesfully uploaded!';
                echo '
'; }

上一段代码中开发人员未对上传的文件做出任何检查。

中安全级别(有一定安全意识的开发人员):

 ';
                    echo 'Your image was not uploaded.';
                    echo '
'; } else { echo '
';
                    echo $target_path . ' succesfully uploaded!';
                    echo '
'; } } else{ echo '
Your image was not uploaded.
'; } } ?>

上一段代码中开发人员对用户上传的文件类型进行了检查,要求上传的文件必须是jpeg格式的图片,从http头的MIMETYPE去判断用户上产的文件类型,并制定大小不会超过10W字节*(不知理解是否正确)*。
该代码表示用户只能上传jpeg格式的图片,可以通过添加image/png等扩展允许用户上传图片的类型,从而为使系统更加具有通用性。

高安全级别(有较强安全意识的开发人员):

 ';
                    echo 'Your image was not uploaded.';
                    echo '
'; } else { echo '
';
                    echo $target_path . ' succesfully uploaded!';
                    echo '
'; } } else{ echo '
';
                echo 'Your image was not uploaded.';
                echo '
'; } } ?>

高安全级别将定义了用户上传文件的扩展名,只有文件扩展名是jpg、JPG、jpeg、JPEG等文件才允许上传,也可用通过添加png等图片后缀来提高系统的通用性,但是代码相对比价繁琐。
注:以上代码均来源于owaspbwa项目。

攻击及理解:
低安全级别的攻击:
由于其没有对用户上传文件的类型进行任何限制,所以用户可以上传任何文件。
攻击:
制作一句话的shell11.php脚本:


eval函数解释:
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
上传该php脚本,打开中国菜刀,输入以下信息:
文件上传漏洞---Web渗透学习_第1张图片在这里插入图片描述其中上图中的URL之的是shell11文件上传到服务器的目录。
后面的1表示密码,可以自己随便定义。
如果实验成功,就可用通过中国菜刀获取该服务器大部分文件的读、写、添加和删除的操作。

中安全级别的攻击:
在中安全级别中开发人员对用户的上传文件类型进行了检查;
类型的定义通过MIMETYPE来定义的。
攻击方法:
使用Proxy server,原理类似于流量劫持(自己劫持自己的流量),劫持后修改原始数据http头中的MIMETYPE类型,然后再进行数据包转发。
仍然上传shell11.php文件,在代理服务器截获的数据包信息如下:
文件上传漏洞---Web渗透学习_第2张图片上图中Content-Type为:application/octet-stream
修改为:image/jpeg,然后进行数据包转发。
文件成功上传,且文件在服务器中保持形式仍为php文件。
注.application/octet-stream:
1、只能提交二进制,而且只能提交一个二进制,如果提交文件的话,只能提交一个文件,后台接收参数只能有一个,而且只能是流(或者字节数组);
2、属于HTTP规范中Content-Type的一种;
3、很少使用。
后面使用中国菜刀的渗透方法与低安全级别一致。

高安全级别的攻击
高安全级别对用户上传的文件扩展名进行了限制,上传shell11.php文件,并通过proxy server修改文件后缀:
将filename=“shell11.php”修改为shell11.jpeg。
文件成功上传,但是该文件无法通过中国菜刀访问,因为其在服务器中是以图片的形式存在的,而不是以可执行脚本的形式存在的。
因此需要其他的渗透方法配合才能成功—见后文《图片木马—Web渗透学习》

你可能感兴趣的:(网络安全,开发安全)