《SQL注入攻击与防御》之攻击

重点看了攻击方面的内容,防御没怎么看,我觉得在攻击方面的知识没有消化理解的话,可能防御类的知识也会比较糊涂,决定过一段时间,自己实践过sql攻击之后,有了一些理解,再来学习防御,会有收获。

计划:去ichunqiu学习学习sqlmap的使用,之前简单学习过,这次得找个站练练手,至少成功实践一次

什么是SQL注入

理解web应用的工作原理

  • Web应用是一种使用Web浏览器并通过Internet或内部网络访问的程序。它同时还是一种使用浏览器所支持语言(HTML,JavaScript,Java)编写的计算机软件程序,借助不同的web浏览器来呈现应用程序的可执行文件
  • 基本的数据库驱动的动态web应用通常包含一个后台数据库和很多包含服务器端脚本的web页面,这些脚本则是由可从数据库(数据库的选择依不同的交互而定)中提取特定信息的编程语言编写而成的
  • 基本的数据库驱动的动态web应用通常包含三层:表示层(Web浏览器或呈现引擎)、逻辑层(c#,ASP,.Net,PHP,JSP等)和存储层(例如SQL Server,MySQL,Oracle等数据库)。Web浏览器向中间层(逻辑层)发送请求,中间层通过查询,更新数据库(存储层)来响应该请求。

理解SQL注入

  • SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中,之后再将这些参数传递后台的SQL服务器加以解析并执行的攻击
  • SQL注入的主要方式是直接将代码插入到参数中,这些参数会被值入SQL命令中加以执行
  • 攻击者能够修改SQL语句时,该进程将与执行命令的组件(数据库服务器,应用服务器或者web服务器)拥有相同的权限,该权限通常级别很高

理解SQL注入的产生过程

  • 如果web应用开发人员无法确保在将从web表单,cookie,输入参数等收到的值传递给SQL查询(该查询在数据库服务器上执行)之前已经对其进行过验证,通常就会出现SQL注入漏洞
  • 如果攻击者能够控制发送给SQL查询的输入,并且能操纵该输入将其解析为代码而非数据,那么攻击者就可能有能力在后台数据库上执行该代码
  • 如果应用开发人员无法彻底理解与他们交互的基础数据库或者无法完全理解并意识到所开发代码潜在的安全问题,那么他们编写的应用通常是不安全的,并且容易受到sql注入攻击

SQL注入测试

寻找sql注入

  • 寻找sql注入漏洞存在三个关键点
    • 识别web应用接收的数据输入
    • 修改输入值以包含危险的字符串
    • 检测服务器返回的异常
  • 使用web代理角色扮演工具有助于绕过客户端限制,完全控制发送给服务器的请求,此外,它们还能提高服务器响应的可见度,提供更多检测到细小漏洞的机会
  • 包含数据库错误或http错误代码的服务器响应通常能降低识别sql注入漏洞的难度,不过,sql盲注是一种即使应用不返回明显错误也能利用漏洞的技术

确认sql注入

  • 想要确认一个sql注入漏洞并进一步加以利用,需要构造一条能注入sql代码的请求以便应用程序创建一条语法正确的sql语句,之后由数据库服务器执行该语句且不返回任何错误
  • 创建语法正确的语句时,可以通过注入注释终止该语句,并注释掉剩余的查询。对于这种情况,通常可以毫无约束的连接任意sql代码(假设后台数据库支持执行多条语句),进而提供执行攻击的能力
  • 有时,应用程序对注入操作没有回复任何可见的信息,这时可以通过向来自数据库的回复引入延迟来确认注入,应用服务器将等待数据库回复,我们则可以确认是否存在漏洞,对于这种情况,需要意识到网络和服务器工作负荷可能会对延迟造成轻微干扰

自动发现sql注入

  • 寻找sql注入漏洞所涉及的操作可以被适度自动化。当需要测试大型的web站点时,自动技术非常有用,但需要意识到自动发现工具可能无法识别某些存在的漏洞,不能完全依赖自动化的工具
  • 有多款商业工具可以对web站点的完整安全性进行评估,还可以进行sql注入漏洞测试

利用sql注入

理解常见的漏洞利用技术

  • select语句中经常出现sql注入漏洞,但不会修改数据。sql注入还会出现在修改数据的语句(insert,update,delete)中,虽然可使用相同的技术,但此时应仔细思考技术对数据库有可能会产生的影响,而对于select语句,则应尽可能使用sql注入,如果不能利用select语句,在攻击期间还可以使用其他的一些技术以减少修改所带来的危害程度
  • 在本地安装一个与用于测试注入语法的数据库完全相同的数据库会非常有用
  • 如果后台数据库和应用架构支持多条语句相连,那么利用漏洞会变得相当容易

识别数据库

  • 在一个成功的攻击中,第一步始终会包含远程数据库的精确跟踪
  • 最直接的方法是强迫远程应用返回一条能揭示数据库服务器技术的消息(通常是一条错误消息)
  • 如果那样做不行,可注入一条只能工作在特定数据库服务器上的查询

使用UINON语句提取数据

  • 要想成功的向现有查询添加数据,就必须保证他们的列数和数据类型均匹配
  • 所有数据类型均接受NULL值,GROUP BY是寻找要注入的准确列数的最快方法
  • 如果远程web应用只返回第一行,那么可通过添加一个永假条件来移除原来的行,然后一次一行的提取想要的行

使用条件语句

  • 使用条件语句,攻击者的每次请求可以提取一个数据位
  • 根据所提取值得不同,可以选择引入延迟,产生错误或强迫应用程序返回一个不同的HTML页面
  • 每种技术都有最适合使用的场景。给予延迟的技术速度虽慢但非常灵活,基于内容的技术相比于错误的技术则会留下更少的痕迹

枚举数据库模式

  • 遵循一种分级的方法,首先枚举数据库,然后是每个数据库的表,之后是每个表的列,最后是每一列的数据
  • 如果远程数据库很大,就不需要提取整个数据库,快速浏览一下表名通常就足以确定想要的数据的位置

注入INSERT查询

  • 如果要在INSERT、UPDATE或者DELETE查询中利用SQL注入漏洞,就必须小心处理,以避免出现垃圾数据填充数据库或者大量修改or删除数据等副作用
  • 安全注入的办法包括:修改INSERTorUPDATE查询以更新一个可以在应用程序的其他地方看到的值;或者修改INSERT、UPDATE、DELETE查询使之在整体上执行失败,但可以返回数据或在结果上产生明显差别,比如时间上的延迟或不同的错误消息。

提升权限

  • 所有主流数据库服务器一直以来都深受权限提升漏洞之苦。我们正在攻击的数据库服务器很可能未升级至最新的安全更新程序
  • 对于其他情况,可以尝试暴力破解管理员账户,例如在SQL Server上使用OPENROWSET

窃取哈希口令

  • 如果拥有管理员权限,请不要错过获取哈希口令的机会。人们都倾向于重用口令,这些哈希可能成为进入整个“新世界”的钥匙

带外通信

  • 如果无法使用前面的方法提取数据,可尝试建立一种完全不同的通道
  • 可能的选项包括email(SMTP)、HTTP、DNS、文件系统或针对特定数据库的连接

移动设备上的sql注入

  • 很多移动设备和嵌入式设备使用本地SQL数据库来存储或缓存信息
  • 虽然在访问方式上存在差异,但在适当的条件下,这些移动应用程序也存在可利用的SQL注入漏洞,就像任何Web应用程序一样

自动利用sql注入

  • 本章分析的大多数攻击都需要发送大量请求以达到目的
  • 幸运的是,有几种工具可以辅助实现自动攻击
  • 这些工具提供了很多不同的攻击模式和选项,从远程数据库服务器跟踪到提取它所包含的数据