一、知识点:
1、脚本代码与数据库前置知识
2、Access数据库注入-简易&偏移
3、MYSQL数据库注入-简易:权限跨库
二、前置知识:
(一)SQL注入漏洞产生原理分析
SQL注入产生条件:根本条件:可控变量、特定函数。
脚本代码在实现代码与数据库进行数据通讯时(从数据库取出相关数据进行页面显示)将定义的SQL语句进行执行查询数据时。其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员帐号密码)。这一个过程就可以叫做SQL注入漏洞。
在没有参数的地方不代表没有漏洞,比如下面的登录框地址没有包含参数,但是抓包也是可以看到刚刚输入的账户及密码,即可以通过抓包去修改参数。(因为有些参数在地址上是看不到的)
情况1:http://10.1.1.103:8001/production/PRODUCT_DETAIL.asp
不能说完全没有漏洞测试的可能性,参数以post方式发送请求,或者其他方式。
情况2:http://10.1.1.103:8001/production/PRODUCT_DETAIL.asp?id=1513
这种很明确参数就在地址上可以看到
情况3:http://10.1.1.103:8001/production/PRODUCT_DETAIL.asp?id=1513&page=1
情况3的手工测试:
1)production/PRODUCT_DETAIL.asp?id=1513 注入语句 &page=1
2)production/PRODUCT_DETAIL.asp?id=1513&page=1 注入语句
!!!SQL注入攻击流程!!!
1.猜测数据库类型
ACCESS数据库----单独存在
ASSESS结构:
数据库名
表名
列名
数据
MYSQL数据库----统一管理
MYSQL结构:
会存在一个概念:最高数据库用户=root用户
为了网站和数据库的安全性,MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行。
数据库A—网站A(数据库用户A管理库A)
表名
列名
数据
数据库B—网站B(数据库用户B管理库B)
数据库C—网站C(数据库用户C管理库C)
MYSQL两种思路:
1、非ROOT的注入攻击:常规类的猜解2、ROOT用户的注入攻击:文件读写操作,跨库查询注入等
黑盒测试中可以采用user()获取当前用户权限,白盒中看连接用户即可!
MYSQL数据存储特性:
MYSQL5.0以上版本:自带的数据库名information_schemainformation_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表,表名为table_name,库名为table_schema
information_schema.columns:记录列名信息的表,列名为column_name,表名为table_name,库名为table_schema
information_schema.schemata:记录数据库名的信息表,对应字段名:schema_name
获取相关数据:
1.获取数据库版本-看是否符合information_schema查询-version()union select version(),2,3
2.获取数据库用户-看是否符合ROOT型攻击-user()union select user(),2,3
3.获取当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_osunion select @@version_compile_os,2,3
4.获取数据库名字-为后期猜解指定数据库下的表,列在做准备-database()union select database() ,2,3
ROOT类型攻击-猜解数据,文件读取,跨库查询获取当前数据库下的表名信息:
union select table_name,2,3 from information_schema.tables where table_schema='数据库名'
获取指定表的列名信息:union select column_name,2,3 from information_schema.columns where table_name='表名' and table_schema='数据库名'
获取指定数据:union select username,password,3 from 表名
2.根据数据库类型选择思路
步骤:
1.通过order by 判断列名数,猜测数据,观察返回结果
例如:http://xxxx/xxx.asp?id=xxx order by 3
2.猜出列数后,通过union进行联合查询(查询表名)
例如:http://xxxx/xxx.asp?id=xxx union select 1,2,3 from 表名
3.看报出哪个数字,在对应数字的位置写查询语句(查询表名下面的列名)
例如:http://xxxx/xxx.asp?id=xxx union select 1,列名,3 from 表名
(二)SQL注入漏洞危害利用分析
危害就是:数据库的语句能干嘛,他就能干嘛(增删查改数据)比如获取管理员的账户密码,操作数据库里面的数据。
//SQL语句查询,删除,添加,修改等操作
//SQL语句有写法规则也就是说必须符合正确的写法才能执行成功
(三)脚本代码与数据库操作流程
(四)数据库名,表名,列名,数据
(五)数据库类型,数据库用户,用户权限
演示案例:
-ASP+Access-简易注入-字典猜解
由于Access数据库特性导致这个SQL注入是需要借助只字典去拆解表名和列名的,那么就会出现表名或列名猜解不到,可以自定义社工字典或采用偏移注入。偏移注入就是解决表名已知列名未知的情况!
-ASP+Access-偏移注入-报错显示
偏移注入就是解决表名已知,列名未知的情况!
-PHP+MYSQL-简易注入-存储特性
-PHP+MYSQL-跨库注入-权限属性
MYSQL-跨库注入(跨库注入是因为root用户可以统一管理所有的数据库)
跨库注入:实现当前网站跨库查询其他数据库对应网站的数据
获取当前mysql下的所有数据库名:
union select schema_name,2,3 from information_schemata
获取表名和列名和上述一样,这里就不重复写了
注意最后获取对应数据的时候要from 数据库名.表名,不然会查询当前数据库,就不是跨库了