讲解web攻防实战 web攻防学是什么语言( 四 )


碰到要操作的数据库的代码,一定要慎重,小心使得万年船,多找几个人多来几次 code review,将问题都暴露出来,而且要善于利用工具,操作数据库相关的代码属于机密,没事不要去各种论坛晒自家站点的 SQL 语句,万一被人盯上了呢?
命令行注入
命令行注入漏洞,指的是攻击者能够通过 HTTP 请求直接侵入主机,执行攻击者预设的 shell 命令,听起来好像匪夷所思,这往往是 Web 开发者最容易忽视但是却是最危险的一个漏洞之一,看一个实例:
假如现在需要实现一个需求:用户提交一些内容到服务器,然后在服务器执行一些系统命令去产出一个结果返回给用户,接口的部分实现如下:
1 2 3 4 5// 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo const exec = require(\\’mz/child_process\\’).exec; let params = {/* 用户输入的参数 */}; exec(`git clone ${params.repo} /some/path`);
这段代码确实能够满足业务需求,正常的用户也确实能从指定的 git repo 上下载到想要的代码,可是和 SQL 注入一样,这段代码在恶意攻击者眼中,简直就是香饽饽 。
如果 params.repo 传入的是https://github.com/zoumiaojiang/zoumiaojiang.github.io.git 当然没问题了 。可是如果 params.repo 传入的是https://github.com/xx/xx.git && rm -rf /* && 恰好你的服务是用 root 权限起的就惨了 。
具体恶意攻击者能用命令行注入干什么也像 SQL 注入一样,手法是千变万化的,比如「反弹 shell 注入」等,但原理都是一样的,我们绝对有能力防止命令行注入发生 。防止命令行注入需要做到以下几件事情:
后端对前端提交内容需要完全选择不相信,并且对其进行规则限制(比如正则表达式) 。在调用系统命令前对所有传入参数进行命令行参数转义过滤 。不要直接拼接命令语句,借助一些工具做拼接、转义预处理,例如 Node.js 的 shell-escape npm 包 。
还是前面的例子,我们可以做到如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22const exec = require(\\’mz/child_process\\’).exec; // 借助 shell-escape npm 包解决参数转义过滤问题 const shellescape = require(\\’shell-escape\\’); let params = {/* 用户输入的参数 */}; // 先过滤一下参数,让参数符合预期 if (!/正确的表达式/.test(params.repo)) { return; } let cmd = shellescape([ \\’git\\’, \\’clone\\’, params.repo, \\’/some/path\\’ ]); // cmd 的值: git clone \\’https://github.com/xx/xx.git && rm -rf / &&\\’ /some/path // 这样就不会被注入成功了 。exec(cmd);
无论是在何种后端语言环境中,凡是涉及到代码调用系统 shell 命令的时候都一定要谨慎 。
DDoS 攻击
DDoS 又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用,这个攻击应该不能算是安全问题,这应该算是一个另类的存在,因为这种攻击根本就是耍流氓的存在,「伤敌一千,自损八百」的行为 。出于保护 Web App 不受攻击的攻防角度,还是介绍一下 DDoS 攻击吧,毕竟也是挺常见的 。
DDoS 攻击可以理解为:「你开了一家店,隔壁家点看不惯,就雇了一大堆黑社会人员进你店里干坐着,也不消费,其他客人也进不来,导致你营业惨淡」 。为啥说 DDoS 是个「伤敌一千,自损八百」的行为呢?毕竟隔壁店还是花了不少钱雇黑社会但是啥也没得到不是?DDoS 攻击的目的基本上就以下几个:
深仇大恨,就是要干死你敲诈你,不给钱就干你忽悠你,不买我防火墙服务就会有“人”继续干你
也许你的站点遭受过 DDoS 攻击,具体什么原因怎么解读见仁见智 。DDos 攻击从层次上可分为网络层攻击与应用层攻击,从攻击手法上可分为快型流量攻击与慢型流量攻击,但其原理都是造成资源过载,导致服务不可用 。
网络层 DDoS
网络层 DDos 攻击包括 SYN Flood、ACK Flood、UDP Flood、ICMP Flood 等 。
SYN Flood 攻击
SYN flood 攻击主要利用了 TCP 三次握手过程中的 Bug,我们都知道 TCP 三次握手过程是要建立连接的双方发送 SYN,SYN + ACK,ACK 数据包,而当攻击方随意构造源 IP 去发送 SYN 包时,服务器返回的 SYN + ACK 就不能得到应答(因为 IP 是随意构造的),此时服务器就会尝试重新发送,并且会有至少 30s 的等待时间,导致资源饱和服务不可用,此攻击属于慢性 DDoS 攻击 。
ACK Flood 攻击
ACK Flood 攻击是在 TCP 连接建立之后,所有的数据传输 TCP 报文都是带有 ACK 标志位的,主机在接收到一个带有 ACK 标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包 。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应 RST 包告诉对方此端口不存在 。