不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动。在网络中,数据库驱动的Web应用随处可见,由此而存在的SQL注入是影响企业运营且最具破坏性的漏洞之一。
SQL(Struct Query Language)结构化查询语言,是一种面向数据库的编程语言,它可以对数据库中的信息进行增删改查操作。SQL可以与多种数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。
攻击者通过精心构造SQL语句达到欺骗服务器、绕过服务器的检测过滤,最终达到执行该SQL语句,并且输出攻击者想要获取的隐秘信息的过程。
WEB交互少不了从WEB页面接收用户输入的信息,并且对其进行操作,最终完成交互的目的。有一句话说的好就是“有输入的地方就有风险”,如果对用户的输入不加过滤,直接带入数据库执行,那么就会产生一定的安全风险。例如:
$sql="select * from users where username=".$_GET["id"];
上面代码中的id的值是可控的,如果我们构造属于我们自己的SQL语句并且让输入框执行,那么就会产生注入漏洞。
归根结底信息安全的问题还是“信任”问题。
寻找SQL注入漏洞有一种很简单的方法,就是通过发送特殊的数据来触发异常。
(1) 单引号(’)
如有下面的SQL语句:
Select * from user where id=1
如果我们在id值之后加一个“ ' ”,那么sql语句就会变为:
Select * from user where id=1'
此时带入输入库查询时由于数据库对id之后的“ ' ”语法格式错误,就会产生报错。最终执行失败。同时也说明此处的ID是一个可以控制的量,服务器对用户的输入不经过过滤直接带入了数据库进行查询,由此而诞生一个SQL注入漏洞。
(2) and方法
当页面不返回任何错误信息的时候,我们就可以使用此方法进行推断了!
当我们在访问页面的URL参数之后加上and 1=1 显示正常,而and 1=2 显示错误的时候即说明存在注入漏洞!
原因:构造的数据库语句被带入数据库执行语句执行了!and 1=1永远为正确,而1=2为错误,and的逻辑运算要求两者都需要正确才可以返回真值。如果提交以上的构造语句之后,显示的页面与正常的页面没有任何区别,那么说明数据库对用户输入的信息进行了过滤操作,如果说有变化,那么说明用户构造的SQL语句带入了数据库进行查询。
(3) OR方法:
修改正常URL后面的参数id的数值后回车,显示错误页面,当加入or 1=1时显示正常页面,说明存在注入!
原因:or 1=1 永远为真,同时也说明出现上述现象是带入了数据库查询语句中,并且执行了。
(4) 加减法
这里我们需要区分一下数字型和字符串型:
· 数字型:不需要使用单引号来表示
· 其他类型:使用单引号来表示
加法,我们在参数输入1+1,看看返回的数据是不是id等于2的结果,这里注意一下+号在SQL语句是有特效含义的,所以我们要对其进行url编码,最后也就是%2b。
减法,是同样的道理,不过不需要对-号进行url编码。
后面将会对不同类型的数据库的注入方法以及一些注入工具进行进一步介绍,相关内容敬请期待!