自学渗透测试4:什么是 SQL 注入?配合 sqlmap 教你一步步实践

2025-07-10 05:31:45

前言还记得在当初学习JDBC的时候,教程上就一直说不要手动拼接SQL,要使用 PreparedStatement 的占位符 ?来预编译一下SQL,避免SQL注入。那时候就是纯小白,哪懂什么SQL注入,反正你说用咱就用。

SQL注入经过后来的学习,明白了SQL注入是一种比较常见的 Web 安全漏洞,攻击者通过在网页构造恶意的 SQL 语句,让后台的数据库执行本不该执行的操作。那么问题来了,SQL 是开发者在后台程序中定义好的,然后通过接口调用执行。攻击者是如何构造了“恶意”的SQL呢??

举个栗子,我在后台程序中定义了这么一段代码:

代码语言:java复制// input 是用户的输入

String sql = "select * from user where username = '" + input + "'";正常然后在前端页面传入 username 赋值给 input,然后在数据库执行就能返回这个用户的信息了。

但是因为这里使用了拼接字符串的方式,对于input没有校验,如果我在传入username的同时,也传入了一些其他的字符串,就会查到其他用户的信息。在上面的SQL中,我们使用了where条件,我们知道在多个条件中,可以使用AND 和 OR 来连接。

AND:两个条件都成立才返回结果OR:只要有一个条件成立就返回结果所以在上面的SQL中,我在后面加入 or 1=1 的时候,因为1=1为true,所以会查询出来包括admin所有用户。

那么,如果想要在上面后台程序中加入这样的代码逻辑,需要传入 'or 1=1# 。单引号是为了闭合 username 的条件, 最后的#是为了注释代码中的最后一个单引号,SQL如下图所示。

这个就是最简单的一个SQL注入,通过注入未校验参数的where条件实现,除此之外还有更为复杂的SQL注入,如果是delete命令被SQL注入,可能就会删除所有的数据。所以这就是为什么在java中使用PrepareStatement的原因所在。

sqlmapsqlmap 是一款开源的自动化 SQL 注入测试工具,通过pip可以快速安装。

代码语言:bash复制pip3 install sqlmap执行安装:

在命令行中输入 sqlmap 即可执行注入测试。

我们在DVWA靶场中的SQL注入漏洞中,找到SQL注入的url,然后丢给sqlmap去注入测试。

代码语言:bash复制sqlmap -u "http://example.com/vuln.php?id=1"结语本篇文章主要简单的讲述了SQL注入的基本原理,以及sqlmap的简单使用,这也是渗透测试的一种场景。对于开发者而言,我们要在程序代码中,自定义或者使用一些预编译方式,对用户输入的参数进行校验过滤,才能有效避免SQL注入。

最新发表
友情链接