《网络安全java代码审计实战》笔记1-常见漏洞审计

sql注入

  1. sql语句参数直接动态拼接
String id=request.getParameter("id");
  1. 预编译有误

开发者的个人习惯,没有按照PrepreStatement正确的 开发方式进行数据库连接查询,再预编译语句中也sql语句拼接

String id="2";
String username="user%' 'or'='1'#";
String sql="SELECT * FROM user where id=?";
sql+="and username like '%" +username+"%";
PrepareStatement ps=conn.prepareStatement(sql);
ps.setString(1,id);
  1. order by 注入
    特殊情况下,不能使用prepareStatement。典型的是order by子句进行排序。
    order by子句后需要加字段名或字段位置,而字段名不能带引号,否则会被认为是个字符串。
    prepareStatement是使用占位符传参数,传递的字符都会有单引号包裹,”ps.setString(1,id);"会自动给值加引号,会导致order by子句失效。
  2. %和_模糊查询
    java预编译查询不会对%和_进行转义处理,而这俩刚好是like查询的通配符。
    防御:过滤%
  3. Mybatis中#{}和${}的区别
    #{}底层是?占位符

动态表名,列名作为参数时,必须使用${}
此时的防注入手段

  1. Mybatis常见sql注入

1)order by查询:只能用${}

2)like查询:只能用${}
可使用concat函数进行拼接,依然能用#{}

3)in参数
in子句中使用#{}会将多个参数当作一个整体。只能用${}

《网络安全java代码审计实战》笔记1-常见漏洞审计_第1张图片

示例:二次注入代码审计

搜索select关键字,在UserMapper.java找到不安全的$号.UserService.java中找到对应的调用。
发现其逻辑为从session中取出username,随后拼接到sql语句进行查询。
接着照哦session的调用,找到session的赋值依据。
在login逻辑中找到username值是登陆后的用户名获取的。
接着找注册逻辑,并没有对用户名进行过滤。
存在二次注入。
需注册一个存在注入语句的用户名进行登录。

sql注入防御:

  1. 预编译
  2. 类型转换。如:id参数应为数字,对id参数进行强制类型转换。

任意文件上传漏洞

常见文件上传方式,主要讲解三种

  1. 文件流方式
  2. ServletFileUpload方式
  3. MultipartFile方式

一、文件流方式
在这里插入图片描述《网络安全java代码审计实战》笔记1-常见漏洞审计_第2张图片《网络安全java代码审计实战》笔记1-常见漏洞审计_第3张图片
文件上传漏洞的本质还是未对文件名做校验。
常见的有:未对文件做任何过滤,仅在前端通过js检验,只判断了Content-Type,后缀过滤补全,读取后缀方式错误等。
如:通过suffixName=filename.substring(fileName.indexOf("."));获取后缀,是不安全的。当文件名是abc.jpg.jsp时,suffixName将等于.jpg.jsp

《网络安全java代码审计实战》笔记1-常见漏洞审计_第4张图片

漏洞修复:
限制上传类型并对文件进行重命名:采取白名单策略限制上传的类型;对文件名进行重命名;去除文件名中特殊字符;上传图片时,通过图片库检测上传文件是否为图片。



《网络安全java代码审计实战》笔记1-常见漏洞审计_第5张图片

XSS

一、常见触发位置

输入/输出点
java中常使用request.getParameter(param) 或者 ${param} 获取用户的 输入 信息。
输出 主要表现为前端的渲染,定位前端中一些常见的标识,再根据后端逻辑来判断漏洞是否存在。

  1. jsp表达式
    《网络安全java代码审计实战》笔记1-常见漏洞审计_第6张图片《网络安全java代码审计实战》笔记1-常见漏洞审计_第7张图片

    《网络安全java代码审计实战》笔记1-常见漏洞审计_第8张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第9张图片

二、 反射型XSS

通过搜索特定关键字找到数据的交互点,判断这些数据是否可控及输出 位置。

resp.getWriter().print(),直接将数据传入到前端html页面进行展示。

三、 存储型XSS

常见攻击点:文章编辑、用户留言,个性签名等。
审计示例:/show 路由会打印用户的留言,根据web.xml 找到对应类servlet。
。。。。。找到最开始数据存储的时候是req.getParameter("xxx");

XSS漏洞修复

  1. 全局过滤器,并在web.xml 进行配置
    《网络安全java代码审计实战》笔记1-常见漏洞审计_第10张图片


《网络安全java代码审计实战》笔记1-常见漏洞审计_第11张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第12张图片

目录穿越漏洞

一般出现在需要用户提供路径或文件名时,如文件下载。

访问者提供需要下载的文件后,web应用程序没有去检验文件名是否存在…/等特殊字符,没有对访问的文件进行限制。
优先查找java.io.File引用。根据经验判断Paths,path,System.getProperty(“user.dir”)等各类可能会用来构造路径的关键字。
《网络安全java代码审计实战》笔记1-常见漏洞审计_第13张图片

漏洞修复:
对文件名进行过滤,防止出现 ./ 等特殊字符;采用id索引的方法来下载文件,而不是通过文件名;对目录进行限制;合理配置权限等。

针对已知路径的,如 .jpg 后缀,可直接在路径后拼接 .jpg 后缀来防止用户逃逸。

URL跳转漏洞


《网络安全java代码审计实战》笔记1-常见漏洞审计_第14张图片
《网络安全java代码审计实战》笔记1-常见漏洞审计_第15张图片

修复:严格控制要跳转的域名

命令执行漏洞

执行系统命令的函数
危害:继承web服务程序的权限去执行系统命令,或读 / 写文件,反弹shell,控制整个网站甚至控制服务器,进一步实现内网渗透。

ProcessBuilder命令执行漏洞

Java.lang.ProcessBuilder 类用于创建操作系统进程,每个实例管理一个进程属性集。
start()方法利用这些属性 创建一个新的Process实例,可以利用ProcessBuilder执行命令。
通过ProcessBuilder执行“ls -al"命令

//执行系统命令
ProcessBuilder p=new ProcessBuilder("ls","-al");
Process pb=p.start();
//获取执行完成命令后的结果并输出
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(pd.getInputStream(),"GBK"));
while((line=reader.readLine())!=null){
System.out.println(line);
}
reader.close();
}
}

《网络安全java代码审计实战》笔记1-常见漏洞审计_第16张图片

Runtime exec 命令执行漏洞

《网络安全java代码审计实战》笔记1-常见漏洞审计_第17张图片
《网络安全java代码审计实战》笔记1-常见漏洞审计_第18张图片

为什么传入字符串 与 传入数组 会有不同的执行结果呢?
跟入exec函数进行分析。
其调用的是exec(command,null,null) 方法,发现其调用的是exec(String command,String[] envp,File dir)这个数组参数的方法。
综上所述,exec(string command)这个字符串参数 实际调用的是exec(String command,String[] envp,File dir)这一数组参数的方法。

《网络安全java代码审计实战》笔记1-常见漏洞审计_第19张图片

\t 制表符 \r 回车符 \n 换行符 \f 换页符

《网络安全java代码审计实战》笔记1-常见漏洞审计_第20张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第21张图片
发现可正常执行

《网络安全java代码审计实战》笔记1-常见漏洞审计_第22张图片

XXE漏洞

原理:解析xml输入时,没有禁止外部实体的加载 而 导致加载了外部文件及代码。

XXE漏洞 可通过file协议或FTP协议来读取文件源码,也可以对内网进行探测或攻击。
漏洞危害有:任意文件读取,内网探测,攻击内网站点,命令执行,DOS攻击等。

《网络安全java代码审计实战》笔记1-常见漏洞审计_第23张图片
XML的常见接口
能够解析XML的方法

  1. XMLReader
    《网络安全java代码审计实战》笔记1-常见漏洞审计_第24张图片
    《网络安全java代码审计实战》笔记1-常见漏洞审计_第25张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第26张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第27张图片
审计示例:



SSRF漏洞

web应用程序提供一些能够从远程获取图片 或 文件的接口,在这些接口上用户使用指定的url便能完成远程获取图片,下载文件等。
攻击者可以通过使用file协议读取服务器本地 /etc/password 和 /proc/self/cmdline 等敏感文件,也可以利用被攻击的服务器绕过防火墙直接对处于内网的机器发起进一步攻击。
《网络安全java代码审计实战》笔记1-常见漏洞审计_第28张图片
SSRF常见接口
通常出现在社交分享、远程图片加载 或 下载、图片或文章收藏、转码、通过网址在线翻译、网站采集、从远程服务器请求资源等功能点处。




审计示例:
SSRF修复:

  1. 正确处理302跳转(在业务角度,不能直接禁止302,而是对跳转的地址 重新进行检查)



《网络安全java代码审计实战》笔记1-常见漏洞审计_第29张图片

SpEL表达式注入漏洞

Spring表达式语言,用于在运行时查询和操作对象图。

SpEL表达式语法

  1. 使用量表达式
    “#{‘Hello World’}”
  2. 使用java代码 new/instance of
Expression exp = parser.parseExpression("new Spring('Hello World')");
  1. 使用T(Type)
    使用T(Type)来表示java.lang.Class实例,常用于引用常量和静态方法:
parser.parseExpression("T(Integer).MAX_VALUE");

在SpEL中可以使用 #bean_id 来获取容器内的变量。
同时还存在两个特殊的变量,#this 和 #root,分别用来表示使用当前的上下文和引用容器的root对象。


在这里插入图片描述《网络安全java代码审计实战》笔记1-常见漏洞审计_第30张图片

《网络安全java代码审计实战》笔记1-常见漏洞审计_第31张图片

java反序列化漏洞

在这里插入图片描述
《网络安全java代码审计实战》笔记1-常见漏洞审计_第32张图片
修复:
在使用readObject()反序列化时,首先会调用resolveClass 方法读取序列化的类名,可以通过重写ObjectInputStream对象的resolveClass方法来实现对反序列化类的校验。

SSTI模板注入漏洞

服务器端模板注入Server-Side Template Injection
模板引擎支持使用静态模板文件,在运行时用 HTML 页面中的实际值替换变量 / 占位符,使HTML页面设计更容易。
广泛使用的模板引擎有 Smarty,Twig,Jinja2,Freemarker及Velocity。
若攻击者可以完全控制输入模板的指令,并且模板能够在服务器端被成功解析,则会造成模板注入漏洞。
SSTI漏洞的危害:任意代码执行,获取shell,破坏服务器完整性等。

修复:
应避免用户能够直接控制模板的输入并对其进行过滤。
如需相关用户公开模板,可以选择无逻辑的模板引擎,入Handlebars、Moustache等。

整数溢出漏洞



《网络安全java代码审计实战》笔记1-常见漏洞审计_第33张图片

硬编码密码漏洞

不安全的随机数生成器

《网络安全java代码审计实战》笔记1-常见漏洞审计_第34张图片

学习笔记↓
《网络安全java代码审计实战》笔记1-常见漏洞审计_第35张图片

你可能感兴趣的:(代码审计,java,web安全,java,安全)