
借用Java Sec Code官方的话:
对于学习Java漏洞代码来说,Java Sec Code
是一个非常强大且友好的项目
1.环境配置:
官方提供了多种搭建环境的方式,既然是代码审计,为了看代码方便本文选择IDEA的搭建方式
git clone https://github.com/JoyChou93/java-sec-code.git克隆项目到本地。
直接在idea中打开项目,Maven可以与各种流行的Java集成开发环境(如Eclipse、IntelliJ IDEA等无缝集成。所以直接打开就行。如果IDEA没有自动下载Maven:推荐一篇文章:https://www.cnblogs.com/ly-lyy/articles/18024833
配置数据库:
建议下载phpstudy:(非小皮面板版)
启动:
创建 java_sec_code
还原数据库 java_sec_code点击导入
点击其他选项菜单,打开mysql命令行
输入密码:
改下密码:
打开靶场localhost:8080/login
输入账号密码,在在数据库里面,也可以在create_db.sql中查看
2.命令注入漏洞
在CommandInject.java中
这个类中有三个方法:一个一个解释
2.1:codeInject方法:
由于我们的系统上Windows的,把cmdList换成Windows的命令。
下面我们一点点解释下这个代码:
filepath
是作为参数传入dir
命令的目录路径可见没有过任何的过滤。
ProcessBuilder
是Java中用于创建和启动进程的工具类。创建进程builder
builder.redirectErrorStream(true)进程的错误输出流和标准输出流合并
start()动了进程.
return WebUtils.convertStreamToString(process.getInputStream())命令执行的结果转换为字符串,并将结果返回
把&ipconfig传给filepath可以得到靶机的IP地址
@GetMapping("/codeinject")
是一个Spring MVC中的注解,用于定义一个处理HTTP GET请求的方法。具体来说,它标识了一个处理器方法,该方法将处理访问"/codeinject"路径的GET请求。
所以如图:
2.2 codeInjectHost
很明显代码中的漏洞点发生了变化,其他和codeInject一样。
request.getHeader("host")
方法获取HTTP请求头中的"Host"字段
抓包:
2.3 codeInjectSec
这里看到红框是不一样的部分,很明显cmdFilter()是对传入的参数进行处理:看一下cmdFilter方法:
FILTER_PATTERN
是一个预定义的Pattern
对象,用于匹配允许的输入格式。matcher(input)
方法创建了一个Matcher
对象,并将input
参数传入,然后使用matches()
方法来检查input
是否与模式匹配。如果input
不符合预定义的格式,则返回null
,表示输入不合法。
我们看一下这个正则表达式过滤了什么:
匹配一个由大小写字母、数字、下划线、斜杠、点和连字符组成的字符串,且整个字符串应该是从开始到结束的完整匹配。!取反。可以看到当我们输入命令的时候会出现:Bad boy. I got u.这样的提示
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)