随笔里的内容都是个人理解,如果有不对的地方,还望各位大佬多多指正。
一、理论基础
1、什么是数字型注入
数字型注入攻击主要针对应用程序中的数字参数,攻击者通过修改参数值来欺骗应用程序执行非法操作。这类攻击通常发生在应用程序的输入验证不严密的地方,例如在 SQL 查询中直接使用用户输入的数据,而不对输入数据进行过滤或转义。数字型注入攻击可能导致数据泄露、篡改或删除等后果。
2、SQL
union:SQL 的"UNION"操作符用于将两个或多个 SELECT 语句的结果组合成一个结果集。使用 UNION 时,各个 SELECT 语句必须返回相同数量的列,并且这些列的数据类型也必须相同。(这句话很重要)
database()是 MySQL 中的一个系统函数,用于返回当前操作的数据库名。
version()是 MySQL 中的一个系统函数,用于返回 MySQL 服务器的版本信息。
group_concat() 是 MySQL 中的一个聚合函数,它可以将多个行的某个字段值连接成一个字符串。这在需要将具有相同键值的多个记录合并为一个记录时非常有用。
3、SQL注入产生的原理
可控变量
带入数据库查询
变量未存在过滤或过滤不严谨
4、靶场
Pikachu漏洞练习平台
5、工具
burpsuite
二、注入思路
1、确认注入点
(1)使用burpsuite抓取请求数据,请求为post,id为可控变量
(2)id=3 后面多输入一个单引号 '
(3)提交请求后,发现SQL相关的报错,这里我们可以获得两个信息
①数据库为mysql,但是版本未知
②根据报错信息推测,后台执行的sql可能是这样
select xxx from table_name where id=$id
id传入的value为3',则sql变成了
select xxx from table_name where id=3'
这时的报错是
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
ps:这里为什么后台sql不会是下面这样呢
select xxx from table_name where id='$id'
id传入的value为3',则sql变成了
select xxx from table_name where id='3''
这时的报错是
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ''3''' at line 1
(4)id=3 后面加上 and 1=1,然后查看页面返回
页面返回正常
(5)id=3 后面加上 and 1=2,然后查看页面返回
页面返回id不存在
到这里就说明and后面的sql是可以被执行的,并且这里存在数字型注入漏洞
2、确认返回结果的列数
我理解这里所做的事情是在为下一步做铺垫
这里使用order by 来确认sql执行的结果有几列,判断的逻辑是order by 后面跟上数字,就是按照第几列来排序,如 order by 4 就是按照第4列进行排序,如果第4列不存在,则报错如下
就这样不停尝试,就可以确认sql执行后的表有几列,这里可以使用二分法来逐步缩小范围。
3、页面找返回结果展示的地方
上面确认了后台sql执行后的结果为2列,这时候要考虑如何才能看到这部分数据,或者说怎么才能让这部分数据展示在页面上
姓名和邮箱这两部分内容会根据id变化,所以我们继续测试,想办法把我们需要的数据通过这里展示出来
这里我尝试构造sql
我们通过union将前后两个sql的查询结果合并了起来。结果都打印了出来,这样我们把1和2的位置确定了,后面就是通过这两个位置我们来展示sql执行的结果
这里有一个地方需要注意,如果页面不支持显示多个结果,比如这里显示了两个hello和两个email,我们可以将id改成负数或者加上 and 1=2,目的是屏蔽id查询到的结果,让页面只显示我们输入的sql语句的内容。
上面两个结果都是一样,见下图
基本上这条路通了,应该就可以查到很多信息了。
4、找数据库和版本
结合上面的信息我们知道,后台为mysql数据库,版本为8.0.26-0ubuntu0.20.04.2,当前所使用的库名为pikachu
5、找数据表
mysql中information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
所以我们可以通过information_schema库来查找表和字段
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
select table_name from information_schema.tables where table_schema='pikachu';
使用group_concat 将结果变成一个字符串
select group_concat(table_name) from information_schema.tables where table_schema='pikachu';
所以,请求中sql构造如下
我们已经获取到了数据表
6、找字段名
找字段和上面的逻辑一样,我们去查询information_schema.columns
这里users表,我们推测应该保存用户密码
所以,sql构造如下
结果如下:
7、获取目标信息
还是同样的逻辑,我们就可以获取用户以及密码了
获取所有用户
获取admin用户的密码
8、解密
e10adc3949ba59abbe56e057f20f883e 32位,有可能是md5加密,尝试使用下方网站解密,解密后的结果为123456
https://www.cmd5.com/
标签:结果,MySQL,数字型,sql,table,注入,id,schema From: https://www.cnblogs.com/ops-blog/p/17720381.html