2022年最详细的SQL注入总结笔记
一、sql 注入概述
SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息 , 在实战和测试中,难免会遇见到一些 sql 注入,下面,我将总结一些常用 sql 注入中的不同姿势。
二、寻找 sql 注入
测试注入点:
1. 在参数后面添加单引号或双引号,查看返回包,如果报错或者长度变化,可能存在 Sql 注入
注入点判断:id=1'(常见)id=1" id=1') id=1')) id=1") id=1"))
2. 通过构造 get、post、cookie 请求再相应的 http 头信息等查找敏感喜喜
3. 通过构造一些语句,检测服务器中响应的异常
三、sql 注入的类型
附上自己整理的思维导图学习
常见的数据库类型,分为关系型数据库和非关系型数据库
关系型数据库有 Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access 和 MySQL 等。
非关系型数据库有 Neo4j、MongoDB、Redis、Memcached、MemcacheDB 和 HBase 等
Mysql 注入
普通注入
数字型:
测试步骤:
(1) 加单引号,URL:xxx.xxx.xxx/xxx.php?id=3';
对应的 sql:select * from table where id=3' 这时 sql 语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加 and 1=1 ,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=1;
对应的 sql:select * from table where id=3' and 1=1 语句执行正常,与原始页面没有差异;
(3) 加 and 1=2,URL:xxx.xxx.xxx/xxx.php?id=3 and 1=2;
对应的 sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异;
字符型
测试步骤:
(1) 加单引号:select * from table where name='admin'';
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ' and 1=1 此时 sql 语句为:select * from table where name='admin' and 1=1' ,也无法进行注入,还需要通过注释符号将其绕过;
因此,构造语句为:select * from table where name ='admin' and 1=--' 可成功执行返回结果正确;
(3) 加 and 1=2— 此时 sql 语句为:select * from table where name='admin' and 1=2–'则会报错;
如果满足以上三点,可以判断该 url 为字符型注入。
判断列数:
爆出数据库:
爆出数据表:
爆出字段:
爆出数据值:
拓展一些其他函数:
多条数据显示函数:
报错注入
extractvalue 函数:
updatexml 函数:
细节问题:extractvalue() 基本一样,改个关键字 updatexml 即可 , 与 extractvalue 有个很大的区别实在末尾注入加上,如:(1,concat(select @@version),1), 而 extractvalue 函数末尾不加 1(数值)
exp 函数溢出错误:
在 mysql>5.5.53 时,则不能返回查询结果
floor 函数:
延时注入
判断注入点:
爆出数据库:
通过判断服务器没有睡眠,ascii 码转换 115 为 s ,那么就得出数据库第一个字符为 s, 下面就可以一次类推了 , 就不一
substr(database(),N,1) 可以通过改变 N 的值来判断数据的地几个字符为什么
爆出数据表:
解释:security 的第一张表的第一个字符 ascii 为 101,为字符 e
limit 0,1),N,1 还是改变 N 的的得出第二个字符
再判断字符(ascii 判断)
(left 语句判断)
Substring 函数判断
附上一篇文档(盲注脚本):https://blog.csdn.net/weixin_41598660/article/details/105162513