结构化查询语言:structured query language---sql
关系式数据库管理系统---DBMS,拥有明显的层次结构:库名、表明、字段名、字段内容
*漏洞原理:
针对SQL注入的攻击行为可描述未通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为
*形成原因:
1、程序编写者在处理数据和数据库交互时,使用字符串拼接的方式构造SQL语句
2、未对用户可控参数进行足够的过滤便将参数内容拼接进入SQL语句中
*可能存在的位置
@GET数据
@POST数据
@HTTP头部(HTTP请求报文其他字段)
@Cookie数据
*漏洞危害
获取数据库中的多种信息(脱裤)、修改数据库内容到数据库、获取webshell或服务器的系统权限
(服务器提权:mof/udf提权)
*分类
@数据类型分类:
---数字型:注入点的数据,拼接到SQL语句中是以数字型出现的,即数据两边没有被单引号、双引号包括
---字符型:与数字型相反
@注入点手法分类
UNION(联合查询)---查
ERROR(报错注入)---查
布尔盲注---查
(基于事件的)延时注入---查
可多语句查询注入(堆叠查询)---增删改
*注入点的判断
* MYSQL 常用函数与参数
length() | 返回字符串的长度 |
substring() | 截取字符串 |
left() | 从左侧开始取指定字符个数的字符串 |
concat() | 没有分隔符的连接字符串 |
concat_ws() | 含有分割符的连接字符串 |
group_conat() | 连接一个组的字符串 |
ord() | 返回ASCII 码 |
ascii() | |
hex() | 将字符串转换为十六进制 |
unhex() | hex 的反向操作 |
md5() | 返回MD5 值 |
floor(x) | 返回不大于x 的最大整数 |
round() | 返回参数x 接近的整数 |
rand() | 返回0-1 之间的随机浮点数 |
load_file() | 读取文件,并返回文件内容作为一个字符串 |
sleep() | 睡眠时间为指定的秒数 |
if(true,t,f) | if 判断 |
find_in_set() | 返回字符串在字符串列表中的位置 |
benchmark() | 指定语句执行的次数 |
name_const() | 返回表作为结果 |
substr() | |
mid() | 1. 截取的字符串2. 截取起始位置,从1开始计数 3. 截取长度 |
@ 逻辑运算
在SQL 语句中逻辑运算与(and)比或(or)的优先级高。 [select 1=2 and 1=2 or 1=1;]
* 注入流程
由于关系型数据库系统,具有明显的库/表/列/内容结构层次,所以我们通过SQL 注入漏洞获取数据库中信息时候,也依据这样的顺序。首先获取数据库名,其次获取表名,然后获取列名,最后获取数据。