var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2010年08月20日

    预防SQL注入(1)

    分类:

    这些漏洞主要公开在两处站点:最主要的在美国政府支持站点Common Vulnerabilities and Exposures(CVE)搜索关键字SQL injection,列出5260SQL注入漏洞;另一个在站点Exploit Database的分栏Web Application Exploits内。

     

    SQL Injection Attacks and Defense(电子版)中对此做了介绍。

    SQL拼接

    http://www.victim.com/products.php?val=100’ OR ‘1’=’1

    构建的查询:SELECT *FROM ProductsTbl WHERE Price < '100.00' OR '1'='1' ORDER BY ProductDescription;

    select * from tbUser where name='admin' or 1=1 --' and password='11'

    SQL中“--”为注释

     

    动态SQL语句

    query = "SELECT * FROM table WHERE field = '" +request.getParameter("input") + "'";

    构建的查询:SELECT * FROM TABLE WHERE FIELD = 'input'

    需要先对input进行验证和编码:

    1.不正确处理转义字符(Escape Characters)

    SQL认为单引号(')内是数据,是代码和数据的分隔符,于是可以在URL或网页/应用程序提交区域输入它以判断是否存在SQL注入漏洞。Oracle中转义字符有空白字符( )、双管道字符(||)、逗号(,)、点号(.)(*/)和双引号(")

    2.不正确处理类型

    数据不应该被引用符号包裹。MySQL有函数LOAD_FILE,这时如果构建查询:SELECT * FROM TABLE WHERE USERID = 1 UNION ALL SELECT LOAD_FILE('/etc/passwd')--,而执行此查询的用户对文件/etc/passwd有权限,这时就会产生漏洞,此外MySQL还有函数SELECT INTO OUTFILE也能。

    3.不正确处理查询集

    攻击者可以操控HTTP请求并且替换用户名、密码等字段。如

    $SQL = "SELECT $_GET["column1"], $_GET["column2"], $_GET["column3"] FROM $_GET["table"]";

    http://www.victim.com/user_details.php?table=users&column1=user&column2=password&column3=Super_priv请求。

    4.不正确错误处理

    出错时显示内部错误,如数据库转储(主要用作数据库备份)和错误代码

    5.不正确多重提交

    白名单验证许可字符输入,黑名单验证恶意字符输入,有时开发人员会忘记验证。如两个表单,每个表单会有各自的验证项,攻击者可以输入http://www.victim.com/form.php?form=form2&param='绕过第一个表单此时开发人员以为无需再在第二个表单验证第一个表单项了。

     

    不安全的数据库配置

    1.微软SQL Server非著名用户saMySQL"root"和匿名用户,Oracle默认用户SYSSYSTEMDBSNMOOUTLN

    2.数据库服务应以非权限用户运行,创建SELECT,INSERT, UPDATE, DELETE, EXECUTE和类似权限用户具有单一和最小化权限。元数据能帮助攻击者知晓是否还有其他数据库或者数据表,如MySQL Server保存在INFORMATION_SCHEMA虚数据库中,它可以通过SHOW DATABASESSHOW TABLES访问;微软SQL Server INFORMATION_SCHEMA 系统数据库(sysobjects, sysindexkeys, sysindexes, syscolumns, systypes) 系统存储过程,SQL Server 2005引入了一些叫"sys.*"的目录(catalog)视图能限制权限用户访问的对象;Oracle提供了不少全局内建视图以访问元数据(ALL_TABLES, ALL_TAB_COLUMNS等等),这些视图都能被当前用户访问。

    分享到:

    历史上的今天:

    驱动UAC 2009年08月20日