1.CVE-2021-3019 Lanproxy 目录遍历漏洞
2.nginx调用openssl函数源码分析
3.urllib.request详细介绍(未完结)
4.NGINX脚本语言原理及源码分析(一)
CVE-2021-3019 Lanproxy 目录遍历漏洞
Lanproxy 0.1版本存在路径遍历漏洞,源码允许攻击者通过访问“../conf/config.properties”获取到内部网连接的源码凭据。Lanproxy是源码一个用于局域网穿透的代理工具,支持各种tcp流量转发。源码
修复前,源码开发者需通过补丁修复此漏洞,源码6050源码方法为在路径中检测到“../”时直接返回“Forbidden”。源码漏洞成因在于对用户输入路径未进行过滤,源码攻击者可利用该漏洞访问任意文件。源码
环境搭建包括漏洞复现步骤,源码首先拉取源码,源码然后回退到漏洞修复之前版本。源码使用命令“git clone”拉取代码,源码回退版本并进行Maven编译,源码编译完成后在项目根目录生成distribution目录,源码包含服务端与客户端。
测试漏洞时,运行启动命令并访问端口验证环境是否成功启动,利用Payload获取config.properties文件内容,vim看python源码此文件包含管理页面用户名、密码、以及ssl相关配置信息。
深入分析,通过启动脚本中的debug参数开启调试模式,使用IDEA配置动态调试,打断点至HttpRequestHandler.java#outputPages处。通过URI实例获取uriPath,进行路径判断,最终通过RandomAccessFile()读取config.properties文件。
对于该漏洞的修复建议是安装最新版本的Lanproxy,可通过源码或最新安装包进行更新,以确保安全。
nginx调用openssl函数源码分析
本文分为两部分,分别是nginx部分和openssl部分。在nginx部分,首先在ngx_http_init_connection函数中,将recv→handler设置为ngx_http_ssl_handshake。梦幻转生源码然后,将这个读取时间加入到epoll中,主要目的是分析handshake函数。
在handshake阶段,首先接收client hello并完成初始化。接着调用ngx_ssl_handshake函数,该函数内部会调用openssl的ssl_do_handshake函数。在进行握手操作时,会使用openssl的async job库。
在openssl部分,首先通过get context进行初始化,并分配内存创建堆栈,将函数放入其中。接着,通过makecontext创建并运行async_start_func,该函数实际调用job中的指定函数。关键在于pause job,这通过swapcontext在func中被调用时立即切换栈信息。腾讯gpu manager源码在返回到start_job主函数后,发现其为死循环任务,会根据job的状态进行返回,这一状态在nginx中接收时表现为SSL_ERROR_WANT_ASYNC。
urllib.request详细介绍(未完结)
urllib.request模块详解 urllib.request模块在Python3中作为统一的请求库,提供发送请求和获取响应结果的基本功能。该模块包含四个主要子模块: urllib.request 用于发送HTTP请求并获取响应结果。 urllib.error 包含urllib.request产生的异常类,用于处理请求过程中可能出现的错误。 urllib.parse 用于解析URL,并处理URL参数的编码与解码。 urllib.robotparser 用于解析网站的robots.txt文件,获取网站的爬虫规则。 在实际使用中,urllib.request是进行HTTP请求的主要工具。以下为urllib.request.urlopen()的基本使用示例:使用方法简单,可以发起GET请求获取网页内容。
实例:获取百度首页的20套商业源码源代码。
响应对象类型为HTTPResponse,包含多种方法和属性,如read()、status()等。
详细说明urlopen()函数参数:url:发送请求的URL。
data:可选参数,附加的请求数据,以字节流形式。
timeout:超时时间(秒)。
其他参数如cafile、capath、cadefault和context等用于SSL相关配置。
使用实例展示urlopen()函数的超时处理:设置timeout参数,若服务器未响应,抛出urllib.error.URLError异常。
捕获异常并判断是否为超时错误。
输出时间过长未响应的信息。
构建更复杂请求时,使用Request类:Request类允许配置更多参数,如headers、method等。
实例化Request对象并使用urlopen()发送请求。
headers参数可设置User-Agent等信息,伪装请求。
data参数为字节流,通过urlencode()和bytes()转换。
高级特性介绍:Handler类实现更高级功能,如处理Cookies、代理和认证。
OpenerDirector类提供统一的请求接口,可使用open()方法。
认证功能实现:实例化HTTPBasicAuthHandler并添加用户名密码。
使用build_opener()构建Opener,具备认证功能。
发送请求完成认证。
代理设置:使用ProxyHandler设置代理链接。
构建Opener并发送请求。
Cookie处理:声明CookieJar对象。
实例化HTTPCookieProcessor构建handler。
使用build_opener构建Opener。
Cookie文件读写:使用MozillaCookieJar或LWPCookieJar生成和读取Cookie。
通过load()方法从文件加载Cookie。
异常处理:使用try-except块捕获urllib.error中的异常。
通过掌握urllib.request模块的功能和用法,用户可以构建复杂、灵活的HTTP请求,实现网页抓取、数据获取、认证、代理设置和Cookie管理等常见网络操作。NGINX脚本语言原理及源码分析(一)
NGINX提供了灵活的脚本解析功能,通过配置文件中的变量和指令实现特定功能。变量和指令是编程的基础,如若使用脚本语言,能提升配置的可扩展性,避免频繁添加新代码。
深入理解NGINX脚本语言,首先从变量的基本特性开始。在NGINX中,除了特殊类型的binary_remote_addr外,所有变量默认为字符串类型。变量名由美元符号或花括号包围,只接受特定字符(a-z、A-Z、0-9、_)。变量插入示例中,如set $def “this is a test $abc”,变量值会根据其他变量计算后再拼接。
NGINX变量分为内置和自定义两种,自定义变量由特定模块定义,如rewrite和geo模块。内置变量广泛覆盖系统、网络、四层、SSL/TLS和HTTP层信息,部分动态变量如arg_根据HTTP请求参数动态生成。
变量的作用域非常重要,未定义的变量在启动时会引发错误。全局可见的变量允许跨location使用,但每个请求有自己的变量实例。变量的可变性通过标记控制,如内置变量通常不可变,但如$args和$limit_rate可变。
关于缓存,变量的get_handler方法决定其是否实时计算。动态变量如$arg_name不可缓存,而set指令定义的变量可缓存。结合使用时,如"name"和"arg_name"可能产生不同结果,因为前者缓存,后者每次都从参数解析。
变量的隔离性基于请求,同一变量在不同请求间独立,如同C语言的局部和全局变量。NGINX内,变量值容器随请求而变化,与location无关。
后续文章将详细解析变量的实现原理和在脚本中的运用。对于更全面的NGINX资源,可访问NGINX开源社区获取。