学习笔记↓
- sql语句参数直接动态拼接
String id=request.getParameter("id");
- 预编译有误
开发者的个人习惯,没有按照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);
- order by 注入
特殊情况下,不能使用prepareStatement。典型的是order by子句进行排序。
order by子句后需要加字段名或字段位置,而字段名不能带引号,否则会被认为是个字符串。
prepareStatement是使用占位符传参数,传递的字符都会有单引号包裹,”ps.setString(1,id);"会自动给值加引号,会导致order by子句失效。 - %和_模糊查询
java预编译查询不会对%和_进行转义处理,而这俩刚好是like查询的通配符。
防御:过滤% - Mybatis中#{}和${}的区别
#{}底层是?占位符 - Mybatis常见sql注入
1)order by查询:只能用${}
2)like查询:只能用${}
3)in参数
in子句中使用#{}会将多个参数当作一个整体。只能用${}
示例:二次注入代码审计
搜索select关键字,在UserMapper.java找到不安全的$号.UserService.java中找到对应的调用。
发现其逻辑为从session中取出username,随后拼接到sql语句进行查询。
接着照哦session的调用,找到session的赋值依据。
在login逻辑中找到username值是登陆后的用户名获取的。
接着找注册逻辑,并没有对用户名进行过滤。
存在二次注入。
需注册一个存在注入语句的用户名进行登录。
sql注入防御:
- 预编译
- 类型转换。如:id参数应为数字,对id参数进行强制类型转换。
常见文件上传方式,主要讲解三种
- 文件流方式
- ServletFileUpload方式
- MultipartFile方式
一、文件流方式
文件上传漏洞的本质还是未对文件名做校验。
常见的有:未对文件做任何过滤,仅在前端通过js检验,只判断了Content-Type,后缀过滤补全,读取后缀方式错误等。
如:通过suffixName=filename.substring(fileName.indexOf("."));获取后缀,是不安全的。当文件名是abc.jpg.jsp时,suffixName将等于.jpg.jsp
漏洞修复:
限制上传类型并对文件进行重命名:采取白名单策略限制上传的类型;对文件名进行重命名;去除文件名中特殊字符;上传图片时,通过图片库检测上传文件是否为图片。
一、常见触发位置
输入/输出点
java中常使用request.getParameter(param) 或者 ${param} 获取用户的 输入 信息。
输出 主要表现为前端的渲染,定位前端中一些常见的标识,再根据后端逻辑来判断漏洞是否存在。
- jsp表达式
二、 反射型XSS
通过搜索特定关键字找到数据的交互点,判断这些数据是否可控及输出 位置。
resp.getWriter().print(),直接将数据传入到前端html页面进行展示。
三、 存储型XSS
常见攻击点:文章编辑、用户留言,个性签名等。
审计示例:/show 路由会打印用户的留言,根据web.xml 找到对应类servlet。
。。。。。找到最开始数据存储的时候是req.getParameter("xxx");
XSS漏洞修复
- 全局过滤器,并在web.xml 进行配置
一般出现在需要用户提供路径或文件名时,如文件下载。
访问者提供需要下载的文件后,web应用程序没有去检验文件名是否存在…/等特殊字符,没有对访问的文件进行限制。
优先查找java.io.File引用。根据经验判断Paths,path,System.getProperty(“user.dir”)等各类可能会用来构造路径的关键字。
漏洞修复:
对文件名进行过滤,防止出现 ./ 等特殊字符;采用id索引的方法来下载文件,而不是通过文件名;对目录进行限制;合理配置权限等。
针对已知路径的,如 .jpg 后缀,可直接在路径后拼接 .jpg 后缀来防止用户逃逸。
URL跳转漏洞
修复:严格控制要跳转的域名
命令执行漏洞


