文件包含和命令注入漏洞
文件包含漏洞
介绍
- 文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,让服务器端执行,代码注入的典型代表就是文件包含file inclusion。文件包含可能会出现在JSP、PHP、ASP中。
- 常见的导致文件包含的函数:
- PHP:
- include()
- include_once()
- require()
- require_once()
- fopen()
- readfile()
- ….
- JSP/Servlet:
- ava.io.file()
- java.io.filereader()
- …..
- ASP:
- include file
- incluide virtual
- …..
PHP的文件包含函数
- include(),include_once(),require(),require_once()
- 当使用这四个函数包含一个新文件时,该文件将作为PHP代码执行,php内核并不在意该被包含的文件类型时什么
- 代码:
<?php
$test=$_GET['x'];
include($test);
?>
保存为include.php
- 文件包含漏洞的利用条件:
- include()等函数通过动态变量的方式引入需要包含的文件
- 用户能控制该动态变量
- 远程文件包含:
- 如果php的配置选项allow_url_include开启,则include/require函数是可以加载远程文件的吗,这种漏洞被称为远程文件包含漏洞(RFI)
- 本地文件包含漏洞利用技巧
- 包含用户上传的文件
- 包含data://或php://input等伪协议
- 包含Session文件
- 包含日志文件,比如Web Server的access log
- 通过构造语句让服务器报错,并加入一句话随报错信息写入日志
- 找到日志文件
- 用菜刀连接
- 拿下网站
命令注入漏洞
命令注入攻击
- Command Injection,即命令注入攻击,是指由于Web应用程序对用户提交的数据过滤不严格,导致可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等。
php命令执行函数
- php中可以使用五个函数执行外部的应用程序或函数
- system:执行一个外部的应用程序并显示输出的结果
- exec:执行一个外部的应用程序
- passthru:执行一个UNIX系统命令并显示原始的输出
- shell_exec:执行shell命令并返回输出的结果的字符串
- “”” 运算符:与shell exec函数的功能相同
System函数
- system函数原型:
string system(string command,int &return_var)
,command是要执行的命令,return_var存放执行命令的执行后的状态值。 - 实例:
- 构造PHP代码:
<?php
$cmd = $_GET["cmd"];
echo "<pre>";
system($cmd);
echo "</pre>";
?>
在浏览器中访问这个PHP文件,并提交cmd内容,如netstat,即www.xxx.com/1.php?cmd=netstat
Exec函数
- exec函数原型:
string exec (string command,array &output,int &return_var)
,其中command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值 - 实例:
- 构造php代码:
<?php
$cmd = $_GET['cmd'];
echo "</pre>";
echo shell_exec($cmd);
echo "</pre>";
?>
类别另外三个