首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自学渗透测试4:什么是 SQL 注入?配合 sqlmap 教你一步步实践

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

原创
作者头像
叫我阿柒啊
发布2025-07-07 23:58:01
发布2025-07-07 23:58:01
5470
举报

前言

还记得在当初学习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 来连接。

  1. AND:两个条件都成立才返回结果
  2. OR:只要有一个条件成立就返回结果

所以在上面的SQL中,我在后面加入 or 1=1 的时候,因为1=1为true,所以会查询出来包括admin所有用户。

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

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

sqlmap

sqlmap 是一款开源的自动化 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注入。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • SQL注入
  • sqlmap
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档