如何防御黑客Web攻击?7000字干货讲透网络安全

如何防御黑客Web攻击?7000字干货讲透网络安全缩略图

作者:高杨

曾就职于绿盟科技和互联网金融公司,具备甲乙双方的安全经验,并获得国际注册信息安全专家的认证。

——文章摘自联想超级课

正式开始WEB安全的课程内容,主要分三个部分:

✔ 了解主流的Web攻击方法

✔ 了解各类攻击的原理和利用方式

✔ 了解攻击对应的防护方法

一、SQL注入

SQL注入是注入的一种。什么是注入?就是把用户输入的数据当做程序去执行。

SQL注入,就是说把用户输入的数据当作SQL语句去执行。假如把用户输入的数据当作HTML数据的话,那就是HTML注入。假如说把用户输入的数据当作Script去执行的话,那就是Script的注入。

这里重点介绍一下SQL注入,它也是现在危害最严重的一种安全问题。

要成功地执行一次SQL注入有两个必要条件:

第一,是用户能够自己控制输入;

第二,用户的输入必须得被拼接之后直接扔给数据库去执行。

来看几个例子。我在这里把SQL注入分为三种:

第一种是报错型SQL注入,第二种是盲注,第三种是时间型盲注。

时间型盲注其实也是一种盲注,为什么把它区分开了?因为它现在比较主流,也是危害比较大的一种注入方式。

案例1:报错型SQL注入

链接:

http://www.anquan.us/static/bugs/wooyun-2016-0214076.html

如何防御黑客Web攻击?7000字干货讲透网络安全

这是乌云之前的数据,漏洞时间是2016年。这个网站对于学习WEB漏洞是很有用的。

本案例中,在执行SQL语句时,页面返回了一个报错信息,攻击者通过自己去构造AND后边这个payload,将用户名和密码查询出来。

如何防御黑客Web攻击?7000字干货讲透网络安全

这个方括号括起来的就是Admin用户名,后边应该是被加密后的密码,然后就可以登录到数据后台。

如何防御黑客Web攻击?7000字干货讲透网络安全

这就是报错型SQL注入。所有的信息都在报错页面里。

案例2:时间型盲注

链接:

http://www.anquan.us/static/bugs/wooyun-2016-0188597.html

它也是盲注的一种,首先我先来解释下什么叫盲注

不像报错型会有一个报错页面,盲注不会有任何返回。假如你这次试一次成功了,它就直接返回数据,如果失败了,它就什么都不返回了。这就是一种盲注。

时间型盲注是什么呢?就是它判断是不是成功,是依赖返回的时间长短,我们看这个例子。

它写了一个python脚本,验证这是不是SQL注入问题。首先它找到注入点是car(id)字段,直接来看它的payload。它执行了两个for循环,然后核心点是在这个地方。

如何防御黑客Web攻击?7000字干货讲透网络安全

上边就是post body它的参数。上边这一个是完整的request请求,然后它再用python构造这个参数。

如何防御黑客Web攻击?7000字干货讲透网络安全

这个是它核心的payload。来看一下这个payload意思是什么。

如何防御黑客Web攻击?7000字干货讲透网络安全

首先,它在mysql执行了一下user()这个函数,想查出当前执行的用户是什么。然后把它转换成ascii码,然后跟这个payload相比较。这个Payload是所有的字母数字和几个特殊字符。它就是在遍历。x是什么?是1到24。它就去比较,user的第一个字母是不是在Payload里面?如果在,就会sleep5秒钟再返回,这就是sleep型的SQL注入。如果说不是,那它直接就过去了,速度就很快。

假如说我们这几个以 root为权限起的,当payload为r的时候,它就会sleep 5秒钟,这就是时间型的盲注。这就可以证明是存在SQL注入问题的,因为你已经通过注入的方式找到了用户是哪个用户。

现在大部分人在进行SQL注入的时候都会使用工具,比方说最著名的就是Sqlmap。其实乌云的很多案例都是用Sqlmap跑的,时间型的盲注也可以通过Sqlmap去跑出来。刚才看的第2个案例是他自己写的Payload,用sqlmap也有很大概率能跑出来的。

SQL注入解决办法有三个方面

1、进不来

就是控制用户的输入,比如说预编译,是现在比较推荐的一种方式。就是把要执行的SQL语句先编译好,用户的输入就只能作为参数提交给后端。这种原理从根本上解决SQL注入的问题。

但是,比如SQL注入的注入点是在Select * from [表名] like,like后边的部分,如果它注入的地方在这,那么通过预编译的方式是不能够解决的。对于这种问题,就需要通过对这个用户输入的数据类型去做一个控制,去做一个判断。

比如说用户注入的这个地方应该是一个数字,那么我们就应该判断一下他输入的是不是一个数字。如果说不是,那就有可能是在进行SQL注入;如果它是一个字符串,他要注入,首先肯定得闭合单双引号。这种情况下,就加一个函数addslashes(),这函数可以把用户输的单双引号自动加一个反斜杠,让它不能够闭合我们的单双引号。通过这样的方式来做一个防护。

控制用户输入的这一部分,其实在程序层面也就是网站层面怎么做防护。还有一个比较简单的——上一个Waf,它也可以有很好的效果。

但是Waf针对时间型的SQL注入防护效果不是特别好,误报很多,所以不是特别好上。这也是为什么我说时间型是比较主流的一种注入方式,单独把它拉出来这也是一种原因。

2、拿不走

一次成功的SQL注入,想拿走用户的数据,比如说脱库,需要很多很多次的访问。就像刚才看的时间型盲注的案例,仅仅是为了查出user这一个用户,就得进行好几百次查询。所以说如果能够限制一些敏感接口的请求次数,也是可以起到很好的防护效果的。

3、看不懂

对于数据库中一些敏感字样的存储应该加密存储,一方面不仅仅是为了解决SQL注入的问题,就是说即使黑客拿走,他也看不明白;另外一方面,它也是一个合规要求 。

二、XSS

XSS是跨站脚本攻击,英文名是Cross Site Script,简写应该是CSS,但是与我们常用的CSS重名了,所以就把它改成XSS。

XSS本质也是一种注入。刚才说过,注入就是把用户输入变成程序去执行。像XSS就是说用户的输入有可能变成Html、变到Scrip中,或者说变到Css中。所以从这个角度讲,它其实是注入的一种情况。

但它为什么又是一种单独的漏洞,而不叫注入呢?因为它和注入是有本质区别的。XSS是针对客户端的攻击,Payload在提交给服务器端,服务器端再返回给客户端的时候,它才会发起真正的攻击。而SQL注入是针对服务器的攻击,这个是两者的本质区别

在测试XSS的时候,用的比较多的是Hackbar、Burpsuite。

XSS一般最大的危害就是盗取Cookie,但其实XSS能做的远远不止如此,它是可以劫持用户的浏览器的。

首先,XSS可以操作你的网页,在网站中去做任何操作。去获取网站中任何一个对象、任何一个节点。比方说它可以操作你的网站去给它点投票,但是它不能操作其它网站,比如说某度有XSS漏洞,然后你让它去获取某东网站上的信息,它是获取不到的,这是有同源策略限制的。

XSS普遍分为三种类型:

第一种:反射型

案例链接:

https://blog.csdn.net/qq_36869808/article/details/82726751

反射型是非常常见的一种漏洞。反射型的XSS是什么?

黑客会构造一个payload诱骗受害者去点击,点击完后,比如黑客payload盗取Cookie,它就会把受害者的Cookie盗取走。

本案例中,测试的人用的是DVWA,是一个漏洞测试的一个环境,开源的,大家有兴趣的话可以自己去下载,然后去做几个实验,这里边包含的实验也挺多,CSRF、 SQL注入、SQL注入盲注、XSS(dom)、XSS(反射)等等。

如何防御黑客Web攻击?7000字干货讲透网络安全

从这个案例先解释下反射XSS。URL中参数是name=admin,admin应该是输入到输入框里,点Submit,就出现了当前界面,它是把用户的输入(admin字符串)完完整整的展示在前端页面。

如何防御黑客Web攻击?7000字干货讲透网络安全

通过查看源码可以看到,Admin出现在什么位置,出现在什么标签里,然后我们就可以通过自己去构造用户的输入,来达到标签闭合的效果。同时再插入一个Script的标签,里边就是我们自己的XSS payload,比方说alert(xss)。这也就是说会弹出一个框,作用就是证明XSS是存在的。

一般来讲,测试XSS只要能弹出框,它就一定是有问题的。这就是反射XSS的一个原理。

反射XSS就是攻击者得诱骗受害者去点击某一个链接才可以,如果要去诱骗很多人,就得给每一个人发链接,这样就很麻烦。

第二种:存储型

接上文,假如说有一个存储型的XSS,这就非常简单了。

存储型的XSS是什么意思?就是说这个漏洞会把用户的输入存储到某一个地方。比较常见的存到库里边。当其他的受害者在访问这个元素的时候,就会自动触发XSS。

对攻击者而言,只需要进行一次攻击,就可以攻击到很多个受害者,这是一种非常严重的安全问题。

案例链接:

http://www.anquan.us/static/bugs/wooyun-2015-0156436.html

如何防御黑客Web攻击?7000字干货讲透网络安全

这个页面就是存在存储型XSS的一个页面。可以看到很多参数健值、参数数值。这些数值是可以自己写进去的。我们把上边这个payload 填进去,它们会把这个payload存储到数据库中,下一次比方说有其他人在看这张数据表的时候,因为他得把数据库中的信息展示到前端,这个时候XSS就会生效了,就弹出了一个1,这就是一个存储型的XSS。

脑洞一下,比方说上面这个例子是一个后台。如果在前端发现一个这种前台,把XSS插到数据库中了,管理员一看数据,就可能把他的Cookie盗走了,你就能获取管理员的权限。这是一种用法。

第三种:DOM型

DOM型XSS比较特殊,不论是反射型XSS、还是存储型XSS,当服务器给前端返回的时候,XSS就是固定的,它在什么地方就在什么地方。而DOM型会改变,它在前端是动态地形成XSS的。

案例链接:

http://www.anquan.us/static/bugs/wooyun-2012-016041.html

首先了解一下什么叫DOM。在网页源代码中,可以看到很多的br、P标签,这其实就是DOM。

如何防御黑客Web攻击?7000字干货讲透网络安全

本案例中,这是一个div标签,有id=”a”的情况,有几个值是xxx, script脚本里边通过innerHTML函数往里边去写yyyyy,它就会替换我们的xxx。

如何防御黑客Web攻击?7000字干货讲透网络安全

假如写的不是yyyyy,而是一个payload,它就会把这个payload替换到上边,它就会插进去一张图片。Img src=1是最常用的另外一种测试XSS一种payload,它的特点就是非常短,这是所有测试XSS里边最短的一个payload。

短在XSS测试里边非常有用,因为很多防护机制都限制输入的字符长度。这时候如果能证明这么短的也能插进去,就说明就是存在XSS漏洞的。

XSS的防护办法

1、给cookie打上httponly标签

这是现在很多人给出的解决方案,这个方法治标不治本。打上httponly,别人XSS就不能够获取Cookie了,但是XSS是可以做浏览器劫持的, 它可以拥有这个域名的所有访问权限。打httponly是防护不了这个问题的。

2、输入检查

浏览器劫持这种情况就可以靠这种方式防护,比方说,像刚才SQL注入一样,上WAF这种方式。

3、输出检查

就是用户的数据在前端输出的时候做一些转码,比方说,PHP里边有一些函数,htmlentities()和Htmlspecialchars(),就可以把XSS payload里边的尖括号进行转码,让它不能够闭合标签。通过这样的方式来解决一些XSS的问题。

4、针对不同的地方使用不同的方式来进行防御

① 如果在html标签里,要使用htmlencode去防护;

②如果在scirpt标签里,要用javascirptencode 等,

更多不同方式见下图:

如何防御黑客Web攻击?7000字干货讲透网络安全

5、在过滤富文本时,在标签的选择上、在事件的选择上,应该使用白名单,避免使用黑名单。

不仅仅是这个地方,在解决安全问题涉及到黑白名单的情况下,尽可能都使用白名单。白名单安全性更高,黑名单有可能存在绕过的问题。

三、CSRF

CSRF又叫客户端请求伪造漏洞。它的原理主要是没有验证请求的来源。本质就是用户的所有参数都是可以被攻击者猜到的。

案例链接:

http://www.anquan.us/static/bugs/wooyun-2016-0182693.html

如何防御黑客Web攻击?7000字干货讲透网络安全

首先来说一下黑客会怎么攻击。假如A页面存在一个CSRF漏洞,黑客就可以构造一个表单,插入到B网站的页面,诱骗你点击。

假如你正打开着A页面,同时又被诱骗点击了B页面,那么就会在A上去执行一个操作,比方说删帖子,或关注某个人,具体要看CSRF问题出在哪。

如何防御黑客Web攻击?7000字干货讲透网络安全

这个Form表单是白帽子构造的,参数只有一个就是uld。他提交一个参数,作用是关注某一人。可以看到referer这是空的,通过点击B页面的这个表单提交的,而且成功了。说明A页面里没有验证这个referer,直接执行了。

这里有个问题。我要关注某个人,必须要带着我的Cookie,必须要确认是我,但为什么他成功了呢?因为点击B页面时,A页面是同时打开的,当我在B页面发起请求时,是自动带着我的Cookie的。

CSRF和XSS有什么区别?

1、XSS不可以跨域,因为有同源策略,但CSRF可以。

上面的例子中,A网站和B网站,XSS是完全不可以获取这些信息的,但是CSRF可以。

2、CSRF不可以获得用户cookie,只能替用户做一些操作,比方说删帖关注等等,但是XSS可以。它可以完全获取网站的所有权限、任何元素、任何参数,去做任何事情。

如何防护CSRF?

1、加Token

这是现在大部分主流解决方案。是一种非常好的解决方案,可以有效的防护CSRF的问题。每次请求时,必须得带一个Token才能够请求成功。

但会有个问题,如果请求量是双十一这种海量量级时,Token服务器压力会非常大,有可能会成为单点故障的点,对业务造成不稳定的因素。所以对于这种场景,更适合使用验证refer的方式解决。

2、验证refer

能够解决一定程度上CSRF的问题,它的速度比Token快很多。所以在选择解决方案时,要切合实际场景给出最优方案。大多数情况下,使用Token的方式都没有问题。

3、加验证码

4、变量加密

这个解决方案针对的是CSRF的本质(用户的所有参数都是可以被攻击者猜到的)。假如所有参数都是随机的,也可以增加使用CSRF一个难度。

四、上传漏洞

上传点主要来源两方面:一是编辑器的上传点,比如fckeditor这样的编辑器。网络搜一下有什么漏洞,直接利用就可以。还有一种是程序员自己编写的上传点,这种上传点黑客怎么发现CSRF漏洞?

① 修改图片后缀

改成php、jsp之类,看看能不能上传成功。如果能成功,再试试上传一个大马或者小马,如果能直接上传,就直接getshell拿到服务器权限了。

② 解析漏洞

如果没成功,就需要用到解析漏洞。apache和IIS都有解析漏洞。利用解析漏洞,我们可以绕过上传的一些防护措施。

③ 00截断

比如“1.php%00.jpg”,别人看是个jpg,但在服务器看来,它是%00把后面截断了,其实是“1.php”,是执行。

上传漏洞是危害非常大的一种漏洞。黑客可以直接上传一些大马或者小马,然后getshell,获取服务器权限。

案例链接:

http://www.anquan.us/static/bugs/wooyun-2016-0193084.html

如何防御黑客Web攻击?7000字干货讲透网络安全

这是链家某重要站点任意文件上传导致getshell。具体是在微信-编辑个人信息-上传用户头像。

如何防御黑客Web攻击?7000字干货讲透网络安全

这个白帽子在上传头像的地方直接上传了一个image.jsp文件,看内容应该是一个小马,而且成功了,然后他就拿到shell了。这种文件上传危害很大。

如何防御黑客Web攻击?7000字干货讲透网络安全

这是网上随意截的一张图,基本和文件上传相关的,都能看到getshell关键字,危害非常大。

如何防御上传漏洞?

1、设计安全的文件上传系统

① 文件上传的目录应设置为不可执行

不可执行的意思,就是不能够被apache解析,不能在web目录下、或者说在这个目录下不能解析。

② 判断文件类型

这是为了增加攻击成本,不能随便上传asp、jsp,必须得是图片格式的。

③ 增加随机数改写文件名和文件路径

文件路径最好不要是默认,最重要是,不要把这个路径再返回给前端,攻击者不知道文件上传到哪里,也不知道上传的文件名称是什么,这样就可以增加他利用的难度。

④ 单独设置文件服务器域名

把文件上传到另外的一个单独域名上去,通过同源策略,也可以起到一定的防护作用。

2、上传检测

用户每次上传都去检测他有没有上传木马。

3、主机HIDS

也可以一定程度上检测webshell,但对于加密的webshell作用有限。

五、webshell

文件上传是获取webshell的一种方式,但是远不止于此。比如SQL注入、命令执行、代码执行、 文件包含漏洞、 后台功能等等,都可以获取webshell。

1、SQL注入

SQL注入的条件和利用:

如何防御黑客Web攻击?7000字干货讲透网络安全

如何防护SQL注入?三种方式:

① 数据库连接账号不要使用root权限,权限太高了;

② 关闭PHP报错模式。报错信息里面往往包含很多有用信息,比方说文件路径、 网站路径等。

③ Mysql账户没有权限向网站目录写文件。

2、命令执行

命令执行的条件和利用:

如何防御黑客Web攻击?7000字干货讲透网络安全

如何防护命令执行?

直接修复命令执行漏洞就可以解决。

3、代码执行

代码执行就是用户的输入被当做代码去执行了。它可以做很多事情,比方说就像命令执行一样,直接写一个getshell,或者直接运行一个小马程序。因为是可执行代码,直接运行就可以。

这种直接运行小马程序,在硬盘上是没有落地文件的,通过HIDS是检查不到的,隐蔽性非常高。

代码执行的条件和利用:

如何防御黑客Web攻击?7000字干货讲透网络安全

如何防护代码执行?

修复代码执行漏洞。

4、文件包含

PHP有个特性,就是它可以包含某一个文件,去执行去解析它。

有本地文件包含。比如SQL注入的话,不应该往web目录下写文件,这时可以写到其它地方,比如/tmp下,利用文件包含漏洞把那个文件包含过来,就可以直接利用了。

远程文件包含更厉害,它直接包含一个远端黑客上的大马,直接getshell了。

文件包含的条件、利用和防御:

如何防御黑客Web攻击?7000字干货讲透网络安全

5、后台相关功能

条件、利用和防御:

如何防御黑客Web攻击?7000字干货讲透网络安全

通用的webshell检测方式,共5种:

1、检测菜刀的连接

攻击者在上传马的时候,一般都是先上传一个小马,再上传一个大马。上完小马之后,往往会用菜刀去连接,这样可以去检测菜刀的这种通信格式,来发现有没有木马的存在。

2、威胁情报

通过webshell反弹的一些网站域名有没有恶意IP、恶意域名这种方式,来发现是否有webshell存在。

3、找到网页孤岛

一般来讲,Webshell这种网页不会与其它网页有任何交互,其它网页也不会有任何指向指到这个webshell页面,所以webshell页面就是一个孤岛。如果我们通过大数据的方式找到这孤岛,就有很大概率能够找到webshell。

4、找出含有关键字的网页

大马会有一些关键字。比如它都会执行系统命令,系统命令就是一个网页关键字。如果说网页中有这个关键字,它就有可能是一个webshell。这个方式可以通过webids去检测。

5、HIDS

见前文所述。

六、网页挂马

网页挂马其实不是一个漏洞,它是一个结果。挂了马之后黑客可以做什么呢?

比方说挂黑链,赌博、博彩这种链接;或者上传一个有病毒的木马,去感染其它访问这个网页的正常用户;还有就是挖矿,也是挂马的一个现象。

挂马的方式,除了webshell部分说的那些方式外,还会有比如ftp配置不当、rsync弱口令。

案例:ftp配置不当

链接:

http://www.anquan.us/static/bugs/wooyun-2013-039766.html

利用ftp配置不当和rsync弱口令挂马成功的先决条件,就是ftp或rsync所在的服务器、和web服务器是同一台服务器。这时假如ftp密码泄露了,那么攻击者就直接可以利用ftp把木马上传到web服务器里,直接getshell了。

rsync服务器同理。

以上就是今天我课程全部内容,如果想看视频回放,还可以微信关注【联想商用服务】,回复【超级课】三个字查看课程。

发表评论

邮箱地址不会被公开。 必填项已用*标注