【学习中】sql注入-数字型注入

随笔里的内容都是个人理解,如果有不对的地方,还望各位大佬多多指正。

一、理论基础

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/

posted @ 2023-09-22 14:40  刘铁柱柱柱柱柱柱  阅读(637)  评论(0编辑  收藏  举报