web53笔记($d = system($c); echo "<br>".$d;换⾏符)

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 18:21:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

<br> 是换⾏符

当我输⼊?c=ls时,返回的是

(1)直接执行 system($c);

system($c); 这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出(通常是浏览器);不会返回命令的输出值,因此不能对输出结果进行进一步处理。

(2)使用一个参数来接受 system 的返回值后再输出它

$d = system($c); echo "<br>".$d;

这种方式不仅会执行命令 $c,而且会将命令的最后一行输出结果赋值给变量 $d;然后通过 echo "<br>".$d; 将变量 $d 的内容输出到标准输出;如果命令产生了多行输出,只有最后一行会被存储在变量 $d 中并输出,而其他行会直接输出到标准输出。其中 "<br>" 是 HTML 标签,用于在网页中插入换行符。

 

因此会先输出我们传入的内容,即 ls;

紧接着直接输出 ls 执行的结果 flag.php index.php readflag;

system 函数返回命令输出的最后一行,执行结果最后一行是 readflag,所有 $d 的值是 readflag,前面还拼接了一个 "<br>",因此会换行输出。 这里还是放出了 $ 符,构造 payload 读取 flag.php:

?c=nl${IFS}fla\g.php

posted @ 2025-03-15 10:41  justdoIT*  阅读(8)  评论(0)    收藏  举报