【深蓝实验室】OWASP Top10之SQL Injection

💡 原文中文,约11100字,阅读约需27分钟。
📝

内容提要

OWASP Top10是全球性安全组织,旨在提高Web应用程序安全性认识。最新OWASP Top10 2021列出了Web应用程序中最常见的10大漏洞,包括注入攻击、权限控制失效、敏感数据暴露等。本文介绍了SQL注入攻击的原理、分类和防御措施,并提供了常见的绕过方法和利用技巧。

🔎

延伸解读

SQL注入在OWASP Top10中的持续高位

文章指出,注入攻击在OWASP Top10 2013、2017和2021三个版本中均排名第一,说明其危害性长期未减。这提醒开发者和安全人员,尽管防御手段不断进步,注入漏洞仍是Web应用中最常见且最危险的风险之一,需要持续关注和投入。

注入点不限于URL参数

除了常见的GET和POST参数,文章还介绍了Cookie、User-Agent、Referer等HTTP头部也可能存在注入点。虽然实战中这些位置较少见,但一旦被利用同样能导致数据库信息泄露。这提示安全测试应覆盖所有用户可控的输入点,而不仅限于表单和URL。

盲注与报错注入的适用场景

当页面没有回显位时,延时注入和布尔盲注可以通过时间延迟或页面状态变化来判断注入结果,但延时注入速度较慢。报错注入则要求有错误信息回显。文章通过SQL-Labs示例展示了这些手法的具体利用方式,帮助读者理解不同场景下的选择依据。

预编译并非绝对安全

文章强调,预编译语句能有效防御SQL注入,但在必须拼接字符串的场景(如动态表名、列名)下,仍需对用户输入进行严格检查。此外,MyBatis中使用${}而非#{}会直接拼接参数,可能导致注入。因此,防御需结合代码审计和输入验证,不能完全依赖预编译。

❓

Q&A

OWASP Top10是什么?2021版有哪些主要变化?

OWASP Top10是开放式Web应用程序安全项目发布的十大Web应用程序安全风险列表,旨在提高对应用程序安全性的认识。2021版相比2017版,注入攻击仍排名第一,但其他漏洞的排序有所调整,例如权限控制失效升至第一,并新增了不安全设计等类别。

SQL注入攻击的原理是什么?

SQL注入是一种攻击方式,攻击者通过在字符串中插入恶意代码,并将该字符串传递到数据库进行分析和执行。主要形式包括直接将代码插入到与SQL命令串联的用户输入变量中,或间接将恶意代码注入到存储的字符串中,当这些字符串随后串连到动态SQL命令时执行。攻击者常用注释标记“--”来终止注入的字符串,使后续文本被忽略。

SQL注入有哪些分类方式?

SQL注入可按参数类型分为数字型注入和字符型注入;按注入位置分为GET注入、POST注入、Cookie注入、User-Agent注入和Referer注入等;按注入手法分为联合查询注入、堆叠注入、延时注入、布尔盲注、报错注入、宽字节注入和二次注入等。

常见的SQL注入手法有哪些?

常见的SQL注入手法包括:联合查询注入(使用union select)、堆叠注入(使用分号执行多条语句)、延时注入(利用sleep函数)、布尔盲注(通过真假条件判断)、报错注入(利用错误信息回显)、宽字节注入(利用编码绕过转义)和二次注入(恶意语句被存储后再次执行)。

如何防御SQL注入攻击?

防御SQL注入的主要措施包括使用预编译语句(如JSP中的PreparedStatement、PHP中的PDO),严格检查用户输入,限制输入类型(如整型),对特殊字符进行转义或编码。在MyBatis中,使用#{}进行预编译,避免使用${}。对于必须拼接的场景,应进行严格的输入验证。

什么是宽字节注入?它是如何绕过转义的?

宽字节注入是利用MySQL在使用GBK等宽字节编码时,将两个字节视为一个汉字,从而绕过addslashes等函数的转义。例如,输入%df%27,其中%df和反斜杠的编码%5c结合成一个汉字,使单引号失去转义,从而闭合语句。常见的宽字节编码包括GBK、GB2312、GB18030、BIG5、Shift_JIS。

什么是二次注入?请举例说明。

二次注入是指攻击者先将包含恶意代码的语句存入数据库,当该数据被再次读取并拼接到新的SQL查询中时,恶意代码被执行。例如,注册用户名为admin'#,密码为123456,登录后修改密码,由于用户名中的#注释了后续语句,实际修改的是admin用户的密码。

🏷️

标签

➡️

继续阅读