文件包含--简单的代码审计绕过

本文深入解析了如何绕过安全检查,通过特定方法访问并获取Flag.php中的隐藏信息,涉及PHP伪协议、base64编码解码技巧及POST提交策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:

查看页面的每个链接都有些什么,最后目标锁定在flag.php上
页面显示如下:
在这里插入图片描述
页面下方源码如下:
在这里插入图片描述
源码分析:

$file = @$_GET['page'];
//将url变量page的值赋给$file
$url = parse_url($file);
//parse_url函数用于解析整个URL,并返回其组成部分,举例如下图

在这里插入图片描述

if(strstr($file,'flag.txt'))(
/* 
strstr()函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE
strstr(string,search,before_search)
string	必需。规定被搜索的字符串。
search	必需。规定要搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
before_search	可选。一个默认值为 "false" 的布尔值。如果设置为 "true",它将返回 search 参数第一次出现之前的字符串部分。
举例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191130143106545.png)
总结:这里表示搜索flag.txt是否在$file中,如果在,返回true,否则返回false
*/
if(empty($url['host']) || $url['host'] !='localhost'){
die('hacker detected');
}
/*
empty()函数用于检查一个变量是否为空
empty()判断一个变量是否被认为是空的。即当变量为空或者变量的值等同于false,那么返回true。若变量存在,则返回false。

以下的变量会被认为是空的:
"" (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
"0" (作为字符串的0)
NULL
FALSE
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)

总结:这里表示若$url中的host不存在(true)或者$url中的host不是localhost(true),那么整体返回true,否则返回false
*/
elseif(preg_natch('/http/i',$file)){
die('hacker detected');
}
/*
如果上面的if语句执行失败,那么将执行这条语句。
preg_match — 执行匹配正则表达式
preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int
搜索subject与pattern给定的正则表达式的一个匹配.
参数
pattern        要搜索的模式,字符串类型。

subject        输入字符串。
matches       如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
flags          flags可以被设置为以下标记值:PREG_OFFSET_CAPTURE,如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
preg_match()返回pattern的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。preg_match_all()不同于此,它会一直搜索subject 直到到达结尾。如果发生错误preg_match()返回 FALSE。
总结:这里表示如果$file中有匹配到http,那么就返回true,否则返回false
*/
}
@include($file);
//包含$file

解题方法:

根据页面释义,flag.php页面存在flag,那么可以猜测flag.php的源码中是否存在flag,上面分析的页面源码,综合来说就是url中page=后面的参数不可以存在flag.txt与http,只有这样才可绕过if语句,从而进行文件包含
方法一:使用php伪协议进行base64编码,再进行解码,获得flag.php的源码
在这里插入图片描述
解码:
在这里插入图片描述
方法二:依旧使用php伪协议,只不过这会我们进行POST提交
在这里插入图片描述
在这里插入图片描述
注:测试过程中,flag.zip也存在flag,由于题目环境已经没有,不确定哪一个才是真正的flag
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值