SQL注入

一、SQL注入简介

SQL注入是最常见的web漏洞,本质就是前端没有对表单数据做合理性校验,导致前端提交的数据被后端直接当成数据库代码执行,因此攻击者可以构造不同的SQL语句来查询数据库数据。

二、SQL注入条件

1.用户能控制传入后端的数据
2.web应用程序把数据作为数据库代码执行

三、注入步骤

1.数字型注入

如果存在注入漏洞,且输入数据类型为整型,则可以认为是数字型注入
假设对应SQL语句为select * from table where id=?其中id为用户以get形式传递的参数

(1)正常输入

URL后加上?id=1,这时候SQL语句为select * from table where id=1会查询表内id为1的数据

(2)单引号测试

URL后加上?id=1’,这时候SQL语句为select * from table where id=1’此时SQL语句错误,系统会抛出异常

(3)and true测试

URL后加上?id=1 and 1=1,这时候SQL语句为select * from table where id=1 and 1=1其中1=1为true,那就和(1)情况一样,查询表内id=1的数据

(4)and false测试

URL后加上?id=1 and 1=2,这时候SQL语句为select * from table where id=1 and 1=2其中1=2为false,则该语句虽然可以正常执行,但查询不了数据

(5)or true测试

URL后加上?id=1 or 1=1,这时候SQL语句为select * from table where id=1 or 1=1其中1=1为true,那语句就变成查询所有id存在的数据,一般来说这时候我们就能够获取到需要的数据了

2.字符串型注入

如果存在注入漏洞,且输入数据类型为字符串,则可以认为是字符串型注入
与整数型注入不同的是,字符串注入需要使用单引号闭合
假设对应SQL语句为select * from table where username=?其中username为用户以get形式传递的参数

(1)正常输入

URL后加上?username=admin,这时候SQL语句为select * from table where username='admin'会查询username为admin的数据

(2)单引号测试

URL后加上?username=admin’,这时候SQL语句为select * from table where username='admin'’此时SQL语句错误,系统会抛出异常

(3) and true测试

URL后加上?username=admin’ and 1=1,这时候SQL语句为select * from table where username='admin' and 1=1'此时语句末尾存在单引号,语句错误系统抛出错误
那我们只要把最后的引号注释掉就可以正常执行了,URL后加上?username=admin’ and 1=1#,这时候SQL语句为select * from table where username=’admin’ and 1=1#’,而#为注释符号,执行语句时会忽略#后面的部分,在这里就是忽略最后的’,则最后能够正常执行,结果与(1)相同

最后and false与or测试只要最后加上#注释符,最后预期结果都与整数型注入的对应结果相同
除#号注释符外,还有–和–%20等其他注释方式,详细可了解
https://blog.csdn.net/weixin_43096078/article/details/108215076

四、实战

我们选择buuctf中的一道SQL注入题目为例子

buuctf:https://buuoj.cn/


首先名字为EASYSQL,那就用SQL注入浅浅的做一下
这种表单数据提交一般都是字符串型注入
先是抓包正常输入username=1,password=1看一下正常页面是怎么样的

提示错误,再试试单引号测试

翻译一下回显页面”您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行的 ‘1’’’ 附近使用的正确语法”,可以知道第一行有SQL注入漏洞,就是username,那对第一行进行and true测试,由于抓包改get传参数’后面的数据难改,就回到原本题目页面输入,发现和正常输入回显一样


那就直接or测试进行攻击,拿到flag


SQL注入
http://example.com/2024/10/07/SQL注入/
作者
印星
发布于
2024年10月7日
许可协议