您当前的位置: 首页 > 

合天网安实验室

暂无认证

  • 1浏览

    0关注

    748博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

代码审计入门实战

合天网安实验室 发布时间:2020-03-31 13:55:02 ,浏览量:1

前段时间在整理一个PHP函数代码审计的项目,所以文章也是围绕PHP的代码审计来写,如果有写的不对的地方,还请大佬们指正。文章开始前,我们先来了解一下PHP是什么。

目录

0x01 PHP是什么

0x02 代码审计又是什么

0x03 PHP函数的代码审计

0x04 总结

  0x01 PHP是什么

 

根据百度百科的描述,PHP是一种在服务器端执行的通用开源脚本语言,主要适用于Web开发。

既然是网站编程语言,自然需要一款工具辅助程序员高效编程。PhpStorm就是一款PHP集成开发工具,可以随时帮助程序员对代码进行调整、运行单元测试、且提供可视化debug功能。

当然也可以使用其他工具对PHP程序进行调试,比如Xdebug,一款开放源码的PHP debug工具,用来跟踪、调试和分析PHP程序的运行状况。

大家可以通过学习这个实验,掌握PhpStorm环境搭建和Xdebug工具的安装和配置——代码审计的前期准备

 

网传这么一个段子:如何让一个论坛的人吵起来?答:PHP是世界上最好的语言。这个梗出自PHP的官方文档,最早出现在2001年7月的PHP文档中。虽然有PHP是世界上最好的语言这种说法,但是也有一些因为弱类型语言的安全性问题出现,这就需要安全人员通过代码审计来检查PHP程序的安全性。

  0x02 代码审计又是什么

代码审计,顾名思义就是检查源代码中的安全缺陷。通过自动化工具或人工审查的方式,对程序源代码逐条进行检查和分析,发现源码缺陷引发的安全漏洞,有时还需要提供代码修订措施和修复建议。

软件的源代码、程序缺陷可能导致严重的安全漏洞,要消除代码中的漏洞、减少不必要的补丁升级,就需要进行源代码的安全审计。源代码审计是对代码库和软件架构的安全性、可靠性进行全面的安全检查。人工审查已经成为软件源码设计、开发和应用的最佳保障,因此做好代码审计就是从安全的角度对整个代码质量进行评估。安全人员需要在黑客发现系统漏洞之前,找出应用的安全隐患,并提供相应的安全报告和修复方法,从而提高应用系统的安全性。

除了人工审查的方式,还可以通过一些自动化工具进行代码审计,下面简单介绍两种代码审计利器:

 

1、  Seay源代码审计系统

这是一款针对PHP代码安全审计的系统,基于C#语言开发,主要运行于Windows系统上。这款软件能够发现SQL注入、代码/命令执行、文件包含、文件上传、拒绝服务、XSS、信息泄露、任意URL跳转等漏洞。关于Seay源代码审计系统工具的使用,可以通过下面的实验进行学习,实验地址——代码审计利器-Seay源代码审计系统

 2、  RIPS

RIPS通过标记和解析所有源代码文件,自动检测PHP应用程序中的漏洞。RIPS能够将PHP源代码转换为程序模型,检测程序流期间用户输入可能污染的敏感接收器,即潜在易受攻击的函数。RIPS工具的使用参考下面的实验,实验地址——代码审计利器-RIPS实践

 学习了代码审计的常用工具,相信大家会对代码审计的方法和步骤有一定的了解,那么接下来简单总结一下代码审计的流程:

①  通读全文代码:更好地了解程序的架构及业务逻辑,挖掘更多高质量的漏洞;

②  通读敏感功能点:快速挖掘某种漏洞;

③  正向追踪可控变量;

④  敏感关键字回溯参数传递过程。

下面进入文章的重点部分——PHP函数的代码审计,通过具体实例分析PHP部分函数,包括in_array函数、filter_var函数、escapeshellarg与escapeshellcmd函数、parse_str函数及addslashes函数,学习上述函数缺陷引发的漏洞及利用方式,结合CTF练习掌握PHP函数漏洞审计流程。

 

0x03 PHP函数的代码审计

项目来自https://github.com/hongriSec/PHP-Audit-Labs

这里我们根据《PHP函数漏洞审计》课程顺序进行学习。

 

1、PHP代码审计之in_array函数

既然是对in_array函数进行具体分析,我们先来了解一下in_array函数的相关定义:

注:后面说到的函数定义均来自PHP手册,手册地址:http://php.net/manual/zh/index.php

 needle变量表示待搜索的值,

haystack表示待搜索的数组。in_array函数用法为:在haystack数组中搜索needle变量的值,检查值是否存在。如果第三个变量strict的值为true,则inarray函数会进行强检查,检查

needle的类型是否和$haystack数组中的相同。

in_array函数为什么会存在漏洞呢,原因是程序员在使用in_array函数进行数据处理时,未使用第三个参数进行严格匹配,比如Piwigo软件2.7.1版本就是因为in_array函数的不安全使用,导致SQL注入漏洞发生。

查看源码/picture.php文件可以发现,当$_GET[‘action’]为rate时,会调用文件/include/function_rate.inc.php文件中的rate_picture方法,漏洞就存在于这个方法中:

而在rate_picture方法中,使用了in_array函数对rate变量进行检测,判断

rate是否在$conf['rate_items']中:

由于functions_rate.inc.php文件中没有将in_array函数的第三个参数设置为true,所以会进行弱比较,可以将$rate的值设置成1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#进行绕过。

那么SQL语句就变成:

INSERT INTO piwigo_rate(user_id,anonymous_id,element_id,rate,date) VALUES (2,'192.168.2',1,1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#,NOW())

这样就可以进行盲注了。

直接利用sqlmap进行漏洞利用:

python sqlmap.py -u "http://10.1.1.79/piwigo/picture.php?/1/category/1&action=rate" --data "rate=1" --dbs

 还可以用sqlmap获取目标数据库的表及敏感数据。

总结一下in_array函数的审计流程:

 大家可以学习in_array函数缺陷引发的相关漏洞及其利用方式,学习地址——PHP代码审计之in_array函数

 

2、PHP代码审计之filter_var函数

 filter_var函数定义:

variable变量表示待过滤的变量(变量的值在过滤前,会被转换成字符串),

filter变量表示要应用的过滤器的ID,$options变量代表一个选项的关联数组或按位区分的标识。filter_var函数返回过滤后的数据,过滤失败则返回false。

这里以一个CTF练习介绍filter_var函数缺陷引发的漏洞可以怎么利用,题目考察filter_var函数的绕过与远程命令执行。题目源码为:

程序使用exec函数来执行curl命令,很容易让人联系到命令执行。可以看到用于拼接命令的$site_info变量是从用户传来的url参数,经过filter_var和parse_url两个函数过滤而来。之后又规定当url参数的值以hetianlab.com结尾时,才会执行exec函数。

这就需要绕过filter_var和parse_url函数,并且需要满足$site_info['host']的值以hetianlab.com结尾,然后通过执行系统命令获取flag。

Payload为/ctf/index.php?url=demo://%22;ls;%23;hetianlab.com:80/

直接用cat f1agi3hEre.php命令过不了filter_var函数检测,因为包含空格,使用如下payload获取flag:/ctf/index.php?url=demo://%22;cat

关注
打赏
1665306545
查看更多评论
立即登录/注册

微信扫码登录

0.0478s