[攻防世界]Web_php_include
题目来源:
攻防世界>>答题>>Web>>高手进阶区>>Web_php_include
前置知识:
PHP include()与php伪协议: PHP伪协议总结 - SegmentFault 思否
PHP strstr(): strstr(string $haystack, [mixed](https://www.php.net/manual/zh/language.types.declarations.php#language.types.declarations.mixed) $needle, bool $before_needle = false)查找$needle在$haystack中的首次出现,返回值为字符串或0(未查找到结果)。 [su_highlight]注意该函数区分大小写[/su_highlight] 。 详细文档>>
PHP str_replace(): 字符串替换。详细文档>>
WriteUp:
打开链接访问网页,发现显示以下代码:
1  | 
  | 
分析代码:
通过GET请求发送hello和page给服务器,hello会被echo语句输出出来,page会传给$page变量,$page变量中的php:// 被过滤掉后传到include($page);语句当中。
首先我们先扫描常用的php页面:

发现可以访问phpinfo.php,因为可以通过GET请求控制include($page)这个语句的执行内容,因此猜想可以通过伪协议来执行php语句,前往phpinfo.php页面查看是否满足条件:

发现allow_url_fopen与 allow_url_ include的值都为on,满足伪协议的条件。
这里我选择了date://这个伪协议
date://伪协议的用法:
1  | data://text/plain,<语句>  | 
构造?page=data://text/plain,<?php system("ls");?>的GET请求(注意URL转码)发送:

发现fl4gisisish3r3.php文件,再次构造?page=data://text/plain,<?php show_source("fl4gisisish3r3.php")?>输出该文件的源码

得到flag(注意:若使用cat fl4gisisish3r3.php的方式查看flag需要在网页源代码里才能看到,页面不直接显示)
做这道题时我还有一些其他思路,比如利用strstr()大小写敏感来防止php://伪协议被过滤。而且我感觉hello这个GET请求应该也可以利用拿到flag,不过目前我对php的了解还不够多,想不到什么办法,不过网上有很多dalao利用了这个hello。这次就先写这一个方法吧,有空研究研究继续写
- 标题: [攻防世界]Web_php_include
 - 作者: Thou
 - 创建于 : 2021-09-21 23:34:17
 - 更新于 : 2024-12-19 15:27:27
 - 链接: https://blog.txgde.space/2021/09/21/攻防世界web_php_include/
 - 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。