第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

Mybatis在Java代碼審計中的審計方法及修復(fù)方法

標(biāo)簽:
Java 安全測試

Java代码审计系列课程

前置知识:了解Mybatis框架映射关系

mapper定位java代码

https://img4.sycdn.imooc.com/621b2e570001792712940693.jpg

id定位方法

List<User> findByUserNameVuln02(String username);

定位到UserMapper.xml中的id

  <select id="findByUserNameVuln02" parameterType="String" resultMap="User">
        select * from users where username like '%${_parameter}%'
    </select>

Mybatis中两种数据库拼接方法

${}是直接拼接

#{}预处理后拼接

mybatis有两种写法,一种是使用@Param 注解:

@Mapper
public interface CategoryMapper {
    @Select("select * from category_ where name= '${name}' ")
    public CategoryM getByName(@Param("name") String name);
}

1、${}直接拼接,类似jdbc中的直接拼接审计方法

http://localhost:8080/sqli/mybatis/vuln01?username=joychou
  / * http://localhost:8080/sqli/mybatis/vuln01?username=joychou' or '1'='1
     */
    @GetMapping("/mybatis/vuln01")
public List<User> mybatisVuln01(@RequestParam("username") String username) {
        return userMapper.findByUserNameVuln01(username);
    }

这里使用的是mybatis来进行SQL查询,获取参数username后使用userMapper.findByUserNameVuln01(username)来进行查询。

来看一下findByUserNameVuln01。MyBatis支持两种参数符号,一种是#,另一种是$。这里的参数获取使用的是${username},而不是#{username},而${username}是直接将参数拼接到了SQL查询语句中,就会造成SQL注入。

@Select("select * from users where username = '${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);

注入语句:

http://localhost:8080/sqli/mybatis/vuln01?username=joychou' or '1'='1

${}修复方法

采用#{},也就是预处理的形式

http://localhost:8080/sqli/mybatis/sec01?username=joychou
@Select("select * from users where username = #{username}")
User findByUserName(@Param("username") String username);

2、Mybatis中like审计方法

访问路径:

http://localhost:8080/sqli/mybatis/vuln02?username=admin

   这里使用的是findByUserNameVuln02(String username);来进行查询,来看一下UserMapper.xml,也就是他的XML映射文件。

List<User> findByUserNameVuln02(String username);

UserMapper.xml:
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
    select * from users where username like '%${_parameter}%'
</select>
    
     _parameter是Mybatis的内置参数,代表整个参数

这里传入未过滤的username后,插入到SQL语句中,就成了:select * from users where username like '%username%',${}直接拼接字符串,而且这里在like的后面不能使用#{}预编译,不然就会产生报错。

注入语句:

http://localhost:8080/sqli/mybatis/vuln02?username=admin' or '1'='1' %23

修复建议:

可以使用like concat('%',#{username}, '%')就可以避免注入了。

http://localhost:8080/sqli/mybatis/vsec02?username=joyc
java代码:
List<User> findByUserNameVsec02(String username);

Mybatis配置:
    <select id="findByUserNameVsec02" parameterType="String" resultMap="User">
        select * from users where username like concat('%',#{_parameter}, '%')
    </select>

验证:

http://localhost:8080/sqli/mybatis/vsec02?username=joychou' or '1'='1' %23

https://img2.sycdn.imooc.com/621b2e5800010d5511810203.jpg

同理不同数据库的修复代码快:

Mysql数据库:

SELECT  *  FROM  user  WHERE  name like CONCAT('%',#{name},'%')

Oracle数据库:

SELECT  *  FROM  user  WHERE  name like CONCAT('%',#{name},'%') 
或
SELECT  *  FROM  user  WHERE  name like '%'||#{name}||'%'

Sqlserver数据库:

 SELECT  *  FROM  user  WHERE  name like '%'+#{name}+'%'

DB2数据库:

SELECT  *  FROM  user  WHERE  name like '%'+#{name}+'%'  
或
SELECT  *  FROM  user  WHERE  name like '%'||#{name}||'%'

3、Mybatis中order by审计方法

访问链接:

http://localhost:8080/sqli/mybatis/orderby/vuln03?sort=1

这里使用的是findByUserNameVuln03(@Param("order") String order)来进行查询,同样也是去看UserMapper.xml。

<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
    select * from users
    <if test="order != null">
        order by ${order} asc
    </if>
</select>

可以看到我们输入的参数在order by之后,也是${order}直接拼接起来了,与like相同,在这也是无法使用预编译,只能使用${}。由于没有过滤就直接拼接,很显然存在注入。

注入语句:

http://localhost:8080/sqli/mybatis/orderby/vuln03?sort=1 and (updatexml(1,concat(0x7e,(select version()),0x7e),1))

修复代码:

1、当order排序能不让用户输入就不让用户输入,后台直接写死,不传递参数到后端:

http://localhost:8080/sqli/mybatis/sec03
Java代码块:
User OrderByUsername();

Mysql配置:
 <select id="OrderByUsername" resultMap="User">
        select * from users order by id asc limit 1
    </select>

2、当order必须要从外界获取参数到后端代码进行拼接时候,那就先对参数进行过滤,过滤后再使用:

http://localhost:8080/sqli/mybatis/orderby/sec04?sort=1
Java代码块:
@GetMapping("/mybatis/orderby/sec04")
public List<User> mybatisOrderBySec04(@RequestParam("sort") String sort) {
    String filter_order = SecurityUtil.sqlFilter(sort);
    return userMapper.findByUserNameVuln03(filter_order);
}

//sqlFilter
private static final Pattern FILTER_PATTERN = Pattern.compile("^[a-zA-Z0-9_/\\.-]+$");
 
public static String sqlFilter(String sql) {
    if (!FILTER_PATTERN.matcher(sql).matches()) {  //严格限制用户输入只能包含a-zA-Z0-9_-.
        return null;
    }
    return sql;
}

Mysql配置:
    
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
    select * from users
    <if test="order != null">
        order by ${order} asc
    </if>
</select>




點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消