一.前置知识
-
文件上传漏洞:文件上传功能是许多Web应用程序的常见功能之一,但在实施不当的情况下,可能会导致安全漏洞。文件上传漏洞的出现可能会使攻击者能够上传恶意文件,执行远程代码,绕过访问控制等。
-
文件类型验证:Web应用程序通常会对上传的文件类型进行验证,以确保只允许特定类型的文件上传。这种验证可以通过检查文件扩展名或内容类型(MIME类型)来实现。然而,这种验证机制往往是不可靠的,因为攻击者可以伪造文件扩展名或篡改内容类型。
-
文件名和路径操作:在处理上传文件时,应用程序可能会使用原始文件名进行操作,如保存在特定目录或显示给用户。不正确的文件名和路径操作可能导致目录遍历(Directory Traversal)漏洞,使攻击者能够访问应用程序的敏感文件或目录。
-
双重扩展名:攻击者可能会尝试通过使用双重扩展名来绕过文件类型验证。例如,将一个文件命名为"image.jpg.php",以欺骗应用程序认为它是一个图像文件,但实际上是一个可执行的PHP脚本。
-
文件内容验证:除了文件类型验证之外,应用程序还可以对文件内容进行验证,以确保上传的文件符合预期格式和结构。这可以通过解析文件内容或应用特定的文件签名(Magic Bytes)来实现。
-
文件上传目录权限:确保上传目录的适当权限设置非常重要。上传目录应该限制为只允许Web服务器进程写入,以防止攻击者上传恶意文件并执行它们。
-
服务器端代码执行:文件上传漏洞有时可以导致服务器端代码执行漏洞,这意味着攻击者可以上传包含恶意代码的文件,并在服务器上执行该代码。这可能会导致完全控制服务器的风险。
二.
常用函数
文件上传函数:
PHP:move_uploaded_file() 函数用于将上传的文件移动到指定位置。
Python(Flask框架):request.files['file'].save() 方法用于保存上传的文件。
文件类型验证:
PHP:$_FILES['file']['type'] 变量可以用于获取上传文件的MIME类型。
Python(Flask框架):file.content_type 属性用于获取上传文件的MIME类型。
文件名操作:
PHP:basename() 函数用于获取文件名部分,pathinfo() 函数可用于获取文件扩展名。
Python:os.path.basename() 函数用于获取文件名,os.path.splitext() 函数可用于获取文件扩展名。
以上转载原文链接如下:
原文链接:https://blog.csdn.net/cutesharkl/article/details/131702857
第一题:无验证
使用普通的php一句话木马<?php @eval($_POST['a']);?>,其中<?php ?>是php语言的开头和结尾格式,@的作用是如果执行错误不会报错,eval()表示把括号内的字符串作为php代码执行,$_POST['1']表示从页面中以post方式获取变量a的值
上传该木马文件,使用蚁剑连接
flag在该网站文件中,返回上一级就可以找到flag
第二题:前端验证
JavaScript会对我们上传的文件进行限制,允许图片格式上传,可以通过上传图片马或者使用bp修改一下文件后缀即可,本题使用bp修改文件后缀的方法,先将文件后缀修改为.jpg格式,文件上传然后抓包
将.jpg改为.php,然后发包
从文件路径可以看到成功上传.php后缀的木马文件
使用蚁剑成功连接
flag在该网站的html文件夹中
第三题:.htaccess
htaccess文件,全称是Hypertext Access(超文本入口)。是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
添加一个.htaccess文件,内容为AddType application/x-httpd-php .jpg,那么该服务器在之后对上传的文件处理方法是将jpg按照php文件处理
使用蚁剑连接,上传的.htaccess文件文件名字只能是.htaccess,只能有后缀而不能有文件的名,比如1.htaccess等,在第一次上传中我使用了1.htaccess,在后续上传jpg格式文件后服务器没有自动将jpg解析为php文件,需要注意