解题思路:
查看页面的每个链接都有些什么,最后目标锁定在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 参数第一次出现之前的字符串部分。
举例:

总结:这里表示搜索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

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

被折叠的 条评论
为什么被折叠?



