freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

白盒审计-SQL注入
2023-10-19 16:44:01

Mybatis下的SQL注入

在xml文件中,Mybatis支持两种占位符号,分别是#和$。1697701348_6530dde48d9a1be7733aa.png!small

1697701376_6530de005d64f769ff2fc.png!small

#符在like、in、order by这些SQL语句中使用不规范就会报错,一些初级开发者就会使用$符替换#符从而造成了SQL注入。

1、in语句中的SQL注入

in之后多个查询时使用#会报错,例如:

Select * from news where ids in (#{ids})

而将#替换为$就不会报错:

Select * from news where ids in (${ids})

正确用法为在XML文件中使用foreach,而不是将#替换为$,如下图所示:

1697701679_6530df2fb0e900e98e574.png!small

2、like语句中的SQL注入

like模糊查询直接使用#也会报错,例如:

Select * from news where title like '%#{name}%'

直接把#号改成了$,如果在代码中没有对用户输入的内容做处理就会产生SQL注入漏洞。

Select * from news where title like '%${name}%'

正确的做法是使用concat函数:

select * from news where tile like concat(‘%’,#{name}, ‘%’)

3、order by语句中的SQL注入

在mapper文件中如果使用order by #{Name}会导致最后sql语句参数多加引号,会产生报错,例如:

select * from test order by 'Name'

order by后面可以使用$,例如:order by ${Name}

但是这会导致潜在的SQL注入攻击,因此需要对传入的参数进行转义并检查。

以tmall项目为例,项目地址:

https://gitee.com/project_team/Tmall_demo.git

在项目中搜索${

1697703178_6530e50a33fca9b171da7.png!small

以ProductMapper.xml文件为例,进行逆向追踪,定位到88行,向上查看根据select id追踪该dao层的代码文件(如果在IDEA中安装插件Free Mybatis plugin击左侧绿色箭头可以快速跳转)。

1697705280_6530ed40995a00083615c.png!small

跳转到dao层代码文件,可以看到17行代码中select函数中存在orderUitl参数,继续逆向追踪,键盘按住ctrl键后鼠标左击select,查看使用select函数的代码,如下图所示:

1697705300_6530ed54415f9f97eca7b.png!small

点击ProductServiceImpl.java文件,定位到37行。如下图所示:

1697703838_6530e79eb743f4f82cb83.png!small

getList方法中使用到了orderUtil参数,继续逆向追踪,键盘按住ctrl键后鼠标左击getList,如下图所示:

1697703876_6530e7c4be8604e3424ba.png!small

可以看到ProductController.java使用了该方法,在第405行中传入orderUtil值,进入Controller层查看具体代码,如下图所示:

1697703955_6530e8139614677e15146.png!small

OrderUitl工具类代码如图所示:

1697703371_6530e5cbcc0c89bebc972.png!small

该类需要两个参数即orderyBy和isDesc,从admin/product/{index}/{count}接口获取并且没有做任何过滤。

1697703394_6530e5e2225da193aa412.png!small

搭建好项目后再web界面中找到该接口。

进行初步判断:

orderyBy=1,返回正常:

1697705349_6530ed859094df0ab77e8.png!small

orderyBy=99,报错:

1697705326_6530ed6e826c04c9efa5e.png!small

使用sqlmap:python sqlmap.py -r 1.txt

1697705360_6530ed904cedc42da264a.png!small

# 渗透测试 # web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者