命令执行 [WUSTCTF2020]朴实无华1

做题:

打开题目

我们用dirsearch扫描一下看看

扫描到有robots.txt,访问一下看看

 提示我们 /fAke_f1agggg.php

那就访问一下,不是真的flag

bp抓包一下

得到提示, /fl4g.php,访问一下看看

按alt,点击修复文字编码

就可以看到正常的代码了

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);//level 1
if (isset($_GET['num'])){$num = $_GET['num'];if(intval($num) < 2020 && intval($num + 1) > 2021){echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";}else{die("金钱解决不了穷人的本质问题");}
}else{die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){$md5=$_GET['md5'];if ($md5==md5($md5))echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";elsedie("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{die("去非洲吧");
}//get flag
if (isset($_GET['get_flag'])){$get_flag = $_GET['get_flag'];if(!strstr($get_flag," ")){$get_flag = str_ireplace("cat", "wctf2020", $get_flag);echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";system($get_flag);}else{die("快到非洲了");}
}else{die("去非洲吧");
}
?> 

代码审计

leve1

if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");

  • 首先检查是否设置了$_GET['num'],即是否有名为num的GET参数传递给脚本。
  • 如果存在num参数,将其赋值给变量$num
  • 使用intval()函数将$num转换为整数,并执行两个条件检查:
    • 如果$num的整数值小于2020,并且$num加1的整数值大于2021,则输出一条消息。
    • 否则,输出一条不同的消息。
  • 如果不存在num参数,则输出消息"去非洲吧"

level2

if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");

  1. 如果 md5 参数存在于 GET 请求中,则将其赋值给 $md5 变量。
  2. 接着,它检查 $md5 是否等于其自身的 MD5 哈希值。
  3. 如果相等,则输出一段文本,描述了一个人在拿到某个标志后的行为。
  4. 如果不相等,则输出另一段文本。
  5. 如果 md5 参数不存在于 GET 请求中,则输出一段提示文本。

get flag

if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}

  1. isset($_GET['get_flag']) 检查是否存在名为 get_flag 的 GET 参数。
  2. 如果参数存在,则将其值赋给 $get_flag 变量。
  3. 然后,代码使用 strstr() 函数检查 $get_flag 中是否包含空格,如果不包含空格,则继续执行。
  4. 如果 $get_flag 中不包含空格,则使用 str_ireplace() 函数将其中的 "cat" 替换为 "wctf2020"。
  5. 接着,代码调用 system() 函数执行 $get_flag 中的命令。
  6. 如果 $get_flag 中包含空格,则直接输出错误消息 "快到非洲了"。

第一个

我们要让num参数的值小于2020,但是加1的值大于2021,这里涉及到intval函数的科学计数法绕过,我们让num=2e4

第二个

要求本身和md5值相同,我们直接用md5=0e215962017

第三个

要绕过cat和空格的过滤

代替cat: more、less、head、tail、sort、ca\t
代替空格:$IFS、${IFS}、$IFS$1、$IFS$9

所以我们先用 ls 命令

/fl4g.php?num=2e4&md5=0e215962017&get_flag=ls

/fl4g.php?num=2e4&md5=0e215962017&get_flag=more${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

得到flag

总结:

知识点:

isset函数

isset() 函数可以检测「变量是否存在」并非NULL。常用来判断变量是否被定义

intval函数

intval() 函数用于获取变量的整数值

语法
int intval ( mixed $var [, int $base = 10 ] )
参数说明:
  • $var:要转换成 integer 的数量值。
  • $base:转化所使用的进制。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

  • 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制
看实例
<?php
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(0x1A);                    // 26
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
?>

(实例后面几个我也不是很懂,看了chat8的解释也不是很理解,就暂时在这里存个疑问?)

intval函数之科学技术法绕过

intval函数遇到科学计数法(只适用php7.0以下的版本)

当函数中用字符串方式表示科学计数法时,函数的返回值是科学计数法前面的一个数

而对于科学计数法加数字则会返回科学计数法的数值

<?php
echo intval("2e5"+1);     //200001
echo intval(2e5+1);       //200001
echo intval("2e5");       //2
echo intval(2e5);         //20000
?>

应用场景:

 if (intval($_GET['lover']) < 2023 && intval($_GET['lover'] + 1) > 2024)

strstr函数

strstr() 函数搜索一个字符串在另一个字符串中的第一次出现,找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址

区分大小写

语法

  char *strstr(char *str1, const char *str2);   //返回值为字符型指针
  str1: 被查找目标
  str2: 要查找对象


stristr函数

这个函数其实和strstr函数的功能差不多,差别就在查找的时候返回的是剩余的字符串不区分大小写

实例

str_ireplace函数

相当于一个查找,然后替换的函数

实例

把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "hhh":

知识点源于:

https://www.cnblogs.com/-chenxs/p/11978488.html#:~:text=%E5%81%87%E8%AE%BE%E8%BF%87%E6%BB%A4%E4%BA%86cat%201.%E5%88%A9%E7%94%A8%E5%8F%98%E9%87%8F%E7%BB%95%E8%BF%87%EF%BC%9A,ac%3Bb%3Dat%3B%24a%24b%202.%E5%88%A9%E7%94%A8base%E7%BC%96%E7%A0%81%E7%BB%95%E8%BF%87

intval()函数绕过_intval($_get['lover'] + 1) > 2024)-CSDN博客

PHP str_ireplace() 函数

strstr()函数的使用说明(C语言)_strstr()-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/486491.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

品优购项目

一、品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 项目名称&#xff1a;品优购 项目描述&#xff1a;品优购是一个电商网站&#xff0c;我们要完成PC端首页、列表页、注册页面的制作 1.3 品优购项目的学习目的 1.电商类网站比较综合&#xff0c;里面需要大量的…

红队评估四靶场

文章目录 环境搭建1.设置所需网卡2.更改win7设置3.DC设置4.web设置开启docker服务5.kali网段`渗透启动`1.确认对方靶机的IP地址2.端口探测3.web探测`2001端口``2002端口`Tomcat/8.5.19漏洞复现`2003端口`4.docker逃逸5.ssh密钥爆破`域渗透启动`1.提权2.隧道搭建各项配置文件内容…

远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”

原因&#xff1a; vscode 版本是 1.86&#xff0c;服务器上的 glibc 和 libstdc 版本不满足 要求(2.28 和 3.4.25)。 解决&#xff1a; 1、下载 1.85.2&#xff0c;解压直接运行 Code.exe。 2、回退 Remote-ssh 到 0.107.1。 参考&#xff1a; vscode 1.86版本远程ssh不兼容旧…

C语言----字符数组指针

1.char arr[] {a,b,c,d,e,f}; sizeof分析类型就可以计算所占的内存空间的大小&#xff1b; &#xff08;1&#xff09;printf("%d\n", sizeof(arr)); 数组名单独放进里面&#xff0c;计算整个数组大小&#xff0c;所以是6字节&#xff1b; &#xff08;2&#xff…

Java的String类

目录 String类的常用方法 1.1 字符串构造 1.2 String对象的比较 1.3 字符串查找 1.4 转换 1.5 字符串替换 1.6字符串拆分 1.7 字符串截取 1.8 其他操作方法 1.9 字符串的不可变性 1.10 字符串修改 String类的常用方法 1.1 字符串构造 String类常用的构造方法有很多…

__proto__和protype的区别

概述&#xff1a; prototype 函数静态属性&#xff0c;非实例属性,所有实例都可以继承它 __proto__ 实例属性&#xff0c;指向实例的原型对象&#xff0c;原型对象包括构造函数和protype属性 替代 现代浏览器中可以使用Object.getPrototypeOf()来替代__proto__来获取原型对象 …

srs集群下行edge处理逻辑

官方关于源站集群的介绍&#xff1a; Origin Cluster | SRS 下行边缘是指观众端从边缘edge拉流&#xff0c;边缘edge回源到源站origin节点拉流&#xff0c;然后再 把流转给客户端 边缘处理类SrsPlayEdge 当服务器收到播放请求时&#xff0c;创建对应的consumer消费者。在创…

【Algorithms 4】算法(第4版)学习笔记 10 - 3.3 平衡查找树(上篇)

文章目录 前言参考目录学习笔记0&#xff1a;符号表 ST 的回顾1&#xff1a;2-3 查找树1.1&#xff1a;定义1.2&#xff1a;2-3 树 demo 演示1.2.1&#xff1a;搜索&#xff1a;成功命中1.2.2&#xff1a;搜索&#xff1a;未命中1.2.3&#xff1a;插入&#xff1a;2-节点1.2.4&…

全球游戏市场回暖,Flat Ads推动海外获客增长

摘要:热门游戏品类分析,解读新兴市场与赛道 近日,中国音数协游戏工委发布了《2023年中国游戏出海研究报告》,据报告数据显示,2023年,全球游戏市场规模11773.79亿元,同比增长6.00%,呈现增长回暖趋势。 图源:伽马数据 1.SLG和RPG游戏热度居高不下,休闲游戏增长势头强劲 目前,S…

MIT6.S081学习——二、相关命令行整理

MIT6.S081学习——二、相关命令行整理 1 添加user代码到xv6中并编译2 git版本管理 1 添加user代码到xv6中并编译 问题&#xff1a;如何让在xv6中运行copy.c 答&#xff1a;在xv6中运行copy.c文件&#xff0c;你需要先将该文件添加到xv6源代码目录中&#xff0c;然后修改Makefil…

iOS整理 - 关于直播 - 搭建服务端

前言 其实本人一直都想自己简单做一套直播&#xff08;包括移动端和服务端&#xff09;的开发测试&#xff0c;但是之前一直做得比较迷茫。最近偶然间在来了灵感&#xff0c;瞬间解除了我很多疑惑。我会分享出来&#xff0c;希望大家一起研究下。稍后&#xff0c;我完整做好了…

MKdocs添加顶部公告栏

效果如图&#xff1a; docs/overrides下新建main.html &#xff0c;针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…