SQL注入的攻击与防御

    SQL注入和XSS的相似之处在于,其都是因为data和code没分离开所引起的安全问题,这里有两个利用条件,一个是数据用户能控制,一个是数据和程序的代码进行的拼接。在这里把知道的内容总结补充一下。

目录



盲注

Boolean-Based型

构造简单的条件语句,通过返回页面的内容是否产生变化,来判断SQL语句是否得到了执行。

Time-Based型

通过条件语句无法看出异常,因此用benchmark,if-sleep函数,或者构造大联合查询表,来通过延时的状况,判断出注入语句是否执行成功,属于一种边信道攻击。

报错注入

在有错误信息回显的页面中,通常使用floor,ExtractValue,UpdateXml三个函数引起报错,在其中加入我们要查询的内容获取数据。除此之外,对应不同MYSQL版本还有其余的函数可用,可以在网络上搜索一下。

宽字节注入

在之前的反思中有提到过,再复制粘贴一下= =
由于character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当,导致的同样的数据在不同层面的不同解析,使得敏感字符逃离转义。

多语句

和XSS之前提到的输出中防御方法类似,变量数据没放在引号中,导致多语句执行。

利用

1.读写文件
需要数据库用户有读写系统相应文件或目录的权限,读文件一般用LOAD_FILE(),写文件可以用INTO DUMPFILE 和INTO OUTFILE,但是out和dump的区别在于dump适用于二进制文件,比如dll、so文件之类的,而outfile适用于文本文件。

2.命令执行
MYSQL下可以使用MOF和UDF进行执行命令,具体操作可以在网上搜索比较详细的内容,其余数据库比如MSSQL和ORACLE,根据环境条件,可以使用存储过程进行命令执行。

防御手段

类型检查

对邮箱,日期,时间,数字类型数据进行格式检查。但是如果应用在点的需求是需要一个字符串,就不能依赖于这个方法。

使用安全的编码函数

对用户输入的数据进行严格的过滤和编码,可参考各类安全编码函数。

使用预编译绑定变量

通常来说,预编译可以解决几乎所有SQL注入问题,但是某些情况下预编译,比如PHP下的PDO在某些条件下,也不一定会起到完全防御的效果。具体我还没研究透,就不放在这里了,感兴趣的朋友们可以自己搜索下相关文章。

最小权限原则

从数据库自身的角度来说,应当使用最小权限原则,避免Web应用直接使用root、dbowner等高权限账户直连数据库,Web应用使用的数据库账户,不应该有创建自定义函数、操作本地文件的权限。

使用存储过程

使用安全的存储过程可以在某种程度上抵御SQL注入,效果和预编译语句类似,区别在于存储过程要先将SQL语句定义在数据库中。但是,存储过程中也可能会存在注入问题,因此要尽量避免在存储过程中使用动态sql语句,如果无法避免,还是只能回归到过滤和编码上来。





今天除了看SQL之外还有其他几种注入攻击。但基本都是违背了数据与代码分离原则,由于payload被带入代码中引起的问题。
如XML注入,代码注入,命令注入,CRLF注入等。具体就不在这里总结了


发表评论 暂无评论

*