# 以下内容仅为个人学习小迪安全课程自己记录的笔记,文章仅用于学习交流安全技术使用,因为自己是用obsidian md格式记录,用的在线网址md转公众号文章,所以排版可能有点问题,各位师傅们见谅。
Servlet路由技术
概念 :
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器
位置&标签:
通常在:src/main/webapp/WEB-INF/web.xml文件
标签及含义:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>ekkoo</servlet-name> //servlet的名称和下面路由中的对应
<servlet-class>com.example.demo1.IndexServlet</servlet-class>
//需要加载类的路径
</servlet>
<servlet-mapping> //路由
<servlet-name>ekkoo</servlet-name> //与上面的对应
<url-pattern>/ekkoo</url-pattern> //url访问地址
</servlet-mapping>
</web-app>
访问url http://localhost:8081/ekkoo 即可找到对应文件进行解析
@WebServlet设置路由
生命周期
反序列化漏洞相关
POST方式提交参数值
public class IndexServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("————————POST");
String id = req.getParameter("id");
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out =resp.getWriter();
out.println("这是post请求数据");
out.println("id: "+id+"<br>");
out.flush();
out.close();
}
}
数据库连接 jdbc&mybatis&hibemate
jdbc
建立连接
package com.example.demo1;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
public class Myselect { //main方法前面,会抛出下面两种不同的异常
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:3306/demo";
Connection connection = DriverManager.getConnection(url,"root","zhangyalong");
System.out.println(connection);
}
}
查询&预编译&输出
package com.example.demo1;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
public class Myselect {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url = "jdbc:mysql://localhost:3306/demo";
Connection connection = DriverManager.getConnection(url,"root","zhangyalong");
System.out.println(connection); //数据库正常连接
String sqlQuery = "SELECT * FROM user"; //定义sql语句
Statement statement = connection.createStatement(); // 创建一个Statement对象来执行SQL查询
ResultSet content = statement.executeQuery(sqlQuery); //执行sql语句 将查询的内容放置ResultSet接口
while (content.next()) { //通过循环遍历出查询的内容
int userId = content.getInt("userid");
String username = content.getString("username");
String content1 = content.getString("content");
System.out.println("UserID: " + userId + "username: " + username + ", Content: " + content1);
}
// 关闭资源
content.close();
statement.close();
connection.close();
}
}
预编译: 预编译是指在执行查询之前,将SQL查询语句编译成一个预编译语句,其中包含一个或多个参数占位符 如下的“ ?”,预编译语句允许你将查询参数化,将参数值与占位符关联,拼接的sql语句将不会被执行,提高安全性防止sql注入
// 创建一个SQL查询,使用预编译语句
String sqlQuery = "SELECT userid, content FROM user WHERE userid = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sqlQuery);
Filter过滤器
概念:
Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能
对特定的攻击payload过滤(未授权&xss&rce...)
@WebFilter("/test") //或者在web.xml文件内设置路由
public class XssFilter implements Filter {
@Override
//中间件启动后就自动运行
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("xss开启过滤");
}
@Override
//中间件关闭后就自动运行
public void destroy() {
System.out.println("xss销毁过滤");
}
@Override
//doFilter 访问路由触发的方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("xss正在过滤");
//过滤代码就应该在放行前
//如果符合就放行,不符合就过滤(拦截)
//XSS过滤 接受参数值 如果有攻击payload 就进行拦截
// 接受参数值 如果没有攻击payload 就进行放行
HttpServletRequest request= (HttpServletRequest) servletRequest;
String code = request.getParameter("code");
if(!code.contains("<script>")){ //没有攻击payload
//放行
filterChain.doFilter(servletRequest,servletResponse);
}else{
System.out.println("存在XSS攻击");
//继续拦截
}
}
}
过滤
Listen监听器
概念: 监听器是Servlet规范中定义的一种特殊类
-
用来监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件 -
用来监听域对象的属性发生修改的事件 -
可以在事件发生前、发生后做一些必要的处理
创建监听器
@WebListener
public class ListenSession implements HttpSessionListener {
@Override
//监听器的内置方法
public void sessionCreated(HttpSessionEvent se) {
//监听检测有Session创建就会执行这里
System.out.println("监听器监听到了session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//监听检测有Session销毁就会执行这里
System.out.println("监听器监听到了session销毁");
}
}
监听器安全场景
代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马;
原文始发于微信公众号(艾克sec):java代码审计基础学习笔记分享(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论