命令执行 [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>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}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}、IFS1、IFS9

所以我们先用 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博客](https://blog.csdn.net/krafcc/article/details/134173212#:~:text=%E7%A7%91%E5%AD%A6%E8%AE%A1%E6%95%B0%E6%B3%95%E7%BB%95%E8%BF%87%20%E5%BD%93%E5%87%BD%E6%95%B0%E4%B8%AD%E7%94%A8%20%E5%AD%97%E7%AC%A6%E4%B8%B2%20%E6%96%B9%E5%BC%8F%E8%A1%A8%E7%A4%BA%E7%A7%91%E5%AD%A6%E8%AE%A1%E6%95%B0%E6%B3%95%E6%97%B6%EF%BC%8C%E5%87%BD%E6%95%B0%E7%9A%84%E8%BF%94%E5%9B%9E%E5%80%BC%E6%98%AF%E7%A7%91%E5%AD%A6%E8%AE%A1%E6%95%B0%E6%B3%95%E5%89%8D%E9%9D%A2%E7%9A%84%E4%B8%80%E4%B8%AA%E6%95%B0%EF%BC%8C%E8%80%8C%E5%AF%B9%E4%BA%8E%E7%A7%91%E5%AD%A6%E8%AE%A1%E6%95%B0%E6%B3%95%E5%8A%A0%E6%95%B0%E5%AD%97%E5%88%99%E4%BC%9A%E8%BF%94%E5%9B%9E%E7%A7%91%E5%AD%A6%E8%AE%A1%E6%95%B0%E6%B3%95%E7%9A%84%E6%95%B0%E5%80%BC%20echo%20intval%20%281e10%29%3B%20%2F%2F,%28%271e10%27%29%3B%20%2F%2F%201%20echo%20intval%20%28%271e10%27%2B1%29%3B%20%2F%2F%201410065409 "intval()函数绕过_intval(_get['lover'] + 1) > 2024)-CSDN博客")

PHP str_ireplace() 函数

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

相关推荐
Devil枫26 分钟前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer28 分钟前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
雨白11 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹13 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空14 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭15 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日16 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安16 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑16 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟20 小时前
CTF Web的数组巧用
android