内容如下;因学艺不精一脸茫然,有没有大手子讲解一下思路,万分感激
题目描述:fl$@ag
<?php
#Try to read /flag
if(!isset($_GET['command'])&!isset($_GET['parameter'])) {
show_source(__FILE__);
die();
}
$command = $_GET['command'];
$parameter = $_GET['parameter'];
function filter($data) {
$black_list = array('"', "'", " ","flag", "\n");
foreach ($black_list as $key) {
$data = str_replace($key, '', $data);
}
return $data;
}
$command = filter($command);
popen("$command",$parameter);
?>
这个代码总的来说就是用popen执行传入的命令(command),和popen的链接的模式(parameter),如果2个参数都未传入,则以php高亮语法显示当前这个脚本源代码。比较像后面,除非有特殊的需要。
<?php
#Try to read /flag
//这里感觉应该是||,而不是一个&,要不只传递一个参数会跳过这个判断,下面的代码会出错
if(!isset($_GET['command'])&!isset($_GET['parameter'])) {//这句判断不存在get提交的command和parameter参数执行下面的代码
show_source(__FILE__);//__FILE__ 用于获取当前执行的php物理路径,如 E:\xxx\xxx\xxx.php,show_source使用 PHP 语法高亮程序中定义的颜色,输出或返回包含在当前php文件源代码语法高亮版本
die();//结束后续代码执行
}
$command = $_GET['command'];//获取command参数
$parameter = $_GET['parameter'];//获取command参数
function filter($data) {//这个函数用于去掉参数$data中的指定内容,内容在$black_list数组中定义
$black_list = array('"', "'", " ","flag", "\n");
foreach ($black_list as $key) {
$data = str_replace($key, '', $data);
}
return $data;
}
$command = filter($command);//去掉不合法的参数内容
popen("$command",$parameter);//popen打开用于执行指定的命令,$parameter为popen的连接模式
?>