代码审计之-正则表达式过滤不严格导致的漏洞

demo1

我们先来看个例子
在www目录下创建/tmp/tokens/shell.php

<?php

$path = str_replace('\\','/',__FILE__);
define('PATH',dirname($path));
class TokenStorage{
    /**
     * @param $action
     * @param $data
     * @throws Exception
     */
    public function performAction($action , $data){
        switch ($action) {
            case 'delete':
                $this->clearToken($data);
                break;
            case  'create' :
                $this->createToken($data);
                break;
            default:
                throw new Exception('Unknown action');
        }
    }
    public function createToken($seed){
        $token  = md5($seed);
        file_put_contents(PATH. $token , '...data');
    }
    public function clearToken($token){
        $file = preg_replace("/[^a-z.-_]/","",$token);
        unlink(PATH.  $file);
    }
}

$storage = new TokenStorage();
$storage->performAction($_GET['action'],$_GET['data']);

在www目录下创建一个config.php文件
在这里插入图片描述
传入我们的payload

?action=delete&&data=../../../config.php

打上断点分析
在这里插入图片描述

在这里插入图片描述
最后成功删除文件。

我们以这个例子展开来谈preg_replace与正则表达的恩怨情仇

demo2

一个典型的config.php目录问题,也就是写入配置项的问题,开发人员在开发cms框架中常用的config.php,也是采用正则匹配,但是如果正则匹配没有进行过滤,从而会导致各种各样的漏洞问题。
我们在www目录下创建demo2.php

<?php
$path = str_replace('\\','/',__FILE__);
define('path',dirname(__FILE__));
$str = addslashes($_GET['option']);
$file = file_get_contents(path .'/option.php');
$file = preg_replace('|\$option=\'.*\';|',"\$option='$str';",$file);
file_put_contents(path . '/option.php',$file);
?>

然后再在目录下创建option.php
在这里插入图片描述

<?php
$option='1';
?>

我们先来分析一下这个写入配置项的文件,通过addslashes函数给option加上/,然后读取option.php的配置项,通过正则匹配来替换$str字符串,最后写入option.php。(使用了安全函数addslashes,但是缺导致了任意文件写入的问题)
我们先尝试随便写入一个字符串看看会有什么结果。
?option=123
在这里插入图片描述
在这里插入图片描述我们想照成漏洞那必然要将前面注释掉payload=\';phpinfo();//
\‘经过addslashes()之后变为\\\’

在这里插入图片描述
随后preg_replace会将两个连续的\合并为一个,也就是将\\\‘转为\\’,在这里插入图片描述这样我们就可以成功写入
在这里插入图片描述

在这里插入图片描述
preg_replace函数特性。经测试,该函数会针对反斜线进行转义,即成对出现的两个反斜线合并为一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值