freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

代码审计入门之java-sec-code(一)
2021-09-25 18:08:56


1.介绍

对于学习JAVA代码审计的同学来说,java-sec-code是一个不可多得的学习靶场,根据作者的介绍每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里,具体可查看每个漏洞代码和注释。

2.安装

项目地址https://github.com/JoyChou93/java-sec-code/

java-sec-code是由java开发,使用的框架为springboot,下载到本地后直接使用IDEA导入项目。

1632564230_614ef406491297f76ccdc.png!small?1632564230219

选择maven工程选项。

1632564245_614ef41577a05a21836e8.png!small?1632564245663

导入项目后需要在本地数据库能建立名为java_sec_code的数据库(项目使用的数据库为mysql,本人使用的版本为5.5.6),数据库建立成功后使用项目文件夹resources下create_db.sql脚本文件建立表和导入数据。

1632564255_614ef41f7daebccc196dd.png!small?1632564255437

修改resources下的application.properties配置文件,将连接数据库需要的参数配置为本地实际参数。

1632564263_614ef427e474fc3379d0b.png!small?1632564263868

在IDEA中直接启动项目,访问http://localhost:8080/login成功看到登录界面,默认用户名和密码为admin/admin123 。

1632564271_614ef42f9b795987fadb8.png!small?1632564271609

1632564281_614ef439d5e962f7eab5d.png!small?1632564281940

因为项目作者选择的工作环境为linux操作系统,而我本人选择的工作环境为windows操作系统,所以为了部分功能运行成功需要修改几处源码,首先修改CommandInject.java文件下的源码,将sh执行命令替换为cmd命令,还有修改源码中一些其它的linux操作系统上独有的命令。

1632564292_614ef444972cf5cf997b2.png!small?1632564292622

其次为修改index.html下的几处默认链接,链接指向改为在D盘下的测试文件。

1632564311_614ef457e3b0d2dd227bf.png!small?1632564312958

3.命令注入漏洞

查看CommandInject.java源码,存在3个方法codeInject、codeInjectHost、codeInjectSec,其中codeInjectSec为安全方法,其它两个存在漏洞。

首先分析codeInject方法源码,很容易发现参数filepath并未做任何的过滤,直接就拼接入命令执行数组中,建立ProcessBuilder对象执行新的进程,并将执行结果返回前端,在windows操作系统下使用&符号拼接cmd命令,由于是web服务应用,需要将&符号进行url编码,可以使用payload:http://localhost:8080/codeinject?filepath=.%26ipconfig,可以看到ipconfig命令成功执行。1632564322_614ef462749d9d94076b6.png!small?1632564322404

1632564328_614ef46843f250f19db7c.png!small?1632564328316

查看codeInjectHost方法源码,注入参数为http请求头中的host参数,将host参数修改为payload:localhost&ipconfig,成功执行命令,一定要将端口号消去要不curl命令执行中会报错。1632564334_614ef46e4e66be88e04c9.png!small?1632564334237

1632564338_614ef472c30d7b639ed3d.png!small?1632564339029

codeInjectSec方法中明显加入了参数过滤方法,点击打开cmdFilter方法进一步跟踪,找到在安全方法中声明的静态常量FILTER_PATTERN,常量为正在表达式对象,匹配模式只匹配大小写字母数字等几种字符,特殊字符都不会匹配成功,当出现命令注入时匹配到特殊字符后返回值为空,方法执行返回失败提示。1632564349_614ef47dc8e88583ab213.png!small?1632564349804

1632564356_614ef48412a9d73e39aa9.png!small?1632564355990

1632564364_614ef48c024b49f329185.png!small?1632564363932

1632564370_614ef492ef66bca316968.png!small?1632564370935

4.RCE命令执行

分析源码可以很直观的看到cmd未进过任何过滤直接有runtime.exec执行,执行结果推送回前端显示,这个演示应该是项目作者为大家演示下命令执行的过程。1632564379_614ef49b8f32d0c6c1b89.png!small?1632564379490


# web安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录