SQL注入-1

什么是SQL注入?有什么危害?

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),只要以一定的方式构建语句,就能达到目的。
有如下思路:

  1. ';:结束上句(闭合语句)。
  2. #----+:注释下句,注意空格,--+是php的特例。
  3. union:将两条查询语句合并成一条来解决php限制。
    注意:union的参数数量要一致、对应序号的字段的类型要能够转换
  4. order by 1/2/3···:探测字段数量。
  5. 在3的基础上添加相应的字段数。

对于使用get来查询的网站:

  1. 探查是否存在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. 探查数据库指纹,交由工具执行
  2. 获取数据库名
    同上,组合技:1=1和order by
  3. 获取表名
  4. 获取列名
  5. 得到数据
  6. 一些整理:
    • 多行数据变成一行:select group_concat(table_name) from information_schema.tables where table_schema='xxx',注意要保证参数数量一致.
    • 现在已知了所有参数,填充未知参数来获取数据.
    • 如果有查询数量的限制,使用limit 0,1这样的方式来逐个查询.