web渗透者习惯采用黑盒或灰盒的方面来检测一款web应用是否存在漏洞,这种检测方法可以屏蔽不少漏洞,特别是程序逻辑中的漏洞。但如果能配合白盒的源码审计(也可以叫漏洞挖掘),效果将会更好,当然人力成本也会增加,其中,对于源码审计工作将交给谁做,是比较争议的话题,是开发、测试还是安全人员呢?

个人觉得,开发若能做一下粗略的源码自查,然后安全(弱没有安全人员,就交给白盒测试人员)负责做整体的源码审查,将是极好的安排。

除了人力成本,还有一个信任的问题,是否愿意将源码开放给安全人员?这比较敏感,但从技术角度来看,掌握源码审计的技巧是非常棒的加分点。

本篇文章将介绍两种开源的PHP源码审计工具,其中Taint适合开发源码自查,RIPS适合安全源码审查。

一、Taint

1、介绍

php taint一个用于检测xss/sqli/shell注入的php扩展模块,作者博客

原理,检查某些关键函数(是否直接使用(没有经过过滤或转义处理)了来自$_GET,$_POST,$_COOKIE的数据,如使用则给出提示。

可用于php源码审计,对快速定位漏洞有帮助

2、安装

第一步:下载安装taint
wget http://pecl.php.net/get/taint-1.2.2.tgz (下载最新的taint
tar zxvf taint-1.2.2.tgz 
cd taint-1.2.2

phpize(如果找不到该命令,需要apt-getinstall php5-dev)

./configure

make

make install

第二步:修改php.ini配置文件,使其支持taint模块

vim /etc/php5/apache2/php.ini 
增加
extension=/usr/lib/php5/20090626+lfs/taint.so
taint.enable=1

display_errors = On

error_reporting = E_ALL & ~E_DEPRECATED

apache2ctl restart

注意:只能在开发环境开启该扩展

第三步:测试该模块是否开启

vim phpinfo.php
<?php
phpinfo();
?>

如上图所示,则表示成功开启该扩展

3、测试(以DVWA 为主要测试对象)

实例1:sql注入漏洞

       $user = $_GET['username'];
       $pass = $_GET['password'];
       $pass = md5($pass);
       $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
       $result =mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );

运行页面,警告信息如下所示

Warning: mysql_query(): SQL statement contains data that might be tainted in /var/www/dvwa/vulnerabilities/brute/source/low.php on line 11

如果PHP源码使用以下函数,则不会发出警告

mysql_real_escape_string (不转义%与_)
stripslashes
is_numeric

实例2:命令执行漏洞

<?php
if( isset( $_POST[ 'submit' ] ) ) {
   $target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
       $cmd = shell_exec( 'ping  ' . $target );
       echo '<pre>'.$cmd.'</pre>';
} else {
       $cmd = shell_exec( 'ping  -c 3 ' . $target );
       echo '<pre>'.$cmd.'</pre>';
}
}
?>

运行页面,警告信息如下所示

Warning: shell_exec(): CMD statement contains data that might be tainted in /var/www/dvwa/vulnerabilities/exec/source/low.php on line 15

实例3:文件包含漏洞(常伴随着目录遍历漏洞)

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

运行页面,警告信息如下所示

Warning: include(): File path contains data that might be tainted in /var/www/dvwa/vulnerabilities/fi/index.php on line 35

实例4:xss漏洞

<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . $_GET['name'];
echo '</pre>';
}
?>

运行页面,警告信息如下所示

实例5:代码执行eval

<?php
$cmd=$_GET['cmd'];
eval("$cmd;");
?>

实例6:文件读取操作

<?php
print "<h2>Number 3: file()  functions: </h2>";
$path=$_GET['path'];
$contents=file($path);
foreach ($contents as $line_num => $line){
echo "Line #<b>{$line_num}</b> : ".htmlspecialchars($line). "<br>\n";
}
?>

二、RIPS

Taint可以在运行时提醒开发,未过滤参数带来的危害。而集中性的PHP源码安全审计工作还是交给RIPS比较友好。 我们将上面的实例代码使用该工具检查,报告如下所示

上图显示了该工具找到了7种安全漏洞,效果不错。

PHP源码审计是个很成熟的问题了,网络上有不少详细介绍如何做源码审计的资料,也开源了不少源码审计工具,感谢这些信息分享的人。

PHPTaint-检测xss/sqli/shell注入的php扩展模块[转]的更多相关文章

  1. DFX 安全测试-- 告诉你什么是XSS、sql注入?POST和GET的区别....

    1.用户权限测试 (1) 用户权限控制 1) 用户权限控制主要是对一些有权限控制的功能进行验证 2) 用户A才能进行的操作,B是否能够进行操作(可通过窜session,将在下面介绍) 3)只能有A条件 ...

  2. 总结了关于PHP xss 和 SQL 注入的问题(转)

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,本文只是简单介绍PHP如何 ...

  3. 关于PHP xss 和 SQL 注入的问题

    漏洞无非这么几类,XSS.sql注入.命令执行.上传漏洞.本地包含.远程包含.权限绕过.信息泄露.cookie伪造.CSRF(跨站请求)等.这些漏洞不仅仅是针对PHP语言的,PHP如何有效防止这些漏洞 ...

  4. sql和shell注入测试

    1.整数型参数,必须intval转义,用addslashes转义不行 <?php   $test = $_REQUEST["test"]; $test = addslashe ...

  5. 利用反射型XSS二次注入绕过CSP form-action限制

    利用反射型XSS二次注入绕过CSP form-action限制 翻译:SecurityToolkit 0x01 简单介绍 CSP(Content-Security-Policy)是为了缓解XSS而存在 ...

  6. 用于检测进程的shell脚本

    用于检测进程的shell脚本 2010-07-07 10:38:08|  分类: Centos |字号 订阅 脚本一: #!/bin/sh program=XXXX     #进程名 sn=`ps - ...

  7. Web攻防之XSS,CSRF,SQL注入

    摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨 ...

  8. Web攻防之XSS,CSRF,SQL注入(转)

    摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨 ...

  9. 预防XSs和sql注入常见分析

    SQL注入简介SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞.可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可 ...

随机推荐

  1. Coloring Trees CodeForces - 711C

    Coloring Trees CodeForces - 711C 题意:有n个点,每个点有一个c值,如果为0表示它没有被染色,否则表示它被染成了c值的颜色.颜色有1到m.把第i棵树染成颜色j所需要的代 ...

  2. git导出代码

    1.快速查询 $git archive --format zip --output "./output.zip" master -0 ./output.zip 是生成的文件 mas ...

  3. hibernate Day2

    Day21 实体类编写规则(1 ) 实体类中的属性是私有属性(2) 私有属性要生成get与set方法(3) 实体类中有属性作为唯一值(一般使用id值)(4) 实体类属性建议不要使用基本数据类型, 应当 ...

  4. Java图解

    java虚拟机 JVM运行过程: java开发工具包 java入门图解1 java入门图解2 java入门图解3 java入门图解4

  5. pyspark中使用累加器Accumulator统计指标

    评价分类模型的性能时需要用到以下四个指标 最开始使用以下代码计算,发现代码需要跑近一个小时,而且这一个小时都花在这四行代码上 # evaluate model TP = labelAndPreds.f ...

  6. Bootstrap中的datetimepicker浅谈

    从古至今,人们都习惯用某个时间来标记某个事件的发生.我们在写管理后台的时候,重中之中也是这个时间的设置.在问题出现的时候,我们是查看日志的时候,就可以根据这个时间段来查找这个问题出现点. 在使用时间控 ...

  7. 使用真正的 Redux 和 React-redux

    现在 make-react-redux 工程代码中的 Redux 和 React-redux 都是我们自己写的,现在让我们来使用真正的官方版本的 Redux 和 React-redux. 在工程目录下 ...

  8. postgresql 9.4.17 64位安装说明

    本文在win 7 64位下安装postgresql 9.4.17 64位版,安装过程有录入项的界面都有截图 运行安装程序开始安装 开始时可能自动安装c++运行环境 然后正式开始安装 安装目录位置,不要 ...

  9. android开发哪些坑需要注意

    同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑: Android的JN ...

  10. AJAX中文乱码解决方案

    通过AJAX获取数据中文乱码解决方案: @ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到 ...