BUUCTF

web

warmup

这里我直接上代码讲 菜鸡不会php,全是现查 哪里不对,欢迎大佬指点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 <?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
/*
传入了变量page,也就是我们刚刚传进来的file
*/
{
// 这里定义了白名单
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
/*2
为了返回 true 两个条件必须满足
1 page存在
2 page是字符串 ,
这里和外层的判断file 一致基本是再次判断了一遍
*/
echo "you can't see it";
return false;
}
/*3
in_array(search,array,type) 函数搜索数组中是否存在指定的值,
白名单过滤,需要返回了ture
所以这里我们传入的page或者是经过截断之后的page必须是soure.php或hint.php,
这里是正常的访问,我们需要构造文件任意包含,所以这里传入的不满足条件,这里不是注意的点,往下继续看
*/
if (in_array($page, $whitelist)) {
return true;
}
/*
这里mb_sustr 是个截断,返回0到mb_strpos之间的内容,而mb_strps 则是查找第一次出现的位置,
所以基本可以理解为获取page 两个?之间的字符串,
也就是获取file两个?之间的字符串,
放到url中就是http://ip/?file=ddd?中的file=ddd

*/
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
//' 6 这里和上面类似 查看_page 是否在白名单中
return true;
}

$_page = urldecode($page); // 这里发现对_page进行了一次decode解码,
$_page = mb_substr(//获取两个??之间的内容
$_page,
0,
mb_strpos($_page . '?', '?')
);
// 这里是我们要绕过的点,从这里往上看 尝试构造
if (in_array($_page, $whitelist)) {//白名单
return true;
}
echo "you can't see it";
return false;
}
}
/*1
必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含:
1 REQUEST['file']不为空
2 REQUEST['file']是字符串
3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true
*/
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>

所以我们的payload 就是
file=source.php%253f../....//../../../ffffllllaaaagggg
flag{bd04766d-3dfa-47bc-9b15-703a4b8cbd07}

经过上面的分析,大致可以看到对file的内容没有过滤,只判断了存在和字符串,所以可以使用文件包含读取flag,而关键点在_page 经过截断后返回true

在检查字符串的时候使用了白名单尝试绕过 但_page只截取了??之间的内容,所以我们可以构造 ?source.php?../../../phpinfo.php 这样来绕过过滤。

接下来就是如何绕过了.
我们的参数应该是?source.php../../../flag.txt
而_page进行截断后判断白名单。
我们的参数就?source.php?../../../flag.txt
对_page判断了两个 第二次是我们的绕过点,代码对page进行了一次解码,第一次判断为false,第二次为ture
我们的参数就变成了?source.php%253f../../../flag.txt

这里解释一下为什么经过了两次url编码,第一次是url传入到服务器时解码了一次,第二次是page传给_page解码了一次

所以根据hint.php的提示,最终payload
file=source.php%253f/../../../../../ffffllllaaaagggg

相关文章
评论
分享
  • UNCTF竞技赛

    UNCTFwp由K&A整理 WEB简单的备忘录[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/GraphQL%20Injection](http...

    UNCTF竞技赛
  • SQL注入(时间盲注)

    了解盲注语法,如何利用盲注获取数据 目标 了解SQL时间盲注 掌握SQL注入语法 掌握SQL注入原理 了解SQL注入常用注释字符 本题使用的工具 sqlmap,hackbar环境 物理机:windows10 虚拟机:kali...

    SQL注入(时间盲注)
  • 实验吧-隐写-欢迎来到地狱

    多重隐写+加密,需要清醒的认识,才能不坠入地狱 实验吧隐写题欢迎来到地狱 解压 访问url,获取一个zip文件,解压发现存在3个文件 分别是jpg,doc,zip 根据文件名去,首先我们去打开第一个文件地狱伊始.jpg 打开提示文...

    实验吧-隐写-欢迎来到地狱
  • 实验吧-逆向工程-debug

    了解函数运行,合适添加断点判断,获取一闪而过的flag 实验吧逆向工程debug 下载文件,然后用idaq打开, 尝试在linux下打开发现么没有返回值, 在idaq里面去查看shift+F12 查看字符串,发现有个pri...

    实验吧-逆向工程-debug
  • 传统知识+古典密码

    多种加密结合,一步一步解密,追寻真理 实验吧密码学传统知识+古典密码 题目 辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳 信的背面还写有“+甲子”,请解出这段密文 key:CTF{} 查一下得到了一份六十甲子顺序表 获取...

    传统知识+古典密码
  • 变异凯撒

    仔细观察凯撒加密,找寻其中的规律 实验吧密码学变异凯撒 凯撒密码 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有...

    变异凯撒
  • MD5之守株待兔

    实验吧-安全杂项-MD5之守株待兔 ,通过md5加密时间戳获取flag 实验吧安全杂项MD5之守株待兔,你需要找到和系统锁匹配的钥匙做题感受,这个题难道就只能一直刷新等吗,太不亲民了 访问url [http://ctf5.shi...

    MD5之守株待兔
  • ActiveMQ任意文件写入漏洞分析溯源

    墨者学院WEB安全ActiveMQ任意文件写入漏洞分析溯源ActiveMQ 简介ActiveMQ 是 Apache 软件基金会下的一个开源消息驱动中间件软件。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 w...

    ActiveMQ任意文件写入漏洞分析溯源
  • 后台登录

    实验吧web后台登录 burp抓包尝试爆破 一般呢,ctf题是不涉及爆破的,因为这样会导致服务器处理压力太大 可以看到这里当我们输入正确的密码后,会返回flag。 那么我们的重点就是获取密码了 寻找密码 尝试了几次弱密码,注入都...

    后台登录
  • OWASP API Top 10

    OWASP API TOP 10本文搬运自:https://apisecurity.io/encyclopedia/content/owasp/owasp-api-security-top-10.htm TOP1:2019 —破碎的对...

    OWASP API Top 10
Please check the comment setting in config.yml of hexo-theme-Annie!