SQL注入防护

SQL 注入是指攻击者通过恶意的SQL命令插入到 Web 表单的输入域或页面请求的查询字符串中,井且插入的恶意的SQL命令会导致原有的 SQL 语句作用发生改变,从而达到欺骗服务器执行恶意的 SQL 命令的一种攻击方式。

因为它可实现任意数据查询,如查询管理员的密码、用户高价值数据等 严重时会发生“脱库”的高危行为 更有甚者,如果数据库开启了写权限,攻击者可利用数据库的写功能及特定函数,实现木马自动部署、系统提权等后续攻击。

攻击原理:网站数据库查询功能基本流程。
		用户---发送请求--- 》服务器
				服务器拼接sql语句------》数据库查询
		 用户《------------------------------------------查询结果返还给用户

SQL注入的本质:是恶意攻击者将 SQL 代码插入或添加到程序的参数中,而程序并没有对传人的参数进行正确处理,导致参数中的数据被当做代码来执行,并最终将执行结果返回给攻击者。重点需关注的是业务流程中查询功能中的拼接语句,修改当前查询语句的结构,从而获得额外的信息或执行内容。

SQL注人的产生原因通常有以下几点:

1 )参数处理问题:
	对用户参数进行了错误的类型处理。
	转义字符处理环节产生遗漏或可被绕过。
2)服务配置问题:
不安全的数据库配置。
Web应用对错误的处理方式不当。
	不当的类型处理。
	不安全的数据库配置。
	不合理的查询集处理。
	不当的错误处理。
	转义字符处理不当。	
	多个提交处理不当

避免sql注入:
1)采用黑名单、白名单等形式对用户提交的信息进行过滤,一旦发现用户参数中出现敏感的词或者内容,则将其删除,使得执行失败。
2)采用参数化查询方式,强制用户输入的数据为参数,从而避免数据库查询语句被攻击者恶意构造

Sql注入分类

回显
盲注

典型:

1 )判断Web系统使用的脚本语言,发现注入点,并确定是否存在SQL注入漏洞。
2)判断Web系统的数据库类型。
3)判断数据库中表及相应字段的结构。
4)构造注入语句,得到表中数据内容。
5)查找网站管理员后台,用得到的管理员账号和密码登录。
6)结合其他漏洞,上传Webshell并持续连接。
7)进一步提权,得到服务器的系统权限。

回显:寻找注入点,注入测试。
盲注:长度,+二分法ascii码猜测结果。select asscii(user(),1,1)>>110根据返回结果进行测试。手工注入耗时长,可用sqlmap。

防护:包括参数过滤和预编译处理
Sql注入漏洞防护流程
在这里插入图片描述
常见防护手段及绕过方式:

  1. 参数类型检测。严格检查参数类型
    绕过方式:能使用某些技巧令数据库报错,如 is_numeric 支持 六进制与十进制 ,提交 0x0l 时它也会进行查询,intval虽然默认只支持十进制数字,但依然会有问题,比如提交 id= -1 会出错 这些细微的差异可以帮助攻击者识别后台的过滤函数。
    参数长度检测。限制参数长度,从而使得无法注入。可以先用短语句进行测试,如or 1=1,在有的情况下,可以利用注释符对语句进行变更,
    ( ” SELECT COUNT ( * ) F ROM L ogin WHERE UserName =’{ 0 }’ AND Pas sword= ’ { l }’”, User Name , pas sword ));
    可采用:SELECT COUNT( * ) FROM L o g i n WHERE UserName= ’ test ’ ” -’ AND Pa ssword=’{l}’”;
    由于注释符的存在, 语句实际执行的内容变为
    SELECT COUNT( * ) FROM L ogin WHERE UserName= ’ test’,可见,只要 test 用户存在,数据库就会返回正确,则可利用当前用户进行登录,也就不需要当前用户的正确密码
  2. 危险参数过滤和绕过
    1)黑名单过滤:将一些可能用于注入的敏感字符写入黑名单中,如 (单引号)、union select 等,也可能使用正 表达式做过滤,但黑名单可能会有疏漏
    2)白名单过滤 例如,用数据库中的已知值校对,通常对参数结果进行合法性校验,符合白名单的数据方可显示
    参数转义 :对变量默认进行 ddsalashes (在预定义字符前添加反斜杠),使得 SQL注入语句构造失败

绕过:
黑名单过滤绕过:1,采用大小写变种,启动大小写转换就没作用了,2,使用sql注释,注释代替空格,避免过滤。嵌套,过滤后重新组成新语句;用+实现对危险字符的拆分;利用系统注释符截断;替换可能的危险字符。
过滤绕过:

1.尖括号过滤绕过:ord<substring<user<>, 1,1>>111 ;可用替代为
between和greatest。between min and max。和
greatest<ascii<mid<user<> ,1,1> , 140>=1402.逗号过滤绕过:逗号使语句失效。from x for y 绕过逗号,还可利
 用数学运算函数在子查询中报错,比如select exp (~( 
 select*from(select user() )a)),利用exp()超出范围报错,但查
 询会返回结果。
 3.空格过滤绕过:/**/代替空格符号。

参数化查询:通过固定用户输入的参数作为直接的查询内容。使得攻击者无法修改。

在对抗 SQL 注入攻击方面,有效的措施是过滤 /转义,或者将参数进行预编译或进行参数化查询 在实际 Web 系统中,推荐从潜在的 SQL 注入漏洞点对数据的限制进行入手,尽可能限制数据类型(如强制转义为数字),限制提交查询的字符类型;再者对各类注入中的特殊字符及敏感函数进行严格过滤 这种方法适合中小站点,开发成本小且易实现。
对大型站点,推荐利用预编译方法或参数化查询,可有效避免 SQL 注人漏洞的产生防护方法设计方面,需综合关注添加防护的代价与业务开展的正常与否,切不可过度防御,以免对业务产生影响 漏洞修复适度即可,防护于段没有绝对的好与坏。

©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页