1、[SWPUCTF 2021 新生赛]include
根据提示传入一个file后显示了关于flag的代码
这是一个文件包含,考虑php伪协议,构造payload:
?file=php://filter/read=convert.base64-encode/resource=flag.php
2、[SWPUCTF 2021 新生赛]Do_you_know_http
页面提示特定的browser,用bp抓包后改包。
得到了只能在本地访问但ip为183.224.81.121,添加X-Forwarded-for:字段,并将ip改为1本地ip:127.0.0.1
页面任然提示相同信息,但是发现有了一个新的跳转页面,尝试访问
得到flag
3、[HCTF 2018]Warmup
在body部分中,发现了一个source.php文件,尝试访问,
strpos(string,find,start)函数:
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注意: 字符串位置是从 0 开始,不是从 1 开始。
参数 | 描述 |
---|---|
string | 必需。规定要搜索的字符串。 |
find | 必需。规定要查找的字符串。 |
start | 可选。规定在何处开始搜索。 |
mb_substr(str,start,length,encoding) 函数:
返回字符串的一部分,对于substr() 函数,它只针对英文字符, 而mb_substr()对于中文也适用。
参数 | 描述 |
---|---|
str | 必需。从该 string 中提取子字符串。 |
start | 必需。规定在字符串的何处开始。
|
length | 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
|
encoding | 可选。字符编码。如果省略,则使用内部字符编码。 |
in_array(search,array,type)函数:
搜索数组中是否存在指定的值,找到值则返回 TRUE,否则返回 FALSE。
参数 | 描述 |
---|---|
search | 必需。规定要在数组搜索的值。 |
array | 必需。规定要搜索的数组。 |
type | 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。 |
开始代码审计:
上段函数定义了一个名为emmm的类,在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对。在代码中,允许包含的文件有"source"=>"source.php"和"hint"=>"hint.php"。检查传入的$page参数是否为字符串类型,如果不是或者未设置,将输出"you can't see it"并返回false。
对$page参数进行一系列处理:首先使用mb_strpos函数找到$page中第一个问号的位置,然后使用mb_substr函数将问号之前的部分作为$_page进行处理。
$_page进行URL解码,并重复之前的处理步骤,如果$_page在白名单中存在,返回true。
如果上述条件都不满足,则输出"you can't see it"并返回false。检查$_REQUEST['file']是否存在且为字符串类型,并调用emmm::checkFile方法进行检查。如果返回值为true,则通过include语句包含$_REQUEST['file']指定的文件并终止程序执行,否则输出一个图片标签。
开始解题:访问一下hint.php的文件,
提示说flag位于ffffllllaaaagggg中,但是ffffllllaaaagggg不在白名单范围内,想要访问ffffllllaaaagggg,就必须让最后一段的if语句的三条检测都为true。checkFile函数会检查用户传入的参数($page)是否匹配白名单列表$whitelist。所以要包含白名单中的文件(source.php或hint.php)。并且checkFile函数是通过传入的参数 $page 来进行的文件检查,而不是直接从 URL 中获取参数。所以我们需要以参数形式传递文件名【?file=source.php】,将参数传给file,而不是直接访问文件路径【/source.php】。代码会截取第一个问号前的字符串并检查其是否在白名单中。
所以要让第一个问号?前的内容在白名单中,在问号?后面加上我们想访问的ffffllllaaaagggg就可以绕过。构造payload:
?file=source.php?ffffllllaaaagggg
没有查到,用../返回不断上级目录并不断尝试。