定义:攻击者通过把恶意sql命令插入到web表单的输入域或页面请求的查询字符串中,并且插入的恶意sql命令会导致原有sql语句作用发生改变,从而达到欺骗服务器执行恶意sql命令的攻击。
原因:
用户能够提交非法内容
sqlmap get型注入流程
寻找注入点:
基于方法是参数后面加单引号,观察其返回页面的内容。由于添加单引号会导致sql语句执行错误,因此,若存在SQL注入漏洞,当前页面会报错,或者出现查询内容不显示的情况
1=1 1=2测试
现有三个连接 1 为正常连接 2 为 1=1 3 为1=2
页面没有变化:说明后台针对此查询点的过滤比较严格,是否存在注入点还需要后续测试
页面中少了部分内容:如访问前两个链接正常,访问第三个有明显的内容缺失,则基本上可以确认存在漏洞
回显错误:如果访问第三个链接后出现数据库报错,可以判断当前查询点存在注入
跳转到默认界面:如果访问第一个链接正常,第二第三直接跳转到首页或者默认页面,那么可能是后台有验证逻辑,或者是有在线防护系统或软件提供保护,可以尝试防护工具绕过的思路
直接关闭链接:如果在访问上述第二第三个连接时出现访问失败,通常为防火工具直接开启在线阻断,后续可利用编码、换行等方式尝试绕过(比较难成功)
mysql5.0后内置information_schema库
schemata表:存储MySQL中各种数据库的相关信息,schemata_name极为数据库的名字
tables表:存储所有表的名字,其中table_name表示的表的名称;table_schema字段显示该表所属的数据库名称
cloumns表:存储字段名,其中table_schema表示表所属的数据库名称;table_name百四所属的表的名称;column_name表示字段名
若前端页面设置了下拉选择表单,可以使用burpsuite进行抓包
防护:
若查询提交页面和查询结果显示页面不是同一个,也没有执行302跳转,这要可以防止一般的sqlmap注入,因为sqlmap在注入过程中,无法咋i查询提交页面上获取查询的结果,没有了反馈也就没办法需进一步注入。
采用pdo技术,划清代码和数据的界限,能有效防御SQL注入,同时只有返回的查询结果数量为1才会输出成功,防止脱裤。
参数过滤:数据类型限制和危险字符处理。尽可能限制用户可提交的参数类型和长度
预编译处理:参数化查询,是指数据库服务器在数据库完成sql指令的编译后,才套用参数运行,因此就算参数中含有特殊的参数,也不会被数据库运行。
参数长度检测及绕过:
检测思路:
sql注入语句一般比较长,因此对提交的内容长度进行限制,大部分注入便无法执行
在php中,strlen函数检查输入长度
特定环境下,利用sql语句注释实现对查询语句语义变更,增加的字符长度很少,却会造成严重危害如万能密码
危险参数过滤及绕过:
防护思路:常见的危险参数过滤方法包括关键字、内置函数、敏感字符过滤
过滤方法:
黑名单过滤:将一些可能用于注入的敏感字符写入黑名单中,如单引号union select等,也可以使用正则表达式做过滤
白名单过滤:用数据库中的已知值校对,通常对参数结果进行合法性检验,符合白名单的数据方可显示
参数转义:对变量默认进行addsalashes或myslq_real_escape_string(在预定字符前添加反斜杠),试得注入语句构造失败
由于白名单方式要求输出参数有者非常明显的特点,因此使用的业务场景非常有限 总体来说,防护手段以黑名单+参数转义为主
绕过方式:
黑名单:绕过黑名单的思路:将关键字或特定的符号进行不同形式的转换,从而实现绕过过滤器的目的。
大小写绕过
使用sql注释:使用注释代替空格/**/ %0b
双写
使用+号实现危险函数拆分
替换可能的危险字符 like替换= in替换=