文件上传详细过程

    技术2022-07-10  127

    文件上传 一、原理 在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。 二、高危触发点 相册、头像上传 视频、照片分享 附件上传(论坛发帖、邮箱) 文件管理器 三、常见的文件上传检测及利用 1、没有任何限制和过滤 直接上传webshell文件 2、客户端 javascript检测 只会检测上传文件的后缀名 如何绕过? (1)禁用浏览器js功能 (2)先把所要上传的文件修改成允许上传的文件类型,通过burp抓包进行重命名进行绕过。 3、服务器 MIME类型检测 ----content-type 服务器对用户上传文件的文件类型进行检测,不允许上传的文件类型会被禁止。 比如,上传正常图片可以通过,但是把图片的content-type修改为其他值application/octet-stream之后上传失败,说明存在MIME类型检测 怎么绕过? 把所要上传文件的content-type,修改为允许上传的文件的文件类型。

    文件扩展名检测 通过黑白名单对上传的扩展名进行过滤和限制 黑名单(php,asp,jsp) (1)大小写绕过; pHp ASp (2)名单列表绕过;php可以换成.phtml/.php3/.php5 asp改成aspx (3)特殊文件名;通过burp抓包把文件名改成xx.php.或者xx.php_(下划线代表空格)或者 .空格.的方式 。这种命名方式在windows系统是不允许的,只能在burp里修改。当绕过之后,windows会自动去掉后面的.和_ linux下没有这种特性 ::$DATA windows下的NTFS的数据流格式 (4)截断(1.截断路径2.截断文件名 版本限制php<5.3.4) (5).htaccesss 攻击 通过上传.htaccesss文件,重新写入解析规则,把上传的带有木马的文件以php方式解析。 (6)解析漏洞 (7)双写绕过 -----------关键字替换 白名单 输入一个不存在的后缀名,当它仍然提示错误,说明它是白名单; (1)截断 (2)解析漏洞 目录路径检测 检测路径的合法性 怎么绕过? 截断。 文件内容检测 文件头检测 — getimagesize() 文件幻数:是用来唯一标识文件类型的一系列数字,通过检测内容开始处的文件幻数来确定文件类型 四、相关漏洞 1、解析漏洞 解析漏洞主要是一些特殊文件被Apache、IIS、Nginx等Web容器在某种情况下解释成脚本文件格式并得以执行而产生的漏洞 2、apache 多后缀解析 1.php.a.b —从右往左 依次判断 解析规则:从右往左以此进行判断解析,如果后缀名为不可识别的类型,就会继续往左判断。因为.a和.b不属于一个可识别的类型,一直判断到php。此时把该文件当做一个php来进行解析。 3、配置漏洞 httpd.conf AddType application/x-httpd-php .jpg jpg文件会被当做php进行解析 .htacess解析 (仅限于当前目录) <FilesMatch “test.jpg”> SetHandler application/x-httpd-php 防御:禁止上传.htaccess 4、防御措施 ,禁止含有php字符的文件访问权限 5、IIS 常规漏洞 — asp,aspx网站 (1)IIS 6.0 目录解析漏洞:服务器默认会把存在于.asp这样的目录下的文件都解析成asp文件 文件解析漏洞:服务器默认不解析;以后的内容,因此构造的1.asp;1.jpg就会被解析成asp文件 (2)IIS 7.5 IIS7/7.5在Fast-CGI运行模式下,在一个文件路径(/xx.jpg)后面加上/xx.php会将/xx.jpg/xx.php 解析为 php 文件。 6、nginx <8.03 php开启fix_pathinfo 选项,上传1.jpg这样格式的文件之后,构建一个url参数1.jpg/.php,此时1.jpg会被作为php解析。 注:fix_pathinfo选项的值改回0(1开启,2关闭) 五、上传防御措施 1、设置文件上传的目录为不可执行 只要web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,也没有办法执行所以不会对服务器本身造成什么影响。 以apche为例, 我们利用.htaccess文件(该文件一定要禁止上传,否则被重写规则之后这种防御方式就不存在了)对web服务器的行为进行限制 (1)指定特定扩展名的文件的处理方式 AddType text/plain .php .asp .py(把这些脚本文件当作文本输出) (2)完全禁止特定扩展名的文件被访问 Options -ExecCGI AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi 当以上这几种类型的文件被访问时,会返回403forbidden错误。 (3)只允许访问特定文件类型 <Files^(.jpeg|.jpg|.png|.gif)> order deny,allow deny from all 比如,这是一个上传图片的目录。目的是为了让该目录下只有图片格式扩展名的文件才可以被访问,其它类型就是拒绝访问。 2、判断文件 包括MIME类型(content-type类型),扩展名,文件内容。在文件扩展名检测中,优先使用白名单。 3、使用随机数重写文件名和文件路径 上传的文件如果要执行代码,首先需要用户能够去访问到这个文件。如果我们确认上传成功,但是访问不到我们所上传的问题,此时考虑是否存在文件名改写。

    4、单独设置文件服务器的域名 把网站服务器和文件服务器分开,把上传的文件放到单独的文件服务器上,对目录设置为不可执行。 5、二次渲染 (图片) 六、过程: 1、直接上传webshell文件 2、前端校验------js绕过 3、文件类型的校验 ------content-type 4、前面步骤都无法绕过的时候,考虑文件扩展名的校验。 判断黑名单还是白名单? 黑名单:(列表里存在的是常见的危险脚本类型文件) 去尝试上传一些比较安全的文件格式,如.txt .doc 。如果能够上传此时考虑它可能存在黑名单检测。 上传成功之后呢,使用一些webshell管理工具(中国菜刀,蚁剑,冰蝎) 蚁剑:https://github.com/AntSwordProject/ 上传完成之后,怎么判断webshell是否能够利用? 1、判断上传的文件是否存在。(访问图片的url) 2、 (1)不存在,404 (2)空白页面,说明文件存在 ①考虑一句话写对没有 ②文件是否被当作php解析了。

    Processed: 0.017, SQL: 12