精华内容
下载资源
问答
  • Seay PHP代码审计工具支持单个关键字扫描、批量函数扫描、批量正则匹配,其中正则表达式扫描精确度最高,效率最高。 Seay PHP代码审计工具功能: 源码浏览:载入程序源码后,可以在最左边的程序文件列表里面点击...
  • PHP 代码审计神器rips

    2018-07-04 10:53:19
    RIPS是一款对PHP源码进行风险扫描的工具,其对代码扫描的方式是常规的正则匹配,确定sink点;还是如flowdroid构建全局数据流图,并分析存储全局数据可达路径
  • https://img.yzcdn.cn/upload_files/2018/05/14/FmVac3rLz8_HJfptJiGj4K7oN__0.png!730x0.jpg;说明地址:https://detail.youzan.com/show/goods?alias=2otyjdyk15wak&from=wsc&kdtfrom=wsc
  • PHP代码审计教学视频

    2020-01-28 11:41:42
    PHP代码审计入门教学视频,对新手代码审计比较友好。对一些常规的漏洞(sqli、XSS、变量覆盖、PHPSTROM使用等等)都有非常详细的介绍
  • 仅拿出几个洞作为例子进行入坑的讲解, 主要是使用 rips 进行辅助审计, 本文是针对小白入坑作为抛砖引玉, 理论的还未进行详细总结, 本来想在最后加上盾灵系统的审计过程。但是觉得 CMS, 不适合刚入门的同学先...
  • PHP代码审计文档.zip

    2021-11-02 11:38:29
    第19课:PHP代码审计之会话认证漏洞mp4 第18课:PHP伪协议mp4 第17课:PHP弱类型mp4 第16课:PHP代码审计之反序列化漏润mp4 第15课:PHP代码审计之变量盖漏洞mp4 第14课PHP代码审计之任意文件读取及删除漏洞mp4 第13课...
  • 任务19:PHP代码审计之会话认证漏洞mp4 任努18:PHP伪协议mp4 任务17:PHP弱类型mp4 任务16:PHP代码审计之反序列化漏润mp4 任务15:PHP代码审计之变量盖漏洞mp4 任务14PHP代码审计之任意文件读取及删除漏洞mp4 任务13...
  • 对Web安全感兴趣的人员、初级渗透测试人员、高职信息安全大赛参赛人员。
  • PHP代码审计

    2019-04-10 11:14:52
    php代码审计包含输入验证和输出显示,会话安全,如何加密,认证和授权,随机函数,特殊字符和多字节编码,php危险函数,信息泄露,PHP环境等
  • 摘要:C#源码,字符处理,代码审计 C#编写的PHP代码审计工具的源代码,本人目前就读重庆某软件学院软件测试专业,将于2013年1月底毕业,为了扎实基础,于是有时间就会找一些源码研究,有时候想走走捷径,提高下效率,...
  • Seay PHP代码审计工具

    2012-11-11 11:17:17
    大黑阔写的php代码审计工具 确实不错 调试方法蛮新颖的
  • php代码审计pdf

    2011-10-30 09:18:39
    代码审核 代码审计 php代码审核 php代码审计 代码漏洞
  • 总结一下在PHP代码审计中常用到的代码审计思路 文章目录敏感函数回溯参数过程通读全文代码方法:根据功能点定向审计 敏感函数回溯参数过程 根据敏感函数来逆向追踪参数的传递过程,是目前使用的最多的一种方式,因为...

    总结一下在PHP代码审计中常用到的代码审计思路

    敏感函数逆向回溯参数过程

    根据敏感函数来逆向追踪参数的传递过程,是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。 另外非函数使用不当的漏洞,如sql注入,也有一些特征,比如select、insert等,再结合from和where等关键字,我们就可以判读是否是一条SQL语句,通过对字符串的识别分析,就能判读这个sql语句里面的参数有没有使用单引号过滤,或者根据我们的经验来判断。就像是HTTP头里面的HTTP_CLIENT_IP和HTTP_X_FORWARDFOR等获取到的IP地址经常没有安全过滤就直接拼接到了SQL语句中,并且由于它们是在$_SERVERE变量中不受gpc的影响,那我们就可以去查找HTTP_CLIENT_IP和HTTP_X_FORWARDFOR关键字来快速寻找漏洞。

    这种方式的优点是只需要搜索相关敏感关键字,即可以快速得挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。缺点是由于没有通读代码对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

    espcms注入挖掘案例

    我们来举一个根据关键字回溯的例子,用PHP程序espcms举例,使用Seay源代码审计系统做演示,首先载人程序,然后点击自动审计,得到一部分可能存在漏洞的代码列表,如下图所示。
    在这里插入图片描述
    我们挑其中的一条代码,如下图所示:
    在这里插入图片描述
    双击该项直接定位到这行代码,如下图所示。在选中该变量后,在下方可以看到该变量的传递过程,并且点击下方的变量传递过程也可以直接跳转到该项代码处,可以非常直观地帮助我们看清整个变量在该文件的传递过程。另外我们可以看到$parentid变量是在如下代码段获得的:

    $parentid = $this->fun->accept ('parentid', 'R');
    

    在这里插入图片描述
    右键选中该代码定位该函数主体,如图所示:
    在这里插入图片描述
    在这里插入图片描述
    可以看到跳转到了class function.php 文件的314行,
    在这里插入图片描述
    代码如下:

    function accept($k, $var = 'R', $htmlcode = true, $rehtml = false) {
    		switch ($var) {
    			case 'G':
    				$var = &$_GET;
    				break;
    			case 'P':
    				$var = &$_POST;
    				break;
    			case 'C':
    				$var = &$_COOKIE;
    				break;
    			case 'R':
    				$var = &$_GET;
    				if (empty($var[$k])) {
    					$var = &$_POST;
    				}
    				break;
    		}
    
    		$putvalue = isset($var[$k]) ? $this->daddslashes($var[$k], 0):NULL;
    		return $htmlcode ? ($rehtml ? $this->preg_htmldecode($putvalue):$this->htmldecode($putvalue)):$putvalue;
    	}
    

    可以看到这是一个获取GET、POST、COOKIE 参数值的函数,获取到参数值后,会将k变量进行daddslashes函数过滤, daddslashes会把单引号(’)、双引号(")、反斜线(\)与 NUL(NULL 字符)进行转义。我们传人的变量是parentid和R,则代表在POST、GET中都可以获取parentid参数,最后经过了一个daddslashes()函数,实际上是包装的addslashes()函数,对单引号等字符进行过滤,不过注意看前面的SQL语句是这样的:

    $sql = "select * from $db_ table where parentid=$parentid";
    

    并不需要单引号来闭合,于是可以直接注入。
    那怎么才能找到web页面parentid接口处的url值呢?在citylist.php文件看到oncitylist()函数在important类中,选中该类名右键点击“全局搜索”功能,如下图所示。
    在这里插入图片描述
    可以看到index.php文件有实例化过该类,代码如下:

    $archive = indexget ('archive', 'R') ;    // indexget函数和上面的accept功能一样
    $archive = empty ($archive) ? ' adminuser' : $archive;
    $action = indexget('action''R') ;
    $action = empty($action) ? ' login' : $action;
    include admin_ _ROOT。adminfile 。"/control/Sarchive .php";
    $control = new important() ;
    $action = 'on'$action; .
    if (method_ exists ($control, $action)) {
    	$control->$action() ;
    } else {
    	exit('错误:系统方法错误! ');
    }
    

    这里可以看到一个include文件的操作,可惜经过了addslashes() 函数无法进行截断使其包含任意文件,只能包含本地的PHP文件,如果你有MySQL的root权限,能导出文件到tmp目录,不能导出到Web目录,这种场景才用得到这个文件包含,再往下走就是实例化类并且调用函数的操作了,根据代码可以构造出利用EXP:

    http://127.0.0.1/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid= -1 union select 1,2,user() ,4,5
    

    archive 可控,调用citylist文件里的oncitilist方法,oncitilist方法中调用parentid参数。
    漏洞截图如图3-6所示。
    在这里插入图片描述
    这个案例非常真实地演示了如何根据关键字回溯变量来进行代码审计。

    通读全文代码

    前面提到的根据敏感关键字来回溯传入的参数,是一种逆向追踪的思路,我们也提到了这种方式的优点与缺点,实际上在需要快速寻找漏洞的情况下用回溯参数的方式是非常有效的,当这种方式斌不适合运用在企业中做安全运营时的场景,在企业中做自身产品的代码审计时,我们需要了解整个应用的业务逻辑,才能挖掘到更多有价值的漏洞。

    通读全文代码也有一定的技巧,并不是随便找个文件逐个读完就可以了,这样你是很难真正读懂这套web程序的,也很难理解代码的业务逻辑。首先我们要看程序的大体代码结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,处理关注有哪些文件,还要注意文件的大小、创建时间。我们根据这些 文件的命名 就可以大致了解这个程序实现了哪些功能,核心文件是哪些。

    下图是discus的程序主目录:
    在这里插入图片描述
    在看程序目录的时候我们要 特别注意以下几个文件:

    (1)函数集文件,通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到这些函数集文件。寻找这些文件一个非常好用的技巧就是打开index.php或者一些功能性文件,在头部一般都会找得到的。

    (2)配置文件,通常命名中包括config关键字,配置文件包括web程序运行必须的 功能性配置选项 以及 数据库等配置信息。从这个文件中可以了解程序的小部分功能。
    另外看这个文件的时候注意观察配置文件中参数值是 单引号 还是 双引号 括起来,如果是双引号,则很可能会存在代码执行漏洞
    例如下面Kuwebs的代码,只要我们在修改配置的时候利用PHP可变变量的特性即可执行代码

    <?php
    /*网站基本信息配置*/
    $kuWebsiteURL  = "http:/ /www. kuwebs . com" ;
    $kuWebsiteSupportEn = "1"
    $kuWebsiteSupportSimplifiedOrTraditional = "0";
    $kuWebsiteDefauleIndexLanguage = "cn";
    $kuWebsiteUploadFileMax = "2";
    $kuWebsiteAllowUploadFileFormat = "swf|rar|jpg|zip|gif";
    
    /*邮件设置*/
    $kuWebsiteMailType = "1";
    $kuWebsiteMailSmtpHost = "smtp.qq.com";
    

    PHP中双引号引起的命令执行漏洞:
    在PHP语言中,单引号和双引号都可以表示一个字符串,但是对于双引号来说,可能会对引号内的内容进行二次解释,这就可能会出现安全问题。
    举个简单例子
    在这里插入图片描述
    可以看到这两个输出的结果并不相同。在双引号中倘若有${}出现,那么{}内的内容将被当做代码块来执行。
    试想一下,倘若在一个cms的后台,可以修改数据库的配置文件,且配置文件中的值用双引号包括,我们虽然也可以直接闭合代码达到getshell的后果,但是如果cms对传递的参数进行了addlashes()处理的话,我们就无法去闭合代码了,但这时我们可以传入** 命 令 ∗ ∗ 就 可 以 达 到 g e t s h e l l 的 目 的 。 如 : ‘ < ? p h p e c h o " {命令}**就可以达到getshell的目的。如: `<?php echo " getshell<?phpecho"{@assert($_POST[a])}";?> //@是用来防止输出错误信息的`
    成功连接
    在平时的代码书写中能只用单引号一定不要用双引号,毕竟单引号的解释时间也比双引号少得多,代码运行相对更快。

    (3)安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有filtersafecheck等关键字,这类文件主要是对参数进行过滤,比较常见的是针对sql注入和XSS过滤,还有文件路径、执行的系统命令参数、其他的则相对较少见。目前大多数引用单独对在程序的入口循环对所有参数使用addslshes()函数进行过滤。

    private static function_do_query_safe($sq1) {
    $sql = str_replace (array('\\\\', '\\\'', '\\"''\'\'), '', $sql);
    $mark = $clean = '';
    if (strpos($sql, '/') === false && strpos($sq1, '#') === false && 
    strpos($sq1, '--') === false && strpos ($sql, '@') === false &&
    strpos ($sql, '`') === false) {
    $clean = preg_ replace("/'(.+?) '/s", '', $sql) ;
    } else {
    

    (4)index文件,index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些而不同目录的index文件也有不同的实现方式,建议最好先将几个核心目录的index文件都简单的读一遍。

    上面介绍我们应该注意的部分文件,可以帮助我们更有方向的去读全部的代码,实际上在我们真正做代码审计的时候经常会遇到各种框架,这时候就会被搞得晕头转向,所以在学习代码审计的前期建议不要去读开源框架或者使用开源框架的应用,先去chinaz、admin5之类的 源码下载网站 读一些小程序,并且一定要多找几套程序通读全文代码,这样我们才能总结经验,等总结了一定的经验,对PHP也比较熟悉了之后再去读那些框架(thinkphp、Yii、Zend Frameword)等开源框架,才能快速的挖掘出高质量的漏洞。

    通读代码的好处显而易见,可以更好的了解程序的架构以及业务逻辑,能够挖掘到更多、更高质量的逻辑漏洞,一般老手都会比较喜欢这种方式。而缺点就是花费的时间长,如果程序比较大,读起来也比较累。

    根据功能点定向审计

    在有了一定的代码审计经验之后,一定会知道 哪些功能点通常会有哪些漏洞,在我们想要快速挖掘漏洞的时候就可以这样来做,首先安装好并且运行程序,到处点点,浏览一下,看一下程序有哪些功能,这些功能的程序文件分别是怎样的,是独立的模块还是以插件的形式存在,或者是写一个通用类里面,然后多处调用。在了解了这些功能的存在形式之后,可以先寻找经常会出现问题的功能点,简单黑盒测试一下,如果没有发现很普通、很常见的漏洞,再去读这个功能的代码,这样我们读起来就可以略过一些刚才黑盒过的测试点,提高审计速度。

    根据经验,下面简单的介绍几个功能点经常会出现的漏洞,如下:

    (1)文件上传功能:这里说的文件上传功能在很多功能点都会出现,比如像文章的编辑、资料编辑、头像上传、附件上传,这个功能最常见的漏洞就是任意文件上传了,后端程序没有严格限制上传文件的格式、导致可以直接上传或者存在绕过的情况。而除了文件上传功能之外,还经常发生SQL注入漏洞。因为一般程序员都不会注意到对文件名进行过滤,但是有时需要把文件名保存到数据库中,所以就会存在sql注入漏洞。

    (2)文件管理功能:在文件管理功能中,如果程序将文件名或者文件路径直接在参数中传递,则很有可能会存在任意文件操作的漏洞,比如任意文件读取、目录遍历等等,利用的方式是在路径中使用…/或者…\跳转目录。

    (3)登录认证功能:登录认证功能不是指一个登录过程,而是整个操作过程中的认证,目前的认证方式大多是基于CookieSession,不少程序会把当前登录的用户账号等认证信息放到Cookie中,或许是加密方式,是为了保持用户可以长时间登录,不会一退出浏览器或者Session超时就退出账户,进行操作的时候直接从Cookie中读取出当前用户信息,这里就存在一个算法可信的问题,如果这段Cookie信息没有加salt一类的东西,就可以导致任意用户登录漏洞只要知道用户的部分信息,即可生成认证令牌,甚至有的程序会直接把用户明文放到Cookie中,操作的时候直接取这个用户名的数据,这也是常说的越权漏洞

    (4)找回密码功能:找回密码虽然看起来不像任意文件上传这种可以危害到服务器安全的漏洞,但是如果可以重置管理员的密码,也是可以间接控制业务权限甚至拿到服务器权限的。而找回密码功能的漏洞利用场景很多,最常见的是对验证码的爆破,目前特别是APP应用中,请求后端验证码的时候大多是4位,并且如果没有限制验证码错误的次数和有效时间,于是就出现了爆破的漏洞除此之外,还有验证码凭证的算法,这需要在代码中才能看到,所以我们做代码审计的时候可以看看这个算法是否可信。

    BugFree重装漏洞案例

    针对功能点的审计是相对简单的,不过在使用这种方式审计之前建议先了解整个程序的架构设计和运行流程,程序重装漏洞在早期是比较常见的,我们来看看 BugFree 的程序安装功能,该程序之前被papaver爆出存在多个漏洞,其中就有一个重装漏洞。

    BugFree安装文件在 install\index.php,代码如下:

    <?php
    require_once('func.inc.php') ;
    set_time_limit(0) ;
    error_reporting(E_ERROR) ;
    //基本路径
    define('BASEPATH', realpath(dirname(dirname(__FILE__) ) ) ) ;
    // upload path 
    define('UPLOADPATH', realpath(dirname(dirname(dirname(__FILE__))) ).DIRECTORY_SEPARATOR. 'BugFile') ;
    //配置样本文件路径.
    define('CONFIG_SAMPLE_FILE', BASEPATH .'/protected/config/main.sample.php');
    //配置文件路径
    define('CONFIG_FILE', BASEPATH, '/protected/config/main.php');
    

    看这段代码首先包含了’func.inc.php’文件,跟进这个文件可以看到一些读取配置文件、检查目录权限以及服务器变量等功能的函数,下方则是定义配置文件的路径,继续往下走,真正进行程序逻辑流程的地方如下代码所示:

    $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : CHECK;
    if(is_file("install.lock") && $action != UPGRADED && $action != INSTALLED){
    	header ("location: ../index.php");
    }
    

    这段代码存在一个逻辑漏洞,首先判断install.lock文件是否存在以及 action 参数值是否升级完成和安装完成,如果是,则跳转到程序根目录首页,这里仅仅使用了

    header ("location: ../index.php") ;
    

    并没有使用die()或者exit()等函数退出程序流程,这个跳转只是HTTP头的跳转,下方代码依然会继续执行,这时候如果使用浏览器请求 install/index.php 文件则会跳转到首页,我们用burp试试,效果如下图所示:
    在这里插入图片描述
    可以看到程序又可以再次安装了。

    展开全文
  • 载入源码:三个地方可以载入源码,分别在主...漏洞仓库:在这可以对审计文档进行管理。包括新建、打开、修改、删除操作。 扫描配置:可以对综合扫描要用到的函数、正则表达式进行管理。包括查看、新增、修改、删除。
  • PHP代码审计脑图

    2019-03-13 21:29:51
    php代码审计,算是一个笔记。留着以后看。 php代码审计需要比较强的代码能力以及足够的耐心.....
  • 载入源码:三个地方可以载入源码,分别在主...漏洞仓库:在这可以对审计文档进行管理。包括新建、打开、修改、删除操作。 扫描配置:可以对综合扫描要用到的函数、正则表达式进行管理。包括查看、新增、修改、删除。
  • php代码审计

    2016-03-28 02:00:51
    代码审计
  • PHP代码审计入门

    千次阅读 2019-01-06 15:24:43
    二:为什么选择PHP学习代码审计 三:入门准备 四:PHP常见的套路 4.1 代码结构 4.2 目录结构 4.3 参考项目 五:如何调试代码 六:代码审计的本质 一:代码审计的定义 通过阅读一些程序的源码去发现潜在的...

    目录

    一:代码审计的定义

    二:为什么选择PHP学习代码审计

    三:入门准备

    四:PHP常见的套路

    4.1 代码结构

    4.2 目录结构

    4.3 参考项目

    五:如何调试代码

    六:代码审计的本质


    一:代码审计的定义

    通过阅读一些程序的源码去发现潜在的漏洞,比如代码不规范,算法性能不够,代码重用性不强以及其他的缺陷等等

    从安全人员的角度来看是:查找代码中是否存在安全问题,推断用户在操作这个代码对应功能的时候,能否跳出开发人员设想的场景

    和逻辑,去给网站数据或者服务器造成危害。例如在购物结算的时候,正常用户想着付款结束购买,而我们要想着这个功能是不是存

    在0元购买等逻辑漏洞。

    其次代码审计可以发现一些扫描器难以发现的细节,比如某一个特定的功能场景,只有当你传入特定的参数值的时候,才会触发这个

    漏洞,这种情况是扫描器很难发现到的。

    二:为什么选择PHP学习代码审计

    PHP是天生用来开发web程序的,正如之前的梗"PHP是世界上最好的语言",最主要的原因是PHP编写的各种程序,如cms 商城 论

    坛 博客等占据了市场上的绝大份额,在今后的漏洞挖掘中经常遇得到。其次,PHP官方的中文资料文档非常丰富,适合我们每个阶段

    的人去学习

    链接:http://php.net/manual/zh/index.php

    三:入门准备

    1.PHP的编程基础

    2.环境搭建能力(由于我们的环境是为了让代码跑起来,并不是真正上线,所以为了方便推荐使用集成工具面板,例如PHP study

    和宝塔)

    四:PHP常见的套路

    这些所谓的套路在其他编程语言中也存在,只是一个通用与适用的问题,我们要学会举一反三

    4.1 代码结构

    常见的代码结构有两种:

    1.HTML与PHP代码混编,特征就是一个url对应一个PHP页面,例如WordPress的登陆页面http://wordpress.com.test/wp-login.php

    2.MVC模式

              把代码拆分为Model View Controller三部分结构,

             模型一般是数据库操作的相关的代码,例如jsp中的javabean用来设计数据的属性和行为,提供获取属性和设置属性的get/set方法

             视图通常是HTML代码和其他编程语言的混编结果,可以把一些控制器传递过来的结果,进行一定的拼接

             控制器的代码一般是接受数据,做一些数据的校验,权限的判定,调用一些模型的数据库操作代码,把获得到的数据,传递给

    视图,然后视图把装好的HTML代码发送到客户端

    MVC的常见表现形式是通常有一个入口文件,这个入口一般是index.php

    4.2 目录结构

    • 放引用的库或者插件,文件夹名字一般叫librarie/lib/plugin,
    • 现代的PHP项目还有一个vendor文件夹,是PHP的包管理器安装依赖代码存放的路径
    • 视图代码文件夹名称一般叫layout,theme,template,view
    • 控制器文件夹一般叫controller
    • 公用的一些代码文件夹一般叫common
    • 一些工具函数可能放helper/util/tool文件夹里
    • 配置文件放在config文件夹里
    • components或modules:这里有mvc的代码,把功能互相独立出来
    • route.php:对不同的url调用不同的代码

    4.3 参考项目

    https://github.com/fecshop/yii2_fecshop

    https://github.com/PrestaShop

    https://github.com/opencart/opencart

    https://github.com/joomla/joomla-cms

    五:如何调试代码

    1.直接修改源代码,利用var_dump()打印变量,然后在不同分支里面用echo字符串的形式去标记,然后用die函数终止代码

    2.使用xdebug扩展

    3.网络相关的调试,可以通过wiresharek,看网络通讯

    六:代码审计的本质

    代码审计是一种经验的对抗和压制:如果我知道的东西比你多,经验就能压制你,如果你的功能没有考虑到这一点,那么就会存在

    漏洞。例如对于富文本xss过滤方案,业内最优解已经产生,而你编程的时候没有使用最优解,而是从网上超了一段代码来使用,那

    么在审计的时候就产生了绝对压制。

    如果你的水平和开发的水平不。相上下,那么就只能根据对方的代码或者算法去设想和构造不同的场景+参数,甚至是通过fuzz来验

    证是否存在漏洞。

     

    展开全文
  • 代码审计比较有意思的例子貌似是去年 ecshop支付漏洞偶然出来的一个例子,感觉不错。分享下 复制代码 代码如下:<?php$a=addslashes($_GET[‘a’]);$b=addslashes($_GET[‘b’]);print_r($a.' ’);print_r($b.'...
  • CTF之PHP代码审计2

    2020-03-11 16:21:07
    ctf之php代码审计,从入门到入土!!! 变量覆盖之:extract函数的漏洞,$$的漏洞,parse_str的漏洞 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 由于php中可以使用$$声明变量,因此当在遍历...

    变量覆盖

    通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞

    extract

    在这里插入图片描述
    具体可以查看手册上的内容php:extract
    warning:不要对不能信任的数据使用 extract(),例如用户的输入($_GET, $_FILES,…)。如果这样做,举例说,要临时运行依赖于 register_globals 的老代码,要确保使用不会覆盖的 extract_type 值,例如 EXTR_SKIP,并且要留意应该按照 variables_order 在 php.ini 里 定义的顺序来提取。
    下面看一个题目具体分析一下:
    在这里插入图片描述

    我们要使$gift=$flag,由于extract($_GET),我们可以直接传gift和flag的值即可,但有file_get_contents,我们就要找它为空的时候是什么
    在这里插入图片描述
    为空的时候是NULL,那么我们可以传?flag=&gift=就行了
    在这里插入图片描述

    $$

    由于php中可以使用$$声明变量,因此当在遍历数组时可能会覆盖原来的值

    <?php
    highlight_file(__FILE__);
    $a="hello world";
    echo "$a";
    echo "<br>";
    foreach ($_GET as $key => $value)
       {
           $$key = $value;
       }
    echo "$a";
    ?>
    

    使用foreach来遍历数组中的值,然后再将获取到的数组键名作为变量,数组中的键值作为变量的值。我们传入?a=hello造成变量覆盖
    在这里插入图片描述
    下面一个例题具体分析一下:
    在这里插入图片描述
    由于$$key = $$value我们传入的flag会覆盖已有的flag,所以说我们应该用一个变量先覆盖之前的flag,由于最后有die($_200),会输出数据,我们就传入?_200=flag,然后POST方式提交flag=a即可
    在这里插入图片描述

    parse_str

    在这里插入图片描述
    如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量

    参数描述
    string必须。规定要解析的字符串
    array可选,规定储存变量的数组的名称。该参数指示变量将被存储到数组中

    在这里插入图片描述
    用GET方式提交id,我们可以用id覆盖a[0],然后传入与QNKCDZO一样md5的值即可
    在这里插入图片描述
    注意:由于 PHP 的变量名不能带「点」和「空格」,所以它们会被转化成下划线。
    参考文章:由一道ctf学习变量覆盖漏洞

    全局变量$GLOBALS

    $GLOBALS — 引用全局作用域中可用的全部变量
    一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
    实验环境:bugku:变量1
    在这里插入图片描述

    只要运行 eval(“var_dump($$args);”)即可得到flag
    由$$args我们可以猜想$args很有可能是一个数组,应该想到的就是超全局变量,传入即可的到flag
    在这里插入图片描述

    空白符

    <?php
     
    $info = ""; 
    $req = [];
    $flag="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
     
    ini_set("display_error", false); //为一个配置选项设置值
    error_reporting(0); //关闭所有PHP错误报告
     
    if(!isset($_GET['number'])){
       header("hint:26966dc52e85af40f59b4fe73d8c323a.txt"); //HTTP头显示hint 26966dc52e85af40f59b4fe73d8c323a.txt
     
       die("have a fun!!"); //die — 等同于 exit()
     
    }
     
    foreach([$_GET, $_POST] as $global_var) {  //foreach 语法结构提供了遍历数组的简单方式 
        foreach($global_var as $key => $value) { 
            $value = trim($value);  //trim — 去除字符串首尾处的空白字符(或者其他字符)
            is_string($value) && $req[$key] = addslashes($value); // is_string — 检测变量是否是字符串,addslashes — 使用反斜线引用字符串
        } 
    } 
     
     
    function is_palindrome_number($number) { 
        $number = strval($number); //strval — 获取变量的字符串值
        $i = 0; 
        $j = strlen($number) - 1; //strlen — 获取字符串长度
        while($i < $j) { 
            if($number[$i] !== $number[$j]) { 
                return false; 
            } 
            $i++; 
            $j--; 
        } 
        return true; 
    } 
     
     
    if(is_numeric($_REQUEST['number'])) //is_numeric — 检测变量是否为数字或数字字符串 
    {
     
       $info="sorry, you cann't input a number!";
     
    }
    elseif($req['number']!=strval(intval($req['number']))) //intval — 获取变量的整数值
    {
     
         $info = "number must be equal to it is integer!! ";  
     
    }
    else
    {
     
         $value1 = intval($req["number"]);
         $value2 = intval(strrev($req["number"]));  
     
         if($value1!=$value2){
              $info="no, this is not a palindrome number!";
         }
         else
         {
     
              if(is_palindrome_number($req["number"])){
                  $info = "nice! {$value1} is a palindrome number!"; 
              }
              else
              {
                 $info=$flag;
              }
         }
     
    }
     
    echo $info;
    
    

    我先把题目代码放出来,学习一下相关函数再来解

    intavl函数

    在这里插入图片描述
    在这里插入图片描述
    成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。

    最大的值取决于操作系统:
    32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647
    64 位系统上,最大带符号的 integer 值是 9223372036854775807。
    在这里插入图片描述

    浮点数精度

    当1.01的小数位加到一定次数后,会认为和1一样大
    在这里插入图片描述

    is_numeric函数

    在这里插入图片描述
    is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对于第一个空格字符会跳过空格字符判断,接着后面的判断!
    在这里插入图片描述
    并且会跳过一些符号:
    在这里插入图片描述
    这里有个题目顺便说一下
    实验环境:bugku:矛盾

    $num=$_GET['num'];
    if(!is_numeric($num))
    {
    echo $num;
    if($num==1)
    echo 'flag{**********}';
    }
    

    不能传is_numeric类型,又要等于1,由于是等于==,弱类型,我们可传:?num=1x,x为非数字字符即可
    在这里插入图片描述

    trim函数

    在这里插入图片描述

    strrev函数

    在这里插入图片描述

    解题

    1. number不为空,且不能是一个数值型数字,包括小数。(由is_numeric函数判断)
    2. number不能是一个回文数。(is_palindrome_number判断)
    3. 该数的反转的整数值应该和它本身的整数值相等(strrev判断)

    一:由于我的系统是64位的,导致intval没有溢出,但是32位可以通过溢出来写
    二:采用科学计数法构造payload为number=0e-0%00,成立
    在这里插入图片描述
    三:由于trim未过滤\f,我们可以传入\f的url编码%0c,绕过了回文数,number=%00%0c121
    在这里插入图片描述
    四:%2B解析后为+,‘+121’=='121’且intval(‘121+’)==121 ,可传?number=%00%2B121
    在这里插入图片描述

    具体可参考文章:绕过过滤的空白字符

    最近发现一个练习php代码审计的地址:PHP代码审计分段讲解,需要可在师傅的github下载源码

    展开全文
  • PHP代码审计工具2012终结版
  • 漏洞银行“大咖面对面”录屏+资料 持续更新中…… 大咖经验在线分享、行业热点开放交流、技术思维倾囊相授 “大咖面对面”信息安全技术公益讲座由漏洞银行方主办 漏洞银行平台(BUGBANK),国内首家互联网安全服务SAAS...
  • chinaz CMS,解压即用,用于php代码审计,非MVC框架,简单入门级
  • PHP语言基础 PHP的函数们! 代码审计需要什么? 代码审计课程安排! PHP代码编写 PHP安全问题类型
  • PHP代码审计工具RIPS

    2020-10-10 14:12:44
    在Centos7操作系统中安装rips并使用rips进行代码审计工作 # 安装依赖 yum install httpd.x86_64 ...

    在Centos7操作系统中安装rips并使用rips进行代码审计工作

    # 安装依赖
    yum install httpd.x86_64 php-devel.x86_64 php.x86_64 php-mysql.x86_64 php-soap.x86_64 php-xml.x86_64 php-xmlrpc.x86_64 php-ldap.x86_64 php-cli.x86_64 -y
    
    # 下载rips并解压至Web目录
    unzip rips-0.55.zip -d /var/www/html/
    mv rips-0.55/ rips
    
    # 启动服务
    systemctl enable httpd.service
    systemctl start httpd.service
    
    # 允许防火墙通过http服务
    firewall-cmd --permanent --add-service=http
    firewall-cmd --reload
    

    此时rips已经可以被正常访问使用:

    image-20201010134543006

    使用DVWA的代码进行测试:

    image-20201010135006249

    我们可以通过调整verbosity level来进行不同层次的扫描,扫描结果也会不一致。

    展开全文
  • php代码审计常见漏洞函数介绍

    千次阅读 2019-04-29 12:05:03
    php代码审计常见漏洞函数介绍 一:常见的容易出现漏洞的函数介绍 1:intval()使用不当导致安全漏洞的分析 1.1:函数介绍 intval() 函数用于获取变量的整数值。intval函数有个特性:“直到遇上数字或正负符号才开始做...
  • PHP代码审计入门笔记
  • php代码审计入门读书小结

    千次阅读 2019-06-05 14:01:57
    由于看到不少讲web安全的地方都会推荐一本书叫 《代码审计:企业级web代码安全架构》,于是从图书馆找来这本书读了一下,虽然有些内容可能有点老了,但整体上还是挺不错的,下面做一点总结。 一、通用代码审计思路 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,046
精华内容 6,418
关键字:

php代码审计