java代码审计之sql注入

作者:sec_time | 发布时间:

0x00前言

这里作为我代码审计的开始篇,下学期会有更多的时间去学习这些东西,这里会一直记录我自己的审计成长过程,也通过审计去增强一下我web方面的能力吧

0x01基础的审计

关于sql注入都知道原理是去闭合sql语句后去执行自己想查询的语句,看一个最简单案例


@WebServlet("/demo")
public class domain extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("get访问");
       String id = req.getParameter("id");//获取id参数获得的是String类型



       Connection conn = null;

       try {
           Class.forName("com.mysql.jdbc.Driver");

           conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo", "root", "root");
           String sql = "select * from users where id = '"+id+"' ";

           Statement statement = conn.createStatement();
           ResultSet resultSet = statement.executeQuery(sql);
      } catch (ClassNotFoundException | SQLException e) {
           e.printStackTrace();
      }



  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doGet(req,resp);
  }
}

这里用的是一个servlet来写的一个通过给他请求来执行的sql语句

String sql = "select * from users where id = '"+id+"' ";
sql语句如上,拼接的方法在于'"+id+"';
去闭合前面的那个单引号然后注释掉后面的单"'1" "union select version()"""
执行的语句就会变成"select * from user where id="''"1" union select version()#
利用闭合使union前面的语句报错,执行后面的union语句

还有就post注入贴一下语句吧

String sql = "select * from users where username = '"+username+"' and password = '"+password+"' ";
和前面一样只需要去拼接然后导致前面的语句失效执行自己的语句就行了,登录框就可能存在这种注入。

这种常见的登录框会出现这种注入。 后面还有一些关于cms会用到的注入方式

Mybatis获取值的方式有两种,分别是${}#{}。这是关于用ssm组合写的框架会存在的sql注入

#{}:解析的是占位符问号,可以防止SQL注入,使用了预编译。
${}:直接获取值

like注入

select id="findlike" resultType="com.test.domain.User" parameterType="string">
      select * from user where name like   '%#{name}%',
   </select>
  如果用#号去获取会报错只能用$获取
select id="findlike" resultType="com.test.domain.User" parameterType="string">
      select * from user where name like   '%¥name}%',
   </select>
这种方法也行
<select id="findlike" resultType="com.test.domain.User" parameterType="string">
      select * from user where name like #{name}
   </select>
<select id="findlike" resultType="com.test.domain.User" parameterType="string">
      select * from user where name like concat('%',#{name},'%')
   </select>

in后注入

Select * from news where id in (#{id}),
直接使用#去拼接会报错,需要用$
Select * from news where id in (${id})

order by注入

Select * from news where title ='#{titlename}' order by #{time} asc
执行报错
Select * from news where title ='#{titlename}' order by ${time} asc

 

0x02cms审计

环境的话实一个叫  因酷开源网校系统是由北京因酷时代科技有限公司的开源cms但是我实在是没办法我允许起来不报错了但是我仍然没法访问网页所以只能纯源码审计一次了。以后在云上搭了本机怎么都搭不起。

image-20220813142013231

在这里发现了mybatis,如果要审计的sql注入的话这个就是一个重要的突破点

取看看dao文件下面是用的注解开发还是xml配置开发使用的是xml配置开发

image-20220813142221817

只能取看对应的配置文件了

配上一个开发的知识点帮助以后审计的

1、DAO层: 持久层  主要与数据库进行交互

  DAO层主要是做数据持久层的工作,主要与数据库进行交互。DAO层首先会创建DAO接口,然后会在配置文件中定义该接口的实现类,
  接着就可以在模块中就可以调用DAO 的接口进行数据业务的而处理,并且不用关注此接口的具体实现类是哪一个类。DAO 层的数据源和数据库连接的参数数都是在配置文件中进行配置的。
 
2、Entity层(domain层) 实体层   数据库在项目中的类

3、Service层(biz):业务层 控制业务

  Service层主要负责业务模块的逻辑应用设计。和DAO层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。
  封装Service层的业务逻辑有利于业务逻辑的独立性和重复利用性。

4、Controller层:(action层) 控制层 控制业务逻辑

  Controller层负责具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也需要在配置文件中进行。

5、View层 此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示,

Conroller层和Service层的区别是:Controlle层负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计;
 
总结:在具体的项目中,其流程为:Controller层调用Service层的方法,Service层调用Dao层中的方法,其中调用的参数是使用Entity层进行传递的。

很烦躁我根据这上面的内容去招了持久层然后发现了里面很多方法,都是操作文章的我想去招对应的配置配置文件的时候找不到,没办法看到它更数据库的sql交互,于是去网上引用了别的大佬在这个cms的审计

他们的文章是在这里发现了一个用$去接受参数值的后面我再看看好像有自动装配还是我自己配置的问题这次就这样

image-20220813152807886

image-20220813151625742

发现了它就去service层里面找对应的方法

image-20220813151941761

image-20220813153057800

image-20220813153200799

在把路径总和一些应该是在/admin/article/delete,这个sql就是典型in后注入

这个sql就我看来的话有点鸡肋了,它是在admin的情况下进行sql注入的。

关于我这篇审计文是从我的笔记本上薅下来的来试试水,但是我发现这个图片呀我只能截图保存下来以后,才可以上传,emm是我的姿势不对嘛,提问有没有啥快点的方法上传图片的

标签:学习笔记