SQL 注入(SQL Injection)是一种常见的网络攻击手段,攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码,欺骗后台数据库执行非授权的 SQL 语句。SQL 注入可以用于获取、篡改或删除数据库中的数据,甚至可以用于执行系统命令,导致数据泄露、数据破坏或服务器被控制等严重后果。
简单说就是通过构造一些精心设计的语句,提交到url后,它会返回后台嘛,然后这些语句会与原来的代码语句进行拼接,这样一来就可以欺骗后台数据库,让它执行我们想要执行的语句
比如这个很简单的查询语句
select *from users where username='admin' and password=123456
正常我们是输入用户名admin,但是如果我们提交 admin’ or 1=1--+,可以看看如果把这个语句放在admin的位置会怎么样,妙就妙在这个单引号,它和原先的单引号闭合了,在通过--+(这是注释符号,还有#也是注释)把后面的东西注释掉了,又因为1=1始终成立,所以就通过验证了,不需要后面的密码
目录
ok说完前面你应该知道sql注入大概是什么原理,那开始讲今天讲的union注入
首先要清楚注入的几个步骤
- 查找有没有注入点
- 判断是字符型注入还是数字型注入
- 如果是字符型还需要判断它的闭合方式
- 判断查询的列数
- 将回显位置改为不存在的数,以便页面显示我们要找的内容
查找注入点
查找注入点就是看看你通过get、post请求等上传参数之后页面有没有回显东西,如果页面什么都没有显示那就不存在注入点,常见存在注入点的地方:
- 搜索框
- url参数
- 表单输入
- cookies
另外一般看到?id=1这种也要去试试是不是可以注入,通过加个 ‘ 等看看页面有没有什么反应
判断是字符型注入还是数字型注入
通过提交?id=2 和?id=2-1看看页面显示的内容有没有发生变化,如果没有那就是字符型注入,因为字符型有引号围起来,数字型没有,数字型会计算2-1的值,字符型不会
这个则是字符型,如果两次结果不一样就是数字型,还有很多种方法都可以判断,只要构造好语句就行
字符型判断闭合方式
常见的闭合方式 ' '' ') '') } 等等
这些做题时需要自己去测试到底是哪个
测试语句
?id=1' and '1'='1 //单引号闭合
?id=1'' and ''1''=''1 //双引号闭合
?id=1') and '1'='1 //')闭合
可以看看哪个可以正常回显,则是哪种闭合
判断查询的列数
因为union查询需要前后的列数一致才可以显示,之前的文章有说过可以用两种方式来判断,分别是
group by order by 后面加要查询的列数,从大往小尝试,直到页面可以正常显示则是他的列数
union查找信息
首先要知道查找的顺序是什么
先找 库名-表名-列名 ,之后就可以拿到我们想要的数据了
接下来进行查找
因为页面只能显示一个信息,所以我们拿不到我们想要的信息(%27是’ ,%20是空格)
这时候将改为一个不存在的数0,-1这些即可
就拿到了数据库的名字
接下来是表名,需要知道一个数据库
- information_schema, 它里面包含了数据库的基本信息,里面有两张数据表也需要记住
- table 存放所有表名的信息
- columns 存放所有列名的信息
下面就可以进行查找了,table_name是表名,table_schema是表的库名,我们在上一步已经得出是security,这里可以直接用,也可以像我一样直接用database()替代,这样子有时候不会被过滤
?id=1'union select 1,2,table_name form information_schema.table where table_schema=database()--+
这里拿到表名emails,但是可能不是我们想要的表,为了能让他显示这个数据库所有的表,需要用到之前讲过的group_concat()函数
它就会全部显示出来了,在做题时我们需要去推断我们想要的信息在哪个表里面,这里我们可以猜到应该是users这张表,之后继续去拿列名,其实就是把table改为column,之后再在where后面加上上一步得到的表名,就可以拿到列名,每一步得到的信息都是为了在后面where语句可以把范围定位的准确
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'--+
之后就可以查找我们想要的数据了,比如要查询用户名和密码,这里可以在用户名和密码之间加上-等符号用来分隔,以便看的清楚
?id=-1'union select 1,2,group_concat(username,'-',password)from users
总结
以上就是做union注入时的全部步骤了,需要熟练知道步骤是什么
标签:语句,union,查找,sql,table,id,注入 From: https://blog.csdn.net/2401_88235353/article/details/144646708