PHP代码审计之敏感函数参数回溯法

admin 2022年5月1日14:49:45评论61 views字数 1862阅读6分12秒阅读模式

前言



    代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。代码审计不是简单的检查代码,审计代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。



代码审计常用工具

PHP代码审计之敏感函数参数回溯法

Seay源代码审计系统、Fortify SCA、RIPS


PHP代码审计之敏感函数参数回溯法


敏感函数参数回溯法

PHP代码审计之敏感函数参数回溯法

根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。这方面,Seay法师大大有一款神器Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。

(1)   根据敏感关键字回溯参数传递过程。

 

(2)   查找可控变量,正向追踪变量传递过程。

 

(3)   寻找敏感功能点,通读功能点代码、

 

(4)   直接通读全文代码

PHP代码审计之敏感函数参数回溯法

回溯过程

PHP代码审计之敏感函数参数回溯法

这里用seay源代码审计系统举例:

打开某CMS源代码,先点击新建项目

PHP代码审计之敏感函数参数回溯法


选择解压出来的源代码的根目录,然后点击确定

PHP代码审计之敏感函数参数回溯法


点击自动审计,再点击开始

PHP代码审计之敏感函数参数回溯法


可以看到自动审计根据敏感函数列出了可能存在的漏洞

PHP代码审计之敏感函数参数回溯法


PHP代码审计之敏感函数参数回溯法


敏感函数列举

PHP代码审计之敏感函数参数回溯法

函数回溯发审计常用漏洞

 

Xss 审计:

 

1.反射xss一般seay可以直接搜索str_replace关键字,也可以通过手工搜索来寻找

 

2.存储型 XSS全局搜索数据库的插入语句(关键词:insert,save,update),然后找到该插入语句所属的方法名如 (insertUser()),然后全局搜索该方法在哪里被调用,一层层的跟踪

 

SQL 注入:

 

一般直接搜索select、update、delete、insert 关键词就会有收获,如果 sql 语句中有出现+、 append、 $、 ()、 # 等字眼,如果没有配置SQL 过滤文件,则判断存在 SQL 注入漏洞

 

任意文件下载:


审计方法:全局搜索以下关键词 fileName、filePath、getFile、getWriter、download

查看下载文件或路径是否可控

 

文件上传:


文件上传可以搜索以下关键词:(需注意有没有配置文件上传白名单)

upload、write、fileName 、filePath

在查看时,主要判断是否有检查后缀名,同时要查看配置文件是否有设置白名单或者黑名单

 

文件包含:


直接搜索include、require、include_once、require_once

 

Ssrf:


搜索函数跟踪请求file_get_contents、fsockopen、curl_exec

 

CSRF:


审计方法:通过查看配置文件有没有配置 csrf 全局过滤器,如果没有则重点看每个操作前有没有添加 token 的防护机制

PHP代码审计之敏感函数参数回溯法


审计思路

PHP代码审计之敏感函数参数回溯法

先用小皮搭建好我们的cms用来复现漏洞


PHP代码审计之敏感函数参数回溯法


安装完成


开始审计


后台链接添加处admin/link.php ,siteurl参数输出时未进行实体化处理导致,存储型xss。在$action=addlink时,通过addslashes函数进行转义处理,防止进行sql注入,但是未进行任何的html实体化,或者过滤处理。通过第44行代码可发现进行了正则匹配所以我们构造的payload需以http、ftp开头,才能进型数据插入。

PHP代码审计之敏感函数参数回溯法


通过addLink函数插入链接,接下来跟进/include/model/link_model.php中的link_Model->addLink函数,该函数将经过addslashes转义完的链接插入数据库 进行存储。

PHP代码审计之敏感函数参数回溯法

接下来跟进输出情况,当action参数为空,通过/include/model/link_model.php中的Link_Model->getLinks()函数从数据库查询sitename、description、siteurl,并返回查询结果,最后由View::output()进行输出。getLinks()函数查询数据库获取,获取sitename、description、siteurl数据,查看可发现未对siteurl参数进行实体化和过滤处理。

PHP代码审计之敏感函数参数回溯法

查看/include/lib/view.php 中的View::output函数,最后结果通过echo输出,在整个过程都未对siteurl进行实体化、过滤处理,导致最终造成存储型xss。

PHP代码审计之敏感函数参数回溯法

验证一下

PHP代码审计之敏感函数参数回溯法


PHP代码审计之敏感函数参数回溯法


PHP代码审计之敏感函数参数回溯法

原文始发于微信公众号(易东安全研究院):PHP代码审计之敏感函数参数回溯法

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月1日14:49:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP代码审计之敏感函数参数回溯法http://cn-sec.com/archives/964064.html

发表评论

匿名网友 填写信息