文件包含和命令注入漏洞

文件包含漏洞

介绍

  • 文件包含漏洞是代码注入的一种。其原理就是注入一段用户能控制的脚本或代码,让服务器端执行,代码注入的典型代表就是文件包含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>";
?>

类别另外三个