而对于程序本身我们能做什么呢?对于一个程序的安全性我们通常关注的有他处理参数的方式,他如何对待危险函数的,他的变量有不有正确的初始化......等等,通过上面的思想我们就大概能做这些事了:)
1 利用PHP自身的设置猜测程序处理参数的方式
一个PHP程序是要处理参数的,在代码中程序如何处理我们提交的变量是很重要的。譬如一些程序为了兼容所有的PHP环境,都会在开始释放变量以实现在register globals = off的时候程序一样能运行,并且为了在GPC = off 的时候程序不出问题,一般都会做addslashes处理,但是也并不是所有的程序都能正确处理好,所以我们通过更改PHP.ini的设置就可以大致推测出程序是如何处理输入的参数的。譬如,我们将register globals 设置为 off,我们然后include某个文件(譬如index.php),然后在代码的最后print_r($GLOBALS)来查看当前符号表里是不是有我们提交的参数,如果有的话就证明程序是将变量释放的,然后我们提交一些危险的变量如php?_POST=aaaaa然后看看$_POST的内容就可以知道是不是有变量覆盖的问题了,代码流程如下:
eg <?php
include 'index.php';
print_r($GLOBALS);
?>
当然,之前需要设置register global = off
2 利用PHP自身的出错机制
在PHP运行过程中,可以根据自定义的错误级别捕捉程序中的一些信息,默认情况下对未初始化这些信息并不做判断,但是没有初始化的变量确能给我们有用的信息。一些常见的文件包含漏洞就是都是由变量未初始化造成的。当我们把运行级别错误设置为NOTICE时就可以看到这些信息了,但是也不排除有程序人为地在运行过程中修改运行级别,后面我会说说对付这种的方法。找到未初始化变量之后我们就可以试着提交它,来看程序的反映,结合功能以及变量名猜测程序的写法,通常可以挖掘一些漏洞。
3 结合php扩展
这一来就有点向底层靠了,PHP自己是提供了一些查询系统状态的函数如上面提供的get_defined_vars之类,但是这些是远远不够的,但是PHP本身又不像js那样覆盖系统原有的函数就是不允许函数重定义,这就给我们带来了麻烦,譬如我们想跟踪程序有不有调用preg_replace函数,并且想知道里面的参数形式,我们是没有办法的,但是利用PHP扩展就变得可能了,我们可以类似于一种Hook的方法来实现这些。譬如想调查 preg_replace的话,我们先将preg_replace这个函数从函数表里Dump成preg_replace_bak一份,然后 create_function建立我们自己的函数,我们自己的函数目的很简单,先保存参数然后调用原来的preg_replace_bak函数并返回结果,这样就可以监视脚本里这个函数的调用情况了。我这里有个简单的从函数表里删除函数的代码:
删除函数的一个php扩展代码
PHP_FUNCTION(fuck_fun)
{
char *function;
int function_len;
zval **findfun;
if (ZEND_NUM_ARGS() != 1 || zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"s", &function, &function_len) == FAILURE) {
WRONG_PARAM_COUNT;
}
TSRMLS_FETCH();
if (zend_hash_find(EG(function_table), function, strlen(function)+1,(void**)&findfun)==SUCCESS) {
php_printf("Find function %s OK\r\n",function);
}
else {
php_printf("Cann't find function %s\r\n",function);
}
if (zend_hash_del(EG(function_table), function, strlen(function)+1)==SUCCESS) {
php_printf("%s Unregister OK\r\n",function);
}
else {
php_printf("%s Unregister Faild\r\n",function);
}
RETVAL_LONG(42);
return;
}
4 再下去呢?再下去就是修改PHP内核了,就有点超出本文的范围了。文章要说明的是加密不是一切,通过修改程序运行环境以及一些小技巧然后再结合黑盒测试的方法,找出一些加密过的程序的安全漏洞还是可能的,本人就检测过国内一些加密程序,比较大的漏洞还是有的:)
上一页 [1] [2]