什么,一条指令直接黑了数据库!
shigen
最近研究了一下一款渗透工具sqlMap
。它一款流行的开源工具,用于自动化SQL注入攻击和渗透测试。它专门设计用于检测和利用Web应用程序中的SQL注入漏洞。SQLMap具有丰富的功能集,可自动检测和利用SQL注入漏洞,获取数据库的敏感信息,以及执行各种数据库操作,如提取、修改或删除数据。它支持多种数据库管理系统(DBMS),包括MySQL、Oracle、SQLite、Microsoft SQL Server等。也支持多种注入技术,包括基于错误的注入、联合查询注入、布尔盲注和时间盲注。通过使用这些技术,它可以自动化地发现和利用各种类型的SQL注入漏洞。
它的官方地址在这里:sqlmap代码地址
sqlmap直接连接数据库
以下是我用sqlMap
连接数据库并获得数据库的版本信息案例。
python3 sqlmap.py -d 'mysql://root:123456@127.0.01:3306/security' -f --banner
对单一的URL进行探测
在这里,shigen
用spring boot
写了一个接口,专门用来sqlMap
的测试:
@GetMapping(value = "findById2")
public Result<User> findById2(@RequestParam(value = "id", defaultValue = "1", required = false) String id) {
User user = userMapper.findById2(id);
return Result.ok(user);
}
相信这段代码阅读起来没有难度吧,我的接口就是去获得id
这个字符串类型的参数,去数据库查询数据返回。
数据库的ORM框架采用的是mybatis plus
,我也把我的操作数据库部分的代码放在这里:
@Select("select * from user where id = ${id}")
User findById2(@Param("id") String id);
相信细心的伙伴已经发现问题了!
接下来有请sqlMap
的出场!
python3 sqlmap.py -u 'http://127.0.0.1:9000/penetration/findById2?id=20' -dbs
见证奇迹的时刻
我直接上我的结果!
控制台输出了我本地的所有数据库,而且是准确的、全部的!是不是很恐怖。第一次我还不大相信,我还以为是shigen
眼花了。
我看了一下控制台输出的有一个payload
信息,它的参数是:id= 2 and 5685=5685
, 而这只是一个案例,sqlmap
在执行的时候,会注入很多这样总是在where
之后条件成立的语句。
这样的就是一个很明显的案例,总是不断的在条件后边追加and
条件,让sql尽可能的查询到数据出来,疯狂的挑衅、试探。
==> Preparing: select * from user where id = ?
==> Parameters: 20) AND 6535=9250 AND (2651=2651(String)
而--dbs
仅仅是sqlMap
命令或者说功能的冰山一角,它还有这些强大的功能:
Enumeration:
These options can be used to enumerate the back-end database
management system information, structure and data contained in the
tables
-a, --all Retrieve everything
-b, --banner Retrieve DBMS banner
--current-user Retrieve DBMS current user
--current-db Retrieve DBMS current database
--passwords Enumerate DBMS users password hashes
--dbs Enumerate DBMS databases
--tables Enumerate DBMS database tables
--columns Enumerate DBMS database table columns
--schema Enumerate DBMS schema
--dump Dump DBMS database table entries
--dump-all Dump all DBMS databases tables entries
-D DB DBMS database to enumerate
-T TBL DBMS database table(s) to enumerate
-C COL DBMS database table column(s) to enumerate
我就不带着大家一一去尝试了,我就在这展示一个--tables
的案例:的确,我本地的数据库中所有的数据表都被扫出来了,你看,seata
的四张表!
更多的使用案例技巧,shigen
也会持续的分享,欢迎评论 点赞 在看 关注
,这样就不会错过很多的干货了!
**也要默默的提一嘴:SQLMap是一个强大的工具,但在使用它时需要遵守法律和道德规范。毕竟数据的价值你懂的,一不小心局里蹲!**况且现在宕数据,人家(云服务)有监控,查看数据,人家(云服务)有记录,无处藏身!
后记
你以为文章在这里就结束了?我还要分享一个问题:到底我的代码漏洞是如何被发现的,直接攻击进了数据库?不能怪sqlMap
太厉害了,那这样全世界的数据库都不安全,重点在这里,${id}
。
重点
${id}
是字符串替换方式,直接将参数值嵌入到SQL语句中,存在安全风险。#{id}
是预编译参数占位符方式,通过占位符传递参数值并由数据库驱动程序进行参数绑定,更安全可靠。
这里的预编译参数有点像我们最开始学习的prepareStatement
。mybatis
或者mybatis plus
底层是这样处理的:
- 占位符生成:MyBatis会将
#{id}
中的id
作为参数名,并根据数据库厂商的不同生成相应的占位符。例如,对于MySQL数据库,占位符可能是?
;对于Oracle数据库,占位符可能是:1
、:2
等。 - 参数绑定:MyBatis会将参数值绑定到生成的占位符上。这个过程由底层的数据库驱动程序负责完成。数据库驱动程序通过使用预编译语句(PreparedStatement)来处理这些占位符,并将参数值安全地绑定到占位符上。
所以,很多公司规范包括阿里巴巴java开发手册
都明确的规定:占位符使用#{}
。
以上就是今天全部的内容啦,与shigen
一起,每天不一样!