本文最后更新于:2021年1月8日 晚上

SQL注入

1、MySQL入门

information_schema库

信息数据库。保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。

schemata表

提供了当前MySQL实例中所有数据库的信息。show databases的结果就是取之此表。

select * from information_schema.schemata;

tables表

提供了关于数据库中的表的信息包括视图。

select * from information_schema.tables where table_schema='table_name';

columns表:

提供了表中的列信息。详细描述了某张表的所有列的信息。

select * from information_schema.columns where table_schema='table_name';

mysql库

MySQL核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。

performance_schema库

内存数据库,数据放在内存中直接操作的数据库。主要用于提高应用读写性能。

sys库

基于IP或用户查询资源使用情况。以及表的访问信息等。

SQl注入原理

SQL注入是发生于应用程序与数据库层的安全漏洞。如用户输入的数据被构造成恶意的SQL代码,Web应用又未对动态构造的SQL语句使用的参数进行审查,则会引发SQL注入。

GET型SQL注入漏洞

GET方法提交的内容会显示在网页URL上,通过对URL连接进行构造,获得超出权限信息的内容。
测试字段数量及回显的字段位置,替换选项,获取“使用的数据库用户”、“使用的数据库名称”、“当前数据库版本”、“当前使用的数据库表”

'union select 1,user(),table_name,database(),version(),6,7 from information_schema.tables where table_schema=database(); --+

POST型SQL注入漏洞

注入信息存储于HTTP实体内容而不是URL,通过改造实体内容,达到实际执行的SQL语句获取更多信息的目的。

5种不同的注入类型

Boolean-based blind SQL injection(布尔型注入)

?id=1 and substring(version(),1,1)=5

如果服务端MySQL版本是5.X,那返回的内容就和正常请求一样。

UNION query SQL injection(可联合查询注入)

?id=1 union all select schema_name from information_schema.schemata

最快捷的方法,通过union查询获取所有想要的数据,前提是返回中会携带SQL执行后查询到的内容,利用难度较大

Time-based blind SQL injection(基于时间延迟注入)

select * from user where id='4' and sleep(3);

通过判断请求的响应时间,判断SQL是否成功执行,常用于页面无回显的场景

Error-based SQL injection(报错型注入)

如果后端能返回SQL报错信息,则考虑使用报错型注入,如利用group by的duplicate entry错误。

Stacked querier SQL injection(可多语句查询注入)

?id=1;update t set name ='a' where id =1

能执行多条查询语句,非常危险,意味着可直接更新数据库。