《白帽子讲web安全》读书笔记系列5:注入攻击与防御

1、SQL注入

注入攻击的本质:把用户输入的数据当做代码执行

条件1:用户可以控制输入;

条件2:代码拼接了用户输入的数据

 

最简单的恶意输入:beijing';drop table orderstable--

 

如果web服务器开启了错误回显,将利于攻击者获取敏感信息,为其提供便利。

 

盲注:服务器关闭回显情况下完成的注入攻击

最常见的盲注验证方法是:构造简单的条件语句,根据返回是否发生变化来判断sql语句是否得到执行

比如将入参设置为:1 and 1=1 和 1 and 1=2

 

Timing Attack

盲注的高级技巧,通过类似于benchmark()函数结合database()、system_user()、current_user()、last_insert_id()等函数,通过返回时间长短,破解出敏感信息。

如果当前数据库用户具有写权限,攻击者还可以将信息写入本地磁盘文件,比如写入web目录中,然后下载这些文件;此外,通过dump文件的方法,还可以写入一个webshell。

 

2、数据库攻击技巧

常见的攻击技巧:

1)利用union select来分别确认表名、列名是否存在;

2)通过判断字符的范围猜解出username和password等,工具:sqlmap.py;

3)利用读写文件的技巧,读取敏感信息(如/etc/passwd等),写入到本地文件,或者写入到自行创建的表中;写入文件的技巧经常被用于导出一个webshell,为进一步攻击做铺垫。

4)写入文件操作的区别:into dumpfile,into outfile,前者适用于二进制文件,将目标写入一行;后者更适用于文本文件。

 

命令执行

在mysql中,除了通过导出webshell间接执行命令外,还可以利用“用户自定义函数”的技巧,及UDF(user-defined functions) 来执行命令;尤其当运行mysql进程的用户为root时,将可能直接获得root权限。

mysql5之后的版本可通过lib_mysqludf_sys提供的几个函数执行系统命令,主要是sys_eval()和sys_exec();注入工具sqlmap已经集成了此功能。

SQL Server,可直接使用存储过程xp_cmdshell执行系统命令

Oracle,如果服务器同时还要java环境,也可能造成命令执行。

建议1:建立数据库账户时应该遵循“最小权限原则”,避免给Web应用使用数据库的管理员权限。

建议2:避免使用root启动数据库

 

攻击存储过程

在SQL Server和Oracle中存在大量内置存储过程,将为注入攻击者提供便利;同时,存储过程本身也可能存在注入漏洞。

 

编码问题

如果在数据流转过程中存在字符转换,某些字符可能丢失,从而受到攻击;

解决办法:统一数据库、操作系统、web应用所使用的字符集,比如统一为utf8;如果确实无法统一字符集,则需要单独实现一个用于过滤或转义的安全函数,在其中需要考虑到字符的可能范围,根据系统所使用不同字符集来限制用户输入数据的字符允许范围,以实现安全过滤。

 

SQL column truncation

Mysql有一个sql_mode选项,当没有开启strict_all_tables时,对于用户插入的超长值则只会提示warning,数据被截断插入,而不是error,这可能导致发生一些“截断”问题,从而可能引起越权访问之类的问题。

比如新建一个admin(55个空格)x的用户,则可能越权访问admin才有权限访问的资源。

 

3、正确的防御SQL注入

1)找到所有的SQL注入漏洞

2)修补这些漏洞

 

1)使用预编译语句:只对用户的输入做一些escape处理是不够的,增加一些过滤字符也不是很好的方案,防御sql注入的最佳方式为使用预编译语句,绑定变量。使用预编译语句,变量用?表示,SQL语句的语义不会发生变化。

2)使用存储过程,使用安全的存储过程可对抗SQL注入,但同时存储过程本身也可能存在注入问题;

3)检查数据类型:integer、时间、日期、邮箱;

4)使用安全的函数:根据数据库厂商的“指导”,使用足够安全的编码函数。

 

总之:

1)为应用分配“最小权限原则”的数据库用户,避免使用root或dbowner等高权限账户;

2)多个应用共用一个数据库,则应该为每个应用分配不同的账户;

3)web应用的数据库账户,不应有创建自定义函数、操作本地文件的权限。

 

4、其他注入攻击

被攻击应用共性:违背了“数据与代码分离”的原则。

XML注入

代码注入

代码注入和命令注入往往都是由一些不安全的函数或方法引起,如eval()、system();Java的脚本引擎、PHP、JSP的动态include都可能导致代码注入;建议禁用危险的函数,PHP/JSP中避免使用动态include,如果一定要用,需要对输入数据进行处理。

CRLF注入

CR \r LF \n \r\n表示换行符

CRLF常用做不同语义直接的分隔符,注入CRLF字符,可能改变原有的语义。

Http Response Splitting 在HTTP头中的CRLF注入,可能导致XSS攻击;某种程度上HTTP Response Splitting的危害比XSS还大,因为它破坏了HTTP协议的完整性。

对抗CRLF只需要处理好\r \n这两个保留字符即可,尤其是那些使用“换行符”作为分隔符的应用。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1.3Web安全的兴起 常见攻击:SQL注入,XSS(跨站脚本攻击) “破坏往往比建设容易”,但凡事都不是绝对的。一般来说,白帽子选择的方法,是克服某种攻击方法,而并非抵御单次的攻击。比如设计一个解决方案,在特定环境下能够抵御所有已知的和未知的SQL Injection问题。假设这个方案的实施周期是3个月,那么执行3个月之后,所有的SQL Injection问题都得到了解决,也就意味着黑客再也无法利用SQL Injection这一可能存在的弱点入侵网站了。如果做到了这一点,那么白帽子们就在SQL Injection的局部对抗中化被动为主动了。 跟机场安全检查进行类比。通过一个安全检查(过滤,净化)的过程,可以梳理未知的人或物,使其变得可信任。被划分出来的具有不同信任级别的区域,我们成为信任域,划分两个不同信任域之间的边界,我们称之为信任边界。 数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的信任域流向高等级的信任域,是需要经过信任边界的安全检查。 安全问题的本质是信任的问题。 一切的安全方案设计的基础,都是建立在信任关系上的。我们必须相信一些东西,必须要有一些最基本的假设,安全方案才能得以建立。 1.5安全的三要素安全的三要素是安全的基本组成元素,分别为机密性(Confidentiality),完整性(Integrity),可用性(Availability)。 机密性要求数据内容不能泄露,加密是实现机密性要求的常见手段。如果不将文件存在抽屉里,而是放在透明的盒子里,那么虽然无法得到这个文件,但是文件的内容将会被泄露。 完整性则要求保护数据内容是完整,没有被篡改的。常见的保证一致性的技术手段是数字签名。 可用性要求保护资源是“随需而得”。 举例来说,假如有100个车位,有一天一个坏人搬了100块大石头将车位全占了,那么停车场无法再提供正常服务。在安全领域中叫做拒绝服务攻击,简称DoS(Denial of Service)。拒绝服务攻击破坏的是安全的可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值