什么,一条指令直接黑了数据库!

什么,一条指令直接黑了数据库!

sqlMap

shigen最近研究了一下一款渗透工具sqlMap。它一款流行的开源工具,用于自动化SQL注入攻击和渗透测试。它专门设计用于检测和利用Web应用程序中的SQL注入漏洞。SQLMap具有丰富的功能集,可自动检测和利用SQL注入漏洞,获取数据库的敏感信息,以及执行各种数据库操作,如提取、修改或删除数据。它支持多种数据库管理系统(DBMS),包括MySQL、Oracle、SQLite、Microsoft SQL Server等。也支持多种注入技术,包括基于错误的注入、联合查询注入、布尔盲注和时间盲注。通过使用这些技术,它可以自动化地发现和利用各种类型的SQL注入漏洞。

它的官方地址在这里:sqlmap代码地址

sqlmap直接连接数据库

以下是我用sqlMap连接数据库并获得数据库的版本信息案例。

python3 sqlmap.py -d 'mysql://root:[email protected]:3306/security' -f --banner

sqlmap直接连接数据库

对单一的URL进行探测

在这里,shigenspring 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

见证奇迹的时刻

我直接上我的结果!

获得所有的dbs

控制台输出了我本地的所有数据库,而且是准确的、全部的!是不是很恐怖。第一次我还不大相信,我还以为是shigen眼花了。

我看了一下控制台输出的有一个payload信息,它的参数是:id= 2 and 5685=5685, 而这只是一个案例,sqlmap在执行的时候,会注入很多这样总是在where之后条件成立的语句。

url探测

这样的就是一个很明显的案例,总是不断的在条件后边追加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}是预编译参数占位符方式,通过占位符传递参数值并由数据库驱动程序进行参数绑定,更安全可靠。

这里的预编译参数有点像我们最开始学习的prepareStatementmybatis或者mybatis plus底层是这样处理的:

  1. 占位符生成:MyBatis会将#{id}中的id作为参数名,并根据数据库厂商的不同生成相应的占位符。例如,对于MySQL数据库,占位符可能是?;对于Oracle数据库,占位符可能是:1:2等。
  2. 参数绑定:MyBatis会将参数值绑定到生成的占位符上。这个过程由底层的数据库驱动程序负责完成。数据库驱动程序通过使用预编译语句(PreparedStatement)来处理这些占位符,并将参数值安全地绑定到占位符上。

所以,很多公司规范包括阿里巴巴java开发手册都明确的规定:占位符使用#{}

以上就是今天全部的内容啦,shigen一起,每天不一样!

猜你喜欢

转载自blog.csdn.net/weixin_55768452/article/details/132536861