grep taint
返回结果如果出现了一下信息,基本上已经安装成功。
taint
taint support => enabled
taint.enable => On => On
taint.error_level => 2 => 2五、功能检验与测试
完成上面的两步操作之后,笔者安装阶段已经大功告成了,现在笔者需要用taint来检验效果,检验分为三部分,首先用taint作者的demo代码进行检验,之后用渗透测试系统permeate来检验,最后以笔者平时所开发的代码进行测试。
5.1 demo文件测试
用demo文件测试的目的是检验笔者安装的taint是否真的已经生效,并确认taint有没有意义。
5.1.1 复制demo代码
在作者的GitHub上面有下面的这样一份demo代码,笔者将其复制到web目录,位置如下:
/Users/song/mycode/safe/permeatedemo代码内容如下,读者实验时可以将其拷贝:
<?php
$a = trim($_GET['a']);
$file_name = '/tmp' . $a;
$output = "Welcome, {$a} !!!";
$var = "output";
$sql = "Select * from " . $a;
$sql .= "ooxx";
echo $output;
print $$var;
include($file_name);
mysql_query($sql);5.1.2 配置虚拟主机
当代码文件保存之后,笔者需要在nginx配置文件中增加一个虚拟主机,用于浏览器访问此文件,参考配置如下:
server {
listen 80;
server_name test.localhost;
root /Users/song/mycode/safe/permeate;
location / {
index index.html index.htm index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}5.1.3 浏览器访问
接着笔者通过浏览器访问对应代码文件,URL地址如下:
http://test.localhost/taintdemo.php?a=1浏览器访问页面之后,笔者能在页面中看到一些警告信息,内容如下:
Warning: main() [echo]: Attempt to echo a string that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 10
Welcome, 1 !!!
Warning: main() [print]: Attempt to print a string that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 12
Welcome, 1 !!!
Warning: main() [include]: File path contains data that might be tainted in /Users/song/mycode/work/test/taintdemo.php on line 14
Warning: include(/tmp1): failed to open stream: No such file or directory in /Users/song/mycode/work/test/taintdemo.php on line 14
Warning: include(): Failed opening '/tmp1' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/song/mycode/work/test/taintdemo.php on line 14
Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Users/song/mycode/work/test/taintdemo.php:16 Stack trace: #0 {main} thrown in /Users/song/mycode/work/test/taintdemo.php on line 16从警告信息当中可以看出,笔者的taint已经生效,给出了很多警告提示,提示参数可能受到污染,因为参数并没有经过任何过滤;
5.1.4 参数过滤测试
如果不想让taint给出警告提示,可以将demo代码中的第二行代码更改或增加一下过滤规则,参考代码如下:
$a = htmlspecialchars($_GET['a']);再次回到浏览器当中,刷新当前页面,可以看到返回的信息已经发生了变化,返回内容如下
Welcome, 1 !!!Welcome, 1 !!!
Warning: include(/tmp1): failed to open stream: No such file or directory in /Users/song/mycode/work/test/taintdemo.php on line 15
Warning: include(): Failed opening '/tmp1' for inclusion (include_path='.:/usr/local/Cellar/php@7.1/7.1.19/share/php@7.1/pear') in /Users/song/mycode/work/test/taintdemo.php on line 15
Fatal error: Uncaught Error: Call to undefined function mysql_query() in /Users/song/mycode/work/test/taintdemo.php:17 Stack trace: #0 {main} thrown in /Users/song/mycode/work/test/taintdemo.php on line 17因为笔者在代码中增加了参数转义,此时再次刷新浏览器,会看到taint不再给发出警告提醒。
5.2 渗透测试系统验证
用demo系统验证taint扩展生效之后,现在笔者将用一个渗透测试系统来做一个实验,在这个系统中本身存在了很多安全问题,使用taint来找出这些问题,使用的渗透测试系统为 permeate渗透测试系统,地址如下
https://git.oschina.net/songboy/permeate5.2.1 下载permeate
笔者通过git将其源码下载下来,参考命令如下
https://gitee.com/songboy/permeate.git下载下来之后,同样创建一个虚拟主机,可以参考上面的nginx配置
5.2.2 导入数据库
因为这个系统会用到数据库,所以笔者下载之后需要新建数据库给permeate使用

新建完成数据库之后,笔者需要将一些数据表结构以及初始化数据导入到数据库当中,在使用git下载下来之后,在其跟目录有一个doc的文件夹,笔者打开它之后,能看到有一个sql文件,如下图所示

打开此文件并将其里面的内容复制,将复制的内容到管理数据库的Navicat Premium当中,然后执行这些SQL语句,如下图所示

5.2.3 修改配置文件
导入数据库完成之后,笔者修改数据库配置文件,让permeate能够连接次数据库,配置文件在根目录 conf/dbconfig.php,里面的配置代码如下,将其地址账户以及密码和数据库名称一一对应填写
<?php
!defined('DB_HOST') && define('DB_HOST','127.0.0.1');
!defined('DB_USER') && define('DB_USER','root');
!defined('DB_PASS') && define('DB_PASS','root');
!defined('DB_NAME') && define('DB_NAME','permeate');
!defined('DB_CHARSET') && define('DB_CHARSET','utf8');
$sex=array('保密','男','女');
$edu=array('保密','小学','初中','高中/中专','大专','本科','研究生','博士','博士后');
$admins=array('普通用户','管理员')5.2.4 验证安装结果
设置好数据库之后,笔者安装permeate便已经完成了,此时打开首页,看到的界面应该如下图所示:

如果在首页当中没有看到板块以及分区等信息,很有可能是数据库没有连接成功或者数据库没有正确导入数据所致。
5.2.5 挖掘漏洞
下面开始进行测试,笔者点击第一个板块SQL注入,并点击列表下发的下一页按钮,此时看到的页面如下图所示:

在这个板块列表页中没看到任何问题,但是实际上taint已经给笔者发出了警告提醒。
笔者可以通过查看源代码时候来看到这些问题,如下图所示,taint提示在代码文件 /Users/song/mycode/safe/permeate/core/common.php的50行,存在参数被污染的情况。

5.2.5 漏洞分析
笔者找到对应的代码位置,发现代码内容如下:
function includeAction($model, $action)
{
//判断控制器是否存在
$filePath = "./action/$model.php";
if (is_readable($filePath)) {
require_once $filePath;
$class = new $model;
if (is_callable(array($class, $action))) {
$class->$action();
return true;
}
}在代码中笔者看到有一个require_once函数加载了文件,里面的参数使用了变量 $model 和 $action ,通过最终变量来源,在代码文件/Users/song/mycode/safe/permeate/home/router.php发现这两个参数确实没有经过过滤,如下代码所示:
<?php
require_once "/core/common.php";
$model = !empty($_GET['m']) ? $_GET['m'] : 'index';
$action = !empty($_GET['a']) ? $_GET['a'] : 'index';
includeAction("$model","$action");最后需要提醒大家,Taint在开发环境安装即可,不要安装到生产环境当中,否则可能会把网站的安全问题直接暴露给攻击者
相关推荐:
PHP网站常见安全漏洞及相应防范措施总结,安全漏洞防范措施
新型php漏洞挖掘之debug导致的安全漏洞(Edusoho)
PHPShop存在多个安全漏洞_PHP教程
以上就是PHP的扩展Taint如何寻找网站的潜在安全漏洞(必看)的详细内容,更多请关注php中文网其它相关文章!
网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。
关键词:PHP的扩展Taint如何寻找网站的潜在安全漏洞(必看)