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
