| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> 1-1 【理论】01-文件上传/下载漏洞的业务场 -> 正文阅读 |
|
[PHP知识库]1-1 【理论】01-文件上传/下载漏洞的业务场 |
今天,我们这篇文章来讲文件上传/下载漏洞的原理以及危害,这篇文章从四个方面来讲, 1 文件上传漏洞产生的原因 2 文件上传合法性的检测方法 3文件上传漏洞20种绕过姿势 4 文件下载漏洞 文件上传漏洞介绍 ? 文件上传在我们的平时生活和工作中,是很常见的,比如,我们要上传个图像,上传个资料,上传一些其它文件和内容 ? 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限,向服务器上上传可执行的动态脚本文件 控制不足或者处理缺陷这点跟我们的SQL注入和XSS没有区别,都是对一些上传和传递没有做一些严格检验 动态脚本文件就是,我们传递的时候,传递一个txt、jpg,是没有办法去执行,我们这些特殊命令的,那我们一定是要传一个像php文件,java文件、python文件,这样动态的一些脚本文件,能够让我们去执行一些,系统的命令 这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的 WEB漏洞里面,有很多的漏洞,像注入、XSS、CSRF,还有一些命令执行,在所有的漏洞当中,文件上传是最为直接和有效的,因为,我们所有的漏洞,像XSS,SQL注入,还有一些其它,所有的漏洞,它的其中某一个目的,就是能够获取我们服务器的一些权限,文件上传能够上传一个WEB的后门,也就是WEBshell,能够获取一个WEB权限,所以,说它是非常直接和有效的 “文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。 严重的后果,上传木马、病毒这些严重的后果 ? WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。 也就是我们的网页木马 攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境 命令执行环境,可以执行我们操作系统的命令 以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等等,这些操纵的都可以实现) 所以WEBshell是我们文件上传的一个目的,通过文件上传来获得一个WEBshell,简单来讲,就是我们文件上传的第一个目的,我这边放了两种类型的WEBshell 上边这个叫一句话木马,一句话木马就是一句话的木马,它这里边是php的代码,
是php文件的一个开头,固定用法,后边
结尾是php文件的结尾,固定用法@eval可以执行我们里边的参数,当作我们的php代码来执行,$_POST[margin]),这个是获取我们的POST参数,这样把代码保存成php文件,就是一句话木马,就是我们的WEBshell,这样就可以通过访问php文件,传参给margin参数,来执行我们的系统命令 这个也是WEBshell,只不过它是叫大马,一句话木马叫小马,小马就是比较小的马,大马是功能比较强的木马,所以木马是分大马和小马的,这是它的部分代码的截图 代码里面有一些密码验证,访问木马之前需要输密码,要不然,任何人都可以访问这个木马,那我们做的一些操作,就是给别人做了,因为别人也可以连接,也可以对这个服务器进行操作,它可以做一些身份验证,验证你的木马是否正确,可以下载文件,备份数据库,通过mysql下载文件,一些非常多的功能,接下来演示一下他的具体用法 我们输入密码连接木马 登录之后,我们会发现非常多的功能 第一个功能叫File Manager,File Manager能够展现它所有的目录,就是一个文件管理,它的权限,能够点Rename,重命名 能够列目录,能够copy、edit,Rename、down,都可以,上传,下载,修改 还可以查询文件 还有一个功能是mysql manager,能够连接数据库,我们连接一下当前数据库,我们不选,直接connect connect选择一个数据库,比如,我们选择information_schema 它能够帮我们列出information_schema库里面,所有的信息,我们也可以在里面去执行很多的查询,select version(),query 它能够把我们把结果返回过来,也就是能够做一个数据库的管理功能 mysql_upload & download,将我们一些数据库的信息,下载下来 还有execute_command,就是我们输入命令,执行,whoami, 我们输入ipconfig,很多命令都可以执行,非常方便 php variable,还有php的一些运行的环境,php的版本 是不是允许,url open,是不是,enable_dl,一些配置环境的信息,都会被显示出来 post scan,做一个端口扫描,扫描,我们本地的端口,当然,扫一些其他服务器的端口,也可以,用来做内网渗透用的 我们扫本地,scan, 扫完之后,红色是close,绿色是open,open,就代表端口开放,3306是mysql,1433是sqlserver,帮助,我们去查看本地服务器以及服务器所在内网的一些其它服务器的端口开放情况 security information,能够看当前服务器的一些内容 像支持的数据库,当前系统的版本 还有当前的用户、IP,非常多的一些运行环境,能够看到 eval php code,这能够执行php的代码 这个就不演示了,这是我们大马的功能,大马的作用对于我们来说,是能够更好的去控制这台服务器,小马的作用在下一篇文章演示,它主要是一个php文件,传到服务器上之后,我们通过菜刀,对它进行一个连接就可以了 文件上传漏洞的原因 1、对于上传文件的后缀名(扩展名)没有做较为严格的限制 就是说,我们本来是要上传jpg、png,上传一些其他图片形式的头像的功能,但是你没有做一个严格校验,你传了个php上去,我们在返回图片路径的时候,把这个php路径返回了,导致,我们使用,我们的后门连接工具,连接上,我们就能够获取服务器权限 2、对于上传文件的MIMETYPE(content-type)(用于描述文件的类型的一种表述方法), 没有做检查 3、权限上没有对于上传的文件目录设置不可执行权限 任何文件它的权限都是读、写、执行,三个权限,如果,我们对上传的文件只有只读的权限,没有执行,那我们上传php也没法去执行,所以说,我们要把可执行的权限给禁掉, 4、web server对于上传文件或者指定目录的行为没有做限制 这个就是对上传文件的目录,它的一些包括权限,包括它后续的一些上传和下载、删除,对它的操作,没有做一些限制,它过于权限宽松了,没有遵守我们权限最小化的一个原则 所以说,这四个是我们文件上传漏洞产生的原因 在 WEB 中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段 (multipart) 的数据信息,并将其中的文件内容提取出来并保存的。 ? 通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,比如原始文件名加一个时间戳,什么什么时间,而后随机为文件起一个文件名 ( 为了防止重复 ),并且加上原始文件的扩展名来保存到服务器上。 第一个content-type是要标记我们当前的HTTP请求,是一个form表单请求提交的一个内容,第二个content-type是表示,我们当前文件上传的类型,这里是image的类型,还有可能是jpeg、jpg、png不同文件的压缩包,不同文件上传的类型是不一样的,压缩包的时候,可能是.rar,文件的时候,可能是txt、html、xml,图片我们是image/jpeg、image/png这样的格式,通过content-type来表示上传文件的类型 上传漏洞的危害 1、上Web木马文件,控制Web服务器文件、远程命令执行等。 2、上传系统病毒、木马文件进行挖矿,然后形成一个僵尸网络。 挖矿,比如说现在的虚拟货币,挖矿软件,像我们控制服务器软件之后,我们把挖矿软件传上去,能帮我们日夜不停的挖矿 僵尸网络属于执行一些APT攻击、DDOS攻击,这些操作 3、上传系统溢出程序进行权限提升。 windows下面的exe文件,比如说,我们之前的永恒之蓝,这些文件 当我们获取WEBshell权限之后,这些权限应该是WEB服务,所运行的用户同级的权限,比方说,我们的Apach服务是在,Apach这个用户下面去运行的,那我们获取WEBshell之后,权限就是Apach用户运行的权限,所以说,我们要去上传一些溢出程序,来获取管理员的权限 4、修改Web页面实现钓鱼、挂马、暗链等操作。 当我们获取WEBshell之后,对后台这些文件,我们就已经有修改的权限了,当然,也不一定,比如说,后台有一些防护,权限控制的比较严格的话,比方说我们当前用户,没有办法去修改这个文件,或者是加一些网站文件防篡改的产品,我们都无法去修改WEB页面,如果说,能修改的话,我们去修改html页面,去给他加一些钓鱼的页面,加一些木马的代码,加一些暗链,比如说,赌博的,博彩的,这些色情的,这些都可以去操作 5、内网渗透。 比如说,当我们获取WEBshell之后,我们已经有内网一台服务器权限,我们通过这台服务器权限,做一个跳板,对内网所有的机器,做一个内部的渗透,其实内网渗透,要比外网渗透要稍微简单一些,我们对内网机器,做一个加固扫描,弱口令扫描,我们对域控做一个渗透,做一些内网渗透的事情 6、在权限得到提升的情况下,想做什么就做什么。 比如说,当我们得到管理员权限之后,我们基本上就是为所欲为,相当于这台机子就是我们的,除了,我们摸不到这台物理设备之外,服务器上,所有的事情都能干,这就是上传漏洞的一个危害,它是最直接,危害最大的一个漏洞 文件上传合法性检测方法 1、前端Js验证。 当我们在上传的时候,用js来验证后缀类型,可以就通过,不可以就提示你,文件的后缀名是不合法的 2、MIME类型验证 content-type的校验,我们在代码里面写到,如果是jpeg、png、gif,我们就上传,如果不行,直接返回 3、黑名单/白名单 现在黑名单用的比较少,主要用的是白名单,黑名单容易绕过,比如一些后缀名,限制不能够上传php,有些人就上传php5,后缀名是.php5、.php4,或者.phtml,很多这种方式进行绕过,比方说,上面这个截图里面是Appconfig的配置文件,AddType application/x-httpd-php .php .phtml,这个地方就是说,能够允许,一些当作php来运行的文件后缀类型,比方说,我们加了这个.phtml,代码里面没有限制这个类型,那这个时候,它传上去之后,就能够执行这个phtml,能够把它当作php的文件来执行 4、检查文件内容(在php里面用getimagesize() 函数用于获取图像信息、检验关键字) 用getimagesize() 函数用于获取图像信息,看看是不是一个正常的图像 检验关键字,看我们image文件里面,有没有一些php代码的关键字,如果有的话,你这个image文件,肯定不正常,正常的图片文件里面,怎么可能会有php代码呢 5、禁止本地文件包含漏洞 这个是联合使用的一个漏洞,比方说,你文件上传image,image里面包含了php代码,它没法执行,因为它是个image后缀,那我们用一个文件包含的话,那么包含这个image文件,包含进来的话,image文件里面的代码就可以被成功执行,这就是文件包含的一个特性,这个我们要禁止 6、使用安全的Web 服务(apache、nginx(/test.png/xxx.php)、IIS解析漏洞(1.php;jpg)) 比方说,我们的代码是一点漏洞,都没有了,但是apache、nginx、IIS,它本身就有一些漏洞,apache解析漏洞、nginx解析漏洞,IIS解析漏洞 比方说,apache会传一个a.什么什么文件,它的文件校验,是从最后一个后缀名开始,a.php.aaa,aaa在apache里面,是不识别的,我们往前推一个,推一个是.php,可以识别,把它当成一个php文件来解析 nginx比方说,传一个文件,访问路径是/test.png/xxx.php,这个时候,也会把它当成一个php文件来解析 IIS比方说,文件名是1.php;jpg,那么这个时候,就会把它当成一个php文件,来解析,或者说这个地方,我们1.exe;jpg,它会把它解析成exe的文件,所以说,保证,我们的代码,没有问题,不够的,我们要使用一些更加安全的WEB服务,保证我们WEB服务没有漏洞,安全是个整体,只保证某个点的漏洞,是不能够保证我们的安全的,所以说,要全面的去考虑我们的安全问题 文件上传漏洞20种绕过方法 1、前端Js绕过 js前台验证绕过 2、MIME类型绕过 3、后缀名大小写绕过/后缀名php4、php5绕过 4、00截断 5、覆盖.htaccess这个文件 6、Windows文件流特性绕过 7、双写文件名绕过 8、条件竞争 这里,我列举了8个,这8个是比较常见的8个,剩下的会在实验里面,给大家一一讲解20个绕过的方法,及对应的后台代码的一些产生的原理,我们一起读一读代码,它的一些常见漏洞代码,长什么样,做一个简单的代码审计 文件下载漏洞概念 1、一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞 比如说,你本来是要查看一些doc、txt,ppt的一些内容,但是,它能够绕过我们这个路径,查看一些比较敏感的文件,比方说,linux的password文件 2、下载服务器任意文件,如脚本代码、服务及系统配置文件等,可用得到的代码进一步代码审计,得到更多可利用漏洞 这个能够下载,你网站的整个源代码,把你的码,下下来之后,能够分析,你的代码这些漏洞,因为分析代码需要做一个代码审计,它是一个白盒测试,白盒测试实际上比黑盒测试的效率或准确率更高一些 文件下载和上传漏洞,同属于文件操作类型的漏洞 通过文件下载漏洞读取服务端文件的方法 我们举一个DVWA的例子 ? 查找漏洞点: http://www.margin.com/dvwa/vulnerabilities/fi/?page=file3.php 这个地方是读取file3的内容 ? 把文件更改为要查看的文件 http://www.margin.com/dvwa/vulnerabilities/fi/?page=/etc/passwd 那我们把路径改一改,改成/etc/passwd这个文件,能够读取,我们password的文件 ? 返回: 我们通过截图,能够看到正常去读取,这就是我们任意文件下载漏洞的演示 如何查找任意文件下载漏洞 ? 查找传入文件名的参数: ? ? 导入文件等参数,要是直接输入文件名,就有可能有注入点 就是说,你这个文件名可控,这个文件名是用户能够指定的,这个时候,我们就能够输入特定的字符,加一些路径,能够绕过这些文件读取的限制 ? 注意如下几个参数名: ? ? RealPath,FilePath,filepath,Path,path,inputFile,url,urls,Lang,dis,data,readfifile,filep ? ? src,menu,META-INF,WEB-INF 这些特殊的参数名,能够帮我们快速找到文件读取和文件操作函数的位置 ? 代码中如何查找漏洞: ? ? PHP为例,有如下等代码,就有可能存在任意文件下载漏洞 ? ? readfile ? ? fopen ? ? file_get_contents 因为这三个函数是文件操纵功能,readfile、fopen读取文件,file_get_contents,读取文件里面的一些内容,当这三个函数出现的时候,有可能出现,任意文件读取或下载的漏洞 Windows敏感文件路径 ? ? Windows: ? ? C:\boot.ini //查看系统版本 ? ? C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 ? ? C:\Windows\repair\sam //存储系统初次安装的一些密码 ? ? C:\Program Files\mysql\my.ini //Mysql配置文件 ? ? C:\Program Files\mysql\data\mysql\user.MYD //Mysql的一些user配置文件 ? ? rootC:\Windows\php.ini //php配置信息 ? ? C:\Windows\my.ini //Mysql配置信息 我们要知道,那些文件对我们是有用的,我们在读的时候,可以尝试读这些路径,但是我们需要注意的是,这些路径,有可能发生变化,比方说,它会随着管理员安装的路径不同,而发生变化,这些路径,只是默认的路径,如果找不到,也没有关系,因为路径变了,我们可能也,非常难猜 Linux敏感文件路径 ? Linux: ? ? /root/.ssh/authorized_keys authorized_keys的配置文件或一些内容 ? ? /root/.ssh/id_rsa ? ? /root/.ssh/id_ras.keystore 也是我们一些authorized_keys的配置文件 ? ? /root/.ssh/known_hosts 是我们在远程连接的时候,当我们要yes或no的时候,说明,我们的主机不在known_hosts的里面 ? ? /etc/passwd ? ? /etc/shadow 这个是用户名和密码相关的一些配置文件 ? ? /etc/my.cnf 数据库的配置文件 ? ? /etc/httpd/conf/httpd.conf apache的配置文件 ? ? /root/.bash_history ? ? /root/.mysql_history 是关于命令执行的历史记录 ? ? /proc/self/fd/fd[0-9]*(文件标识符) ? ? /proc/mounts /porc/config.gz 当我们在渗透测试的时候,一定要注意把这些配置文件,都去弄一下,看一下敏感信息,看不到,也没关系,它改路径,也没办法 修复文件下载漏洞 ? PHP为例: ? ? 过滤.(点),使用户在url中不能回溯上级目录 因为读取文件的时候,很有可能过滤斜杆,我们过滤的斜杆,要用…/去绕过,去读取上一级目录,和上上级目录的文件,因为,我们读取的时候,只读取当前文件内容,肯定是读取不到一些敏感信息的,将我们刚刚学的/etc/password,它是在根目录下面,那我们可以指定/etc/password路径,如果不行的话,我们可以用…/…/的方式,去看我们上一级的目录,一直到根目录下面的,某一些文件,去读取 ? ? 正则严格判断用户输入参数的格式 读取文件名的时候,尽量不要让用户控制你文件的名称,因为一旦控制文件名称之后,是比较有风险的,所以,我们要严格的校验用户,输入文件名的格式 ? ? php.ini配置open_basedir限定文件访问范围 你在通过代码,访问文件的时候,我们可以通过open_basedir限制,你能够访问的目录,这样一些,敏感的目录,你就访问不了了 我们通过这三种方式来修复,文件下载漏洞 |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/26 16:13:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |