8.2SQL注入漏洞 8.2.1SQL注入漏洞原理 比较奇怪的是为什么密码随意输入都可以进入后台呢?进入数据库查看,发现“Neville”用户只对应 "sith”密码,根本没有后缀为”or‘1'=‘1”这个密码。难道是程序出错了吗?下面详细分析此程 序,看问题到底出现在何处。 首先,提交正确的账号为Neville,密码为smith,跟踪SQL语句,发现最终执行的SQL语句为: select count(*)from admin where username='Neville'and password='smith' 在数据库中,存在Neville用户,并且密码为smith,所以此时用户可以成功登录。 接下来继续在密码sith后面输入特殊字符串"or'1'=1”,并跟踪SQL语句,最终执行SQL语句为: select count(*)from admin where username='Neville'and password='smith'or '1'='1' 终于找到问题的根源了,从开发人员的角度理解,SQL语句的本义是: username='账户'and password=密码
8.2.1 SQL注入漏洞原理 比较奇怪的是为什么密码随意输入都可以进入后台呢?进入数据库查看,发现“Neville”用户只对应 “smith”密码,根本没有后缀为“’ or ‘1’=‘1”这个密码。难道是程序出错了吗?下面详细分析此程 序,看问题到底出现在何处。 • 首先,提交正确的账号为Neville,密码为smith,跟踪SQL语句,发现最终执行的SQL语句为: select count (*) from admin where username='Neville' and password='smith' 在数据库中,存在Neville用户,并且密码为smith,所以此时用户可以成功登录。 • 接下来继续在密码smith后面输入特殊字符串“’ or ‘1’=‘1”,并跟踪SQL语句,最终执行SQL语句为: select count (*) from admin where username='Neville' and password='smith’ or ‘1’=‘1' 终于找到问题的根源了,从开发人员的角度理解,SQL语句的本义是: username=‘账户’ and password=‘密码’, 8.2 SQL注入漏洞
8.2SQL注入漏洞 8.2.1SQL注入漏洞原理 现在却变为: username=账户'and password='密码or'1'='1' 此时的password根本起不了任何作用,因为无论它正确与否,password=密码or1'='1'这条语 句永远为真。 很显然,可以顺利通过验证,登录成功。这就是一次最简单的$QL注入过程。虽然过程很简单,但其危害却很 大,比如,在密码位置处输入以下SQL语句 or '1'='1';drop table admin-- 因为SQL Server支持多语句执行,所以这里可以直接删除admin表。 。由此就解知,SQL注入漏洞的形成原因就是:用户输入的数据被SQL解释器执行。 下面将详细介绍攻击者SQL注入的常用技术,以做好Wb防注入工作
8.2.1 SQL注入漏洞原理 现在却变为: username=‘账户’ and password=‘密码’ or ‘1’=‘1’ 此时的password根本起不了任何作用,因为无论它正确与否,password=‘密码’ or ‘1’=‘1’这条语 句永远为真。 很显然,可以顺利通过验证,登录成功。这就是一次最简单的SQL注入过程。虽然过程很简单,但其危害却很 大,比如,在密码位置处输入以下SQL语句 ’ or ‘1’=‘1’; drop table admin -- 因为SQL Server支持多语句执行,所以这里可以直接删除admin表。 由此就解知,SQL注入漏洞的形成原因就是:用户输入的数据被SQL解释器执行。 下面将详细介绍攻击者SQL注入的常用技术,以做好Web防注入工作。 8.2 SQL注入漏洞
8.2.2SQL注入漏洞分类 常见的$QL注入类型包括:数字型和字符型。也有人把类型分得更多、更细。但不管类型如何, 目的只有一点,那就是绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性 获取更多的信息或者更大的权限。 1.数字型注入 当输入的参数为整型时,如:D、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注 入,数字型注入是最简单的一种。假设有URL为HTTP:/www.xxser.com/test.php?id=8,可测 猜测SQL语句为: select from table where id=8
8.2.2 SQL注入漏洞分类 常见的SQL注入类型包括:数字型和字符型。也有人把类型分得更多、更细。但不管类型如何, 目的只有一点,那就是绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性 获取更多的信息或者更大的权限。 1. 数字型注入 • 当输入的参数为整型时,如:ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注 入,数字型注入是最简单的一种。假设有URL为HTTP://www.xxser.com/test.php?id=8,可测 猜测SQL语句为: select * from table where id=8
8.2.2SQL注入漏洞分类 select from table where id=8 测试步骤如下。 HTTP://www.xxser.com/test.php?id=8 SQL语句为:select*from table where id=8',这样的语句肯定会出错,导致脚本程序无法从数 据库中正常获取数据,从而使原来的页面出现异常。(8是非数字类型) HTTP://www.xxser.com/test.php?id=8 and 1=1 SQL语句为select*from table where id=8and1=1,语句执行正常,返回数据与原始请求无任何 差异。 HTTP://www.xxser.com/test.php?id=8 and 1=2 SQL语句变为select*from table where id=8and1=2,语句执行正常,但却无法查询出数据,因 为“and1=2”始终为假。所以返回数据与原始请求有差异。 如果以上三个步骤全部满足,则程序就可能存在SQL注入漏洞
8.2.2 SQL注入漏洞分类 select * from table where id=8 测试步骤如下。 HTTP://www.xxser.com/test.php?id=8' SQL语句为:select * from table where id=8’,这样的语句肯定会出错,导致脚本程序无法从数 据库中正常获取数据,从而使原来的页面出现异常。(8’是非数字类型) HTTP://www.xxser.com/test.php?id=8 and 1=1 SQL语句为select * from table where id=8 and 1=1,语句执行正常,返回数据与原始请求无任何 差异。 HTTP://www.xxser.com/test.php?id=8 and 1=2 SQL语句变为select * from table where id=8 and 1=2,语句执行正常,但却无法查询出数据,因 为“and 1=2”始终为假。所以返回数据与原始请求有差异。 如果以上三个步骤全部满足,则程序就可能存在SQL注入漏洞
8.2.2SQL注入漏洞分类 ·2.字符型注入 当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字类型不需要单引号闭合,而 字符串类型一般要使用单引号来闭合。 (1)数字型例句如下: select from table where id =8 (2)字符型例句如下: select from table where username ='admin' 字符型注入最关键的是如何闭合SQL语句以及注释多余的代码
8.2.2 SQL注入漏洞分类 2. 字符型注入 • 当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字类型不需要单引号闭合,而 字符串类型一般要使用单引号来闭合。 • (1)数字型例句如下: • select * from table where id = 8 • (2)字符型例句如下: • select * from table where username = 'admin' • 字符型注入最关键的是如何闭合SQL语句以及注释多余的代码