内容主要是给没有PHP基础的人看
1
一、初步了解结构
> 首先在你拿到代码的时候,先要看看源码是否加密,然后你需要去解密,找工具,或掏点钱去某宝,这里不细说,然后我们需要先了解一下源码的结构:
1、入口文件
一般都是index.php,然后你需要仔细阅读一下该页面源码,了解整体结构,例如包含哪些配置文件、包含哪些过滤文件等。
2、配置文件
一般都是config.php,然后你需要查看一些数据库相关信息,先看看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
3、过滤功能
找到公共函数文件和安全过滤等文件 ,清晰地掌握用户输入的数据,哪些被过滤,哪些没有过滤,在哪里被过滤了,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?
4、寻找未鉴权
如果你只想审计前台漏洞的话,你需要先找到做鉴权功能文件,然后找到没有包含这个鉴权文件的PHP页面,再去进行审计,PHP鉴权方式就那几种,自己去了解一下。
2
二、审计方式
1、通过全文审计
通读全文法作是一种最麻烦也是最全面的审计方法,但是对于没有PHP基础的人来说,还是放弃吧。
2、定位危险函数
我们可以通过定位危险函数,然后逆向怎么调用链,找到可控参数,来挖掘漏洞,这个方法对于我们没有PHP基础的人来说,是最高效的方式,也是最常用的,大多数漏洞的产生原因就是因为函数的使用不当导致的,我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。
3、功能分析方法
我们可以在本地,使用phpstudy快速搭建网站,然后像黑盒测试一样,找各个功能点,分析其功能,然后在代码处找到该功能,看是否有过滤等。
3
三、常见危险函数及特殊函数
1、PHP代码执行函数
* eval函数,这是一个能将字符串识别为命令的高危函数,用法一般都是:
$a="phpinfo();"
eval($a)
* assert函数,这本来是一个用来调试的函数,俗称“断言函数”,编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。
assert('system("whoami");')
*preg_replace函数,这是一个正则表达式的替换函数,如果乱用的话也可能造成命令执行,详情请看链接:https://www.jb51.net/article/145646.htm
preg_replace("/test/e","phpinfo()","jutst test");
或者一些其他的匿名函数、回调函数
#匿名函数
$cfunc = create_function('$v','return system($v);');//创建函数返回执⾏system的值
$cfunc('whoami');
#匿名函数
$sfunc = 'sys'.'tem'
$sfunc('whoami');
#回调函数
function test($var){
echo "callable test $var"; }
call_user_func('test','virink');
2、命令执行函数
只要以下函数的参数可控,那么就可以命令执行!当然,不止这些
exec(); 执行一个外部命令函数
system();执行一个外部命令函数,并回显
passthru();执行一个外部程序并显示原始输出
proc_open();执行一个命令,并且打开用来文件输出或输入的文件指针
shell_exec();通过shell环境执行命令,并以字符串的方式完整的返回输出
popen();通过该函数传递一条命令,并对popen打开的文件进行执行
举例:
system($code);
只要变量$code我们可控,就会命令执行。
system('ping -c 4'.$IP);
这种多数存在于路由器的网络测试功能,变量$IP可控,我们可以进行命令拼接达到命令执行的效果
shell_exec("id");
shell_exec,是有返回的,但是它没有输出,所以命令执行了,但是没有回显,那么我们就可以使用dnslog把数据进行外带。
3、PHP文件包含函数
一共就有四个包含函数:
1、include函数
2、require函数
3、include_once函数
4、require_once函数
文件包含原理大家应该都很清楚把,只要包含的那个变量可控,而且allow_url_include开启的话,那么我们就有能进行getshell,一般都只有本地包含,服务器都默认关闭远程包含,那我们可以找到一个被限制的文件上传位置,上传一个txt文件,里面写入一句话木马,然后用文件包含漏洞来进行读取并执行代码。
如果没有的话,只能读取一些内网的文件、源码、敏感信息等,可以配合伪协议来使用,例如:
include($_GET['file']);
构造代码:
?file=php://filter/convert.base64-encode/resource=config.php
4、文件操作函数
fopen 打开一个文件或者URL
file 把一个文件读入数组
file_get_contents 将一个文件读入一个字符串内
file_put_contents 将字符串写入文件
copy 拷贝文件
move_uploaded_file 将上传的文件移动到其他文章
readfile 输出文件
rename 重命名一个文件或目录
rmdir 删除目录
unlink 删除文件
delete 删除文件
像任意文件读取、文件写入、文件删除漏洞,基本上都是因为用了这些函数,而没有控制好,像这些可以自己尝试研究一下。
5、特殊函数
这个好多呢还有,以上的东西你基本都记住了,你去审计应该也能审计出一些东西来,特殊函数就以后自己多了解把,本篇就不在写了。
最后如果你真的要从事审计工作的话,那必须得深入学习代码,以上内容只不过是应该每个从事渗透测试工作者必须会的简单审计,如果你有目标的话,以后从事安全研究,这一行,少不了要深入学习代码,别想着混了,别像我一样,天天在那混,早点成为大佬才是你的目标。
往期精彩:
点个在看你最好看
本文始发于微信公众号(Qingy之安全):【审计学习】PHP审计的危险函数概括
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论