zoukankan      html  css  js  c++  java
  • php代码审计4审计代码执行漏洞

    代码执行漏洞
    代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行,当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑到用户是否能控制这个字符串,造成代码注入。

    挖掘思路:存在可执行代码的危险函数,用户能控制函数的输入。


    常见危险函数

    eval和assert函数:
    eval(),assret()将输入的字符串参数作为PHP程序代码来执行
    代码1:
    <?php
    if(isset($_GET['cmd'])){
       $cmd = $_GET['cmd'];
       eval("$cmd = $cmd");/assret()函数也是一样的,这里没对用户输入做过滤
       echo "ok"
    }else{
       echo "not";
    }
    >

    回调函数:
    mixed call_user_func(callable $callback[,mixed $parameter[,mixed $....]])
    $callback是要调用的自定义函数名称
    $parameter是自定义函数的参数
    代码2:
    <?php
    function callback(){
       $x = $_GET['cmd'];
       eval($x);//没做限制
    }
    call_user_func(function 'callback',$x);//回调了函数
    >
    常见回调函数:call_user_func()  call_user_func_array()  array_map()等


    动态执行函数
    定义一个函数,将函数名(字符串)赋值给一个变量,使用变量名代替函数名动态调用函数。
    代码3:
    <?php
    $_GET['a']($_GET['b']);//接受get请求a的参数作为一个函数,b是作为a函数里的参数
    >


    正则表达式(做代码审计时,会遇到正则表达式,了解正则会更容易)
    <?php
    //普通字符作为原子
    $pattern = '/abc/';
    $str = 'abcdefghijklmn';
    preg_match_all($pattern,$str,$res);
    var_dump($res);

    //特殊符号的字符作为原子
    $pattern = '/[php]/';
    $str = '[php]12345';
    preg_match_all($pattern,$str,$res);
    var_dump($res);

    //通用字符作为原子
    $pattern1 = '/d/'; //0-9
    $pattern2 = '/D/'; //a-zA-Z
    $str = '123132asaaaaa222';
    $preg_match_all($pattern2,$str,$res);
    var_dump($res);

    //自定义原子
    $pattern1 = '/[aj]sp/'; //匹配[aj]中任意一个字符作为原子的asp jsp
    $str = 'jjjjspspspsp';
    preg_match_all($pattern1,$str,$res);
    var_dump($res);

    //限定符
    $pattern1 = '/go*gle/'; // *匹配掐面出现原子次数0次 1次或多次
    $pattern2 = '/go+gle/'; // +匹配前面出现的原子1次或多次
    $pattern3 = '/go?gle/'; // ?匹配前面出现的原子0次或1次
    $str = 'google';
    preg_match_all($pattern3,$str,$res);
    var_dump($res);

    //边界限定
    $pattern1 = '/^abc/'; // ^匹配输入字符开始的位置,必须是abc形式的开头
    $pattern2 = '/abc^/'; // ^匹配输入字符结尾的位置,必须是abc形式的结尾
    $pattern3 = '/^abc$/'; // ^$只匹配某字符
    $str = 'abc2342dfads';
    preg_match_all($pattern3,$str,$res);
    var_dump($res);

    //反向引用
    $pattern = '/d{4}(-)d{2}\1d{2}/'; // \1代表第一个()缓冲区
    $str = '2019-01-28';
    preg_match_all($pattern,$str,$res);
    var_dump($res);
    >


    preg_replace函数:
    mixed preg_replace(mixde $pattern,mixed $replacement,mixed $subject[,int $limit = -1[,int &$count]])
    $pattern 正则匹配的内容 $pattern存在/e模式修正符修饰,允许代码执行
    $replacement 用于替换的字符串或字符串数组
    $subject 要进行搜索和替换的字符串或字符串数组


    修复方案:
    尽量不要执行外部的应用程序或命令
    使用自定义函数或函数库来替代外部应用程序或命令的功能
    使用escappeshellarg函数来处理命令的参数
    使用sare_mode_exec_dir来指定可执行的文件路径
    将执行的参数做白名单限制,在代码或配置文件中限制某些参数

  • 相关阅读:
    遍历datatable的方法
    C# 存储过程使用方法
    C# 存储过程
    dev repositoryItem 手工定义
    无限极分类
    ThinkPHP
    ThinkPHP
    RBAC
    ThinkPHP
    正则表达式
  • 原文地址:https://www.cnblogs.com/Hydraxx/p/10331463.html
Copyright © 2011-2022 走看看