渗透测试——六、网站漏洞——文件上传

点击跳转:
渗透测试——一、网络扫描
渗透测试——二、抓包分析
渗透测试——三、脚本编写
渗透测试——四、服务漏洞
渗透测试——五、网站漏洞——SQL注入
渗透测试——六、网站漏洞——文件上传
渗透测试——七、网站漏洞——命令注入和跨站请求伪造(CSRF)
渗透测试——八、网站漏洞——XSS跨站脚本攻击
渗透测试——九、系统加固
渗透测试——十、常用工具及命令列举

一、文件包含

服务器执行 PHP 文件时,可以通过文件包含函数加载另一个文件中的 PHP 代码,并且当作 PHP 来执行,这会为开发者节省大量的时间。比如创建供所有网页引用的标准页眉或菜单文件,当页眉需要更新时,只要更新一个包含文件就可以了,或者当向网站添加一张新页面时,仅仅需要修改一下菜单文件。
文件包含分为:本地文件包含 (PHP 配置文件中选项allow_url_include =on),此时被包含的文件存放在本地服务器上:远程文件包含 (PHP 配置文件中选项llowurlinclude=on,allow_urlopen =on),此时被包含的文件存放在远程服务器上。
PHP 中文件包含函数有四种:require()、require_once()、include()、include_once();imclude 和require 的区别主要是:include 函数在包含的过程中,如果出现错误,会抛出一个警告、程序继续正常运行;而require 函数出现错误的时候,会直接报错并退出程序的执行include_once()、require_once()这两个函数与前两个的不同之处在于这两个函数只包含一次,适用于脚本执行期间同一文件只被包含一次的情况,从而避免函数重新定义、变量重新赋值等问题的发生。
但一些文件句含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。为本地文件包含,黑客能查看本地服务器中的敏感文件,为程文件含,黑客能通过远程服务器进入其内网,并查看敏感文件。
在这里插入图片描述

二、PHP伪协议

PHP 有很多内置 URL风格的封装协议,这类协议与 PHP 的 fopen()、copy()、file_exists()、filesize()等文件系统函数所提供的功能类似,称为 PHP 协议。常见的伪协议有file:///、http://、ftp://、php://、zlib://、data://等。
php://伪装协议提供了对输入/输出 (I/0) 流的操作,允许访问 PHP 的输入/输出流标准输入/输出和错误描述符,以及内存、磁盘备份的临时文件流及可以操作其他读取/写人文件资源,例如php://filter、php://output、php://input 等。
(1) php://filter
元封装器,设计用于“数据流打开”时的“筛选过滤”,对本地磁盘文件进行读写。用法如图6-3-3 所示。构造 filename = php://filter/read = convert. base64 - encode/resource = xxx.php
条件: 只是读取,需要开启allow_url_fopen,不需要开启allow_url_include。
(2) php://input
可以访问请求的原始数据的只读流。即可以直接读取到 post 上没有经过解析的原始数据enctype="multipart/form -data"时,php;//input 是无效的。用法:filename =php://input,数据利用 post 传过去。
以下利用 php://input 上传木马程序并执行的过程。
在这里插入图片描述
此外,除了常见的伪协议外,还有 phar;//,这是 PHP 解压函数,不管后缀是什么,都会当作压缩包来解压。
用法:flename=phar://压缩/内部文件。注意:当PHP 版本是5.3.0以上时,压缩包需要ZIP 协议压缩,RAR不行。将木马文件压缩后,改为其他任意格式的文件都可以正常使用。

三、文件上传

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是 Web 服务器允许用户上传图片或者保存普通文本文件,而用户绕过上传机制上传恶意代码并执行,从而控制服务器。显然这种漏洞是 getshell 最快最直接的方法之一。需要说明的是,上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。
常见校验上传文件的方法如下:
(1)客户端校验

  • 1、通过 JavaScript 来校验上传文件的后缀是否合法,可以采用白名单方式,也可以采用黑名单方式。
  • 2、判断方式:在浏览加载文件,但还未单击“上传”按钮时,便弹出对话框,内容如“只允许上传.jpg/.jpeg/. ng 后级名的文件”,而此时并没有发送数据包。

(2)服务器端校验

  • 1、校验请求头content - type 字段,例如用PHP检测
  • 2、 if( $_FILES['userfile ‘][’ type ']! = " mage/gif" )
  • 3、通过自己写正则匹配来判断文件头内容是否符合要求。一般来说,属于白名单的检测,常见的文件头(文件头标志位) 如下:
.JPEG;.JPE;."JPGJPGGraphicFile"(FFD8FFFEOO)
.gif,"GIF89A"(474946383961)
.zip,"ZipCompressed"(504B0304)
.doc;. xls;. xlt ;. ppt;. apr,"MSCompoundDocumentvlorLotusApproachAPRfile" ( DOCF11E0A1BILAE1)
  • 4、文件加载检测:一般是调用API或函数进行文件加测试,例如图像染测试。只有当测试结果正常时,才允许上传。
  • 5、一染 (代码注入)。
  • 6、二次渲染。
  • 7、后缀名黑名单校验
  • 8、后缀名白名单校验
  • 9、自定义。

(3)WAF校验
即使用不同的 WAF 产品进行过滤,通常是独立于服务程序的一段中间程序或者硬件对应校验的绕过方法。
常见的校验绕过方法如下:
(1)客户端校验绕过
直接修改 JavaScript代码或者使用抓包的方法修改请求内容绕过,可以先上传一个 CIF木马,通过抓包修改为 jsp/php/asp。只用这种方法来检测是肯定可以绕过的。
(2)服务端绕过
校验请求头 content -type 字段绕过,通过抓包来修改 http 头的 content - type 即可绕过。

POST/upload.php HTTP/1.1
TE:deflate,gzip;q=0.3
Connection:TE,close
Host:localhost
User -Agent:libwww -perl/5,803
Content -Type:multipart /form - data; boundary =xYzZY
Content -Length:155
--XYzZY
Content -Disposition; form -data name = "userfile"; filename ="shell.php"
Content -Type: image/gif(原为 Content _Type: text/plain)
<php system($_GET['command'); >
--XYzZY--

(3)文件(文头)测绕过
在木马内容的前面插入对应的文件头内容,例如 GIF89a。更保险的方法是在可上传的文件中插入木马代码,然后修改后缀。
(4)文件加载检测绕过
通过例如加载文件进行图像渲染的方式来测试,这时一般需要在正常的文件中插入木马代码,例如图像。插人的代码一般会放在图像的注释区,因此不会影响图像正常渲染绕过这种检测、此时可以使用工具 (称为插马器) 进行插人,如 edjpgcom,或者直接用 copy 命今来合成。当然,这种检测不一定能够完全绕过。
(5)后缀名检测绕过
后缀黑名单检测:查找 blacklist (黑名单列表)的漏网之鱼,例如:
大小写:如果检测的时候不忽略大小写,那么可以改变后缀名的大小写绕过。
扩展名:后级名检测列表中是否忽略一些扩展名。
能被解析的文件扩展名列表有:

jsp、jspx、jspf;
asp、asa、 cer、aspx;
php、php、 php3、php4、pht;
exe、exee。

(6)后缀白名单检测绕过

  • %00截断漏洞
    如果存在这类漏洞,那么后缀名的检测都可以绕过,此时可以对上传的文件使用如下命名:
test. php% 00. jpg
  • 解析漏洞
    这类漏洞是本身服务器的中间件产生的,例如apache、nginx都被爆出过存在解析漏洞。如果存在解析漏洞,上传的安全性几乎就完全失去了。

四、文件包含页面之包含测试

将安全级别设置为 Low,打开“文件包含”页面,查看源码可知页面存在文件包含漏,分别单击文件1和文件2链接。可以在 URL变量 page 后加人任意的文件名。在 page 后加入 URL参数,除了可以查看服务器上指定文件内容外,还可以执行 PHP 文件。
对于一台服务器而言,网站所在的目录是极其重要的敏感信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图为远程文件包含,框里的是包含的文件。远端文件包含可以从一个网段到另外一个网段,危险性更大。
在这里插入图片描述
将安全级别调整至 Medium 级别,查看代码:
在这里插入图片描述
在这里插入图片描述
比起 Low 级别,Medium级别加了一个过滤。str_replace 是 PHP 替换函数,将 http://https://替换为空字符,将…/、… 替换为空字符,这样按照原有的输入是没办法看到本地和远程文件的,于是在 URL 中构造字符串绕过过滤。
在这里插入图片描述在这里插入图片描述
将安全级别调整至 High 级别,查看代码:
在这里插入图片描述
High 级别的代码对包含的文件名进行了限制,必须为 file* 或者 include. php,否则,会提示Error:File not found。可以利用file伪协议进行绕过。
在这里插入图片描述
调至Impossible 级别,查看代码:
在这里插入图片描述
可以看到,Impossible 级别的代码使用了白名单过滤的方法,包含的文件名必须与白名单中的文件名相同,从而避免了文件包含漏洞的产生。

五、文件上传页面之上传测试

打开“文件上传”页面,把安全级别设置为 Low。查看代码,如图所示,可以知道,服务器对上传文件的类型、内容没有做任何的检查、过滤,可以上传任何文件,存在明显的文件上传漏洞。
在这里插入图片描述
这时创建一个木马文件,并把木马文件上传到网站上去:
在这里插入图片描述
在这里插入图片描述
在“蚁剑”中添加木马网站的 URL路径,输入木马的 post 值:
在这里插入图片描述
右击,选择“文件管理”就会进入网站所在的服务器,从而控制服务器。
在这里插入图片描述
将“文件上传”页面的安全级别设置为 Medium,查看它的代码:
在这里插入图片描述
可以看到,服务器对上传文件的大小和类型做了限制。只允许上传小于100MB字节并且类型是jpeg或png的图像:
在这里插入图片描述
通过抓包修改文件类型,上传木马,因为这里过滤的是文件的上传类型,而不是文件的后缀名。单击上传shell.php 的一话木马文件,然后用 Burp Suite 抓包:
在这里插入图片描述
在这里插入图片描述
当PHP 版本低于5.3.4 时,处理字符串的函数认为 0x00 是终止符,那么可以利用00截断漏洞来上传一句话木马。
将“文件上传”页面的安全级别设置为 High,查看它的代码:
在这里插入图片描述
其中,getimagesize函数的作用是判断上传的文件是不是有效的图片,在执行 move_uploaded_fle 时,限制上传的文件的后缀名必须以pgjpeg 或png结尾,同时小于100 MB。为了能成功上传木马,首先把一句话木马后缀名改成 jpg 格式。这样上传也不行,因为内容要求是图片文件。
在这里插入图片描述
这时在 shell.jpg 文件中加一个 GIF89 标识,成功上传。
利用一个现有的图片文件与木马进行合成后也能上传,在 cmd 命令行输入copy/b pic. jpg +hacker. php hacker. jpg即司。
在这里插入图片描述
此时因为上传的是图片文件,“中国菜刀”没有办法连接,那么怎样让图片文件以 PHP文件运行呢?利用文件包含中文件读取的伪协议 fle:///,输人“http://192.168.217.150/dvwa/vulnerabilities/f/page = file://c:/phpstudy/phptutorial\ www\ dvwa\ hackable uploads\1. jpg"通过页面可以看到GIF89,而木马程序也被执行了。
这时可以把链接地址写到“中国菜刀”,设置 post 值,右击进即即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值