0 前言
在 2019 年的 CISCN 《Laravel1》 一题中,寻找利用链可以找到这样一个语句:
$f($this-namespace.$item['key'], null)
这时候有 2 种思路:
- 文件读取
- 命令执行
由易到难吧。先考虑文件读取,直接利用文件读取相关的函数读取 flag 文件。但经过测试使用 file_get_contents 无法回显。这时候就需要用其他的文件读取函数 进行测试,平时就需要积累这些函数的用法。
1 文件读取函数
file_get_contents
fread
fgets
fgetss
file
parse_ini_file
readfile
highlight_file
show_source
<?php
print(sprintf("%'-10s%-'-30s", '-', 'file_get_contents').PHP_EOL);
echo file_get_contents('flag.txt');
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'fopen fread').PHP_EOL);
$file = fopen("flag.txt","rb");
echo fread($file,1024);
fclose($file);
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgets').PHP_EOL);
$file = fopen("flag.txt","r");
echo fgets($file, 4096);
fclose($file);
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'fopen fgetss').PHP_EOL);
$file = fopen("flag.txt","r");
echo fgetss($file, 4096);
fclose($file);
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'readfile').PHP_EOL);
echo readfile("flag.txt");
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'file').PHP_EOL);
print_r(file('flag.txt'));
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'parse_ini_file').PHP_EOL);
echo parse_ini_file("flag.txt");
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'show_source').PHP_EOL);
show_source('flag.txt');
echo PHP_EOL;
print(sprintf("%'-10s%-'-30s", '-', 'highlight_file').PHP_EOL);
highlight_file('flag.txt');
echo PHP_EOL;
?>
2 总结
在 CTF 中至少应该掌握下面这些函数,做题的时候才能得心应手。
(以后慢慢补充)
这些函数可以在 Seay 源码审计系统 的正则表达式中找到(目前没发现更全的总结),或者基于 Seay 的审计插件 maduit 中。
|