教师：现在我们来讨论一下如何防止这些漏洞｡
第一件事是, 许多漏洞的存在是因为它们提供的功能｡
例如, 我们遇到的文件上传问题,
它允许用户上传任何文件扩展名､ 任何文件类型,
这不应该发生, 不应该有一种方法让用户上传他们想要的任何文件｡
也许如果你想让他们上传一张图片,
那么确保他们上传的图片, 检查文件类型｡
如果你希望他们上传一首歌, 一个MP#文件,
确保它是一个媒体文件, 而不是一个PHP或可执行代码｡
通常, 您不应允许用户上载任何可执行文件｡
过滤器的可以用来检查是否, 检查扩展名,
并确保文件正在上传的是JPEG或什么｡
但这不是一个好方法,
最好的方法是检查文件类型, 并确保文件类型是图片,
或者是一个媒体文件, 而不是检查扩展名, 因为这也可以绕过｡
我们研究的第二类漏洞是代码执行漏洞｡
在这些攻击中, 我们能够在目标计算机上运行任何我们想要的代码｡
同样, 应该避免使用此功能,
您应该避免允许用户在您的服务器上运行任何类型的代码｡
尽量避免使用所有这些函数（如var
pass through）,
以及所有这些允许用户在服务器上运行操作系统代码的函数｡
如果您必须使用类似的东西,
那么请确保在执行它之前分析输入｡
例如, 在示例中, 我们看到代码执行ping操作,
它将ping我们在文本框中输入的任何内容｡
所以我在这里放/$textbox只是为了表明这是我们放在文本框中的输入｡
这是程序实际上的样子, 如果它看起来太复杂了,
就忘了它吧, 我们只是在这里讨论概念｡
所以我们要在这里讨论这个问题｡
比如说, 我们先输入一个普通IP,
然后输入分号, 最后输入一个我们想要执行的命令, 例如ls
-la｡
这样做的问题是Web应用程序习惯于采用它的方式,
复制它, 并在这里运行它｡
当您执行此命令时, 它将首先执行ping,
然后执行ls -la, 这是我们需要的命令｡
你需要做的是, 例如, 如果你不得不这样做,
我建议你不要使用这些函数｡
如果你必须使用这样一个函数, 那么你应该做的是检查输入是否是你所期望的,
比如, 你期望的是一个IP地址, 而不是其他的, 所以你可以使用正则表达式来确保, 现在我不打算谈论正则表达式或正则表达式是什么, 正则表达式基本上是一个规则,
它会确保输入看起来像下面的格式｡
所以它需要一个数字, 数字,
数字, 数字, 数字, 数字, 数字, 数字, 数字, 如果我输入其他的数字,
那么网络应用程序应该会拒绝它｡
你也可以确保没有分号,
没有空格, 所以所有的东西都是作为一个东西来的,
然后执行它｡
同样, 这是一种使其更安全的方法,
但最好的事情只是避免这些功能｡
第三种类型的漏洞是文件包含,
我们分析了两种类型｡
本地文件包含允许我们包含系统上的任何文件,
然后读取文件, 这将导致文件泄漏漏洞, 然后您将能够读取服务器上的任何文件, 然后我们查看了远程文件包含,
这是非常危险的, 它允许我们包含来自任何Web服务器的任何文件, 因此我们能够包含PHP外壳, 然后从目标计算机获得连接｡
要防止这些, 首先,
确保您防止了远程文件包含｡
因此, 为了以防万一, 人们不能包含来自服务器外部的文件,
您可以通过禁用allow_url_fopen和allow_url-include来实现这一点, 方法与我们使用PHP
ini启用它的方法相同｡
如果我们转到Metasploitable,
我会很快给大家演示一下, 如果我们使用sudo
nano, 它是文本编辑器/etc/PHP/cgi/php.
ini,
我们使用的相同文件,
这是PHP设置文件｡
如果你打开这个文件,
现在我按Ctrl + W, 查找allow_url.
您需要确保将allow_url_fopen设置为Off,
并将allow_url_include也设置为Off.
按Ctrl + X + Y, 然后按Enter键,
这会为您保存它｡
防止这些漏洞的另一种方法是使用静态文件包含,
而不是使用我们已经看到的动态文件包含, 您可以硬编码要包含在代码中的文件, 而不是使用GET或POST获取它们｡
例如, 我们在漏洞示例中看到的例子是,
我们有一个称为页面或索引的页面｡
php的值｡
然后这个指数｡ php接受一个称为page的参数, 然后接受另一个页面,
例如news｡
php的值｡
包括这条新闻｡ php的代码｡
代码是什么样的？
在PHP代码中, 您将看到类似include的内容｡
它的作用是,
我相信, 它的作用是, 它包括了页面参数后面的内容｡
因此代码将动态地获取页面参数之后的任何内容, 并将其包含在当前页面中,
以便将其包含在索引中｡
php页面上｡
这是非常糟糕的,
因为即使不是GET, 有时候人们使用POST,
在POST中你看不到它,
所以它会被发布, 但是你可以使用一个代理, 比如Burp代理, 它看起来像这样,
然后你可以修改它, 让它包含你想要的任何东西,
然后它会显示在页面上｡
我们真正想做的是, 我们不希望用户能够操纵将要包含的内容,
所以如果你想包含一个叫做新闻的页面｡
php中,
只需将其包含在this中,
而不给用户更改它的能力｡
我知道你会把你的代码编程成这样,
但是用户, 我们知道, 我们已经看到了用户是如何玩这个的, 让它包含他们想要的任何东西｡
最好的方法就是让它包含页面｡
php,
所以你的代码没有使用任何变量｡
它是硬编码的, 它可能会使你的代码更长,
但它更安全｡