SQL注入是一种专门针对SQL语句的攻击方式。通过把SQL命令插入到web表单提交、输入域名或者页面请求的查询字符串中,利用现有的程序,来非法获取后台的数据库中的信息。在web的测试中涉及到的会比较多些。
注入原理
存在注入的原因是后台在编写程序时,没有对用户输入的数据做过滤。例:
1、用户在某个输入框提交的参数是123。
服务器后台执行SQL语句:select*fromtable1whereid=123
此时是没有任何影响的。
2、如果用户提交的参数是123;droptable
服务器后台执行SQL语句:select*fromtable1whereid=123;droptable
相当于后台执行了两条SQL语句,查表,并且把table删除,从而导致了SQL注入
检测注入的方法
目前主要有两种检测方式:
一、手工注入检测流程:
1.判断是否存在注入点
www.abc.com/index.phpid=2
www.abc.com/index.phpid=2and1=1
www.abc.com/index.phpid=2and1=2
第2条返回正常,
第1,3条返回不正常说明id参数存在注入漏洞
2.判定是否存在admin表
www.abc.com/index.phpid=2andexists(select*fromadmin)
返回正常,存在admin表
3.猜admin表中的字段名
www.abc.com/index.phpid=2andexists(selectusernamefromadmin)
返回正常表示admin表存在username字段
4.检测其他sql操作
二、工具检测:
sqlmap:sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。
1.下载地址
2.常用命令
测试
以一个sqlmap检测URL为例:
1.检测过程:
2.检测结果:
可知该次注入检测没有成功。
防止sql注入代码:(1)修改php.inimagic_quotes_gpc=Off,打开开关,不常用;
(2)获取到参数后,调用$username=addslashes($username);
说明:stringaddslashes(string$str)返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)。举例:用户在name中输入'or1=1#,其中#是sql中的注释,#会过滤sql中的where校验等,而or1=1恒真,就会造成返回所有用户列表。
(3)mysql_escape_string();原理和(2)差不多;
总结:
2、使用函数addSlashes()(在预定义字符之前添加反斜杠)
3、使用mysql_escape_string()(在SQL语句特殊字符前添加反斜杠)