[web][极客大挑战 2019]Havefun1
考点:前端、GET传参
点开网址,发现是这个界面
点击界面没有回显,老规矩查看源代码,看到以下代码
代码主要意思为:
用get传参,将所传的参数给cat,如果cat=dog,则会输出flag
我们则GET传参将dog赋予cat如图:
点击则页面回显出flag
[web][HCTF 2018]WarmUp1
考点:代码审计、文件包含
访问网站只有一张图片
老规矩,查看源码
源码提示由一个子域,还被注释掉了,将其访问
是一段php代码
"source.php","hint"=>"hint.php"]; //定义了一个名为emmm的类,在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对。在代码中,允许包含的文件有"source"=>"source.php"和"hint"=>"hint.php"。 if (! isset($page) || !is_string($page)) { echo "you can't see it"; return false; }//checkFile方法首先检查传入的$page参数传进来的file变量不是非空已设置或者不是字符串,会输出“you can't see it”,并返回false if (in_array($page, $whitelist)) { return true; }。//如果传入的file参数在whitelist里,回返回真,这里就知道,file参数的值该是上面两个之一 $_page = mb_substr(//提取字符串 $page, 0, mb_strpos($page . '?', '?') //括号里"."是 PHP 中的字符串连接运算符,是连接两个字符串 //mb_strpos函数,查找第二个参数在第一个参数中首次出现的位置 //这里知道第三个参数length=传入字符串长度(因为第一个位置是0 //但是这里如果加入?就会起到截断的作用 ); if (in_array($_page, $whitelist)) { return true; //如果变量_page(传入参数被截过的部分)在白名单里,可以返回true } $_page = urldecode($page);//url解码,按规则解码已编码的url字符串,所以构造payload的时候可以考虑用url编码的方式绕过 $_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } echo "you can't see it"; return false; } } //主函数部分 //$_REQUEST['file'] 获取传递的参数file中存储的值 if (! empty($_REQUEST['file'])//传入参数不能为空 && is_string($_REQUEST['file'])//检查是否是字符串 && emmm::checkFile($_REQUEST['file']) //调用emmm类中的checkFile函数 ) { //所以,不进入else分支,可以调用include函数读取传入文件。这里要满足if中的条件为真 include $_REQUEST['file']; //include文件读取函数是直接读取file exit; } else { echo "
"; } //检查$_REQUEST['file']是否存在且为字符串类型,并调用emmm::checkFile方法进行检查。如果返回值为true,则通过include语句包含$_REQUEST['file']指定的文件并终止程序执行,否则输出一个图片标签。 ?>
substr()函数、strpos()i函数、in_array()函数进行简义:
string substr ( string $string , int $start [, int $length ] )
返回字符串 string 由 start 和 length 参数指定的子字符串。
输入字符串,如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 “abcdef” 中,在位置 0 的字符是 “a”,位置 2 的字符串是 “c” 等等。
如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。
如果 string 的长度小于或等于 start,将返回 FALSE。
$rest = substr("abcdef", -1); // 返回 "f"
$rest = substr("abcdef", 0, -1); // 返回 "abcde"
$rest = substr("abcdef", 2, -1); // 返回 "cde"
$rest = substr("abcdef", 4, -4); // 返回 ""
$rest = substr("abcdef", -3, -1); // 返回 "de"
echo substr('abcdef', 1); // bcdef
echo substr('abcdef', 1, 3); // bcd
echo substr('abcdef', 0, 4); // abcd
echo substr('abcdef', 0, 8); // abcdef
echo substr('abcdef', -1, 1); // f
mixed strpos ( string $haystackx ,mixed $needle [, int $offset = 0 ] )
返回 needle 在 haystack 中首次出现的数字位置。
同时注意字符串位置是从0开始,而不是从1开始的(没有提供offset时)。
offset
如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计
如果没找到 needle,将返回 FALSE(因此应该用===来测试返回的值)。
- stripos() - 查找字符串首次出现的位置(不区分大小写)
- strrpos() - 查找字符串- 计算指定字符串在目标字符串中最后一次出现的位置
- strripos() - 查找字符串- 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
in_array() 函数搜索数组中是否存在指定的值。
in_array(search,array,type)
参数 描述 search 必需。规定要在数组搜索的值。 array 必需。规定要搜索的数组。 type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。 说明
如果给定的值 search 存在于数组 array 中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。
注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。
访问 hint.php 发现 flag 不在此页,显示在ffffllllaaaagggg目录上
在source.php页面下进行的传参操作,目的是利用include函数将flag文件包含出来,不要被这里的白名单混淆奥
添加"/"让 hint.php?变成一个目录,但是这个目录并不存在,Include 函数就会取执行后面的,跳转到上层目录,
传入checkFile函数要经历 第一次白名单验证 一次?过滤后他就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag
tips:include函数有这么一个神奇的功能:以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
(这里让变量_page 变成白名单里的文件名就可以返回 true,但是 flag 并不在白名单的文件里,所以要利用 Include 函数去跳转到别的目录(flag 是在 ffffllllaaaagggg 里,但是不知道这个长名字的文件在哪)
(因为我们当前的source.php一般是在html目录下,往上是www,var,然后到根目录,flag一般就放在根目录下面,这里还有一个hint.php?/或者source.php?/,因此需要返回四层才能到根目录,其实文件名也提示了我们要使用四层目录)
构造 payload三种方法:
source.php?file=hint.php?/../../../../ffffllllaaaagggg
或者:
source.php?file=source.php?/../../../../ffffllllaaaagggg
或者:
hint.php?../…/…/…/…/ffffllllaaaagggg 想象他传入checkFile函数要经历 第一次白名单验证 一次?过滤后就是hint.php 再进行一次白名单验证 返回为真 则达成条件进行包含得到flag
index.php?file=hint.php?/../../../../ffffllllaaaagggg
正确回显,得到flag:
[web][ACTF2020 新生赛]Include
考点:文件包含漏洞
打开网址回显这个页面
点击tips,回显这个页面,但是看到网址栏由?file=flag.php和题目include,是个文件包含题
用伪协议base64编码进行读取:
?file=php://filter/read=convert.base64-encode/resource=flag.php
读出来的编码进行base64解码:得到flag
这题好像只能用base64进行读取,我试了三种就base64能正常回显,但是不妨碍我对伪协议的三种方法的普及:
还没有评论,来说两句吧...