五、RCE
1.RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交"意想不到"的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
2.理解
由于程序中预留了执行代码或者命令的接口,并且提供了给用户使用的界面,导致被黑客利用, 控制服务器。
如果在一些场景中需要有一些让用户执行系统命令的功能,但是后台的代码中又没有对用户的输入做安全措施,就像我们的sql注入一样,我们可以利用代码的纰漏拼接更多的语句到后台并被执行,就会造成远程系统命令执行漏洞,导致我们的操作系统沦陷!
同样的如果后台代码使用了危险的函数,又没有对用户的输入做严格的过滤,导致用户输入的代码被带入到后端并且执行了,这个时候就会造成远程代码执行漏洞!
3.危险函数
代码执行漏洞函数:
eval() 将字符串当作php代码执行
assert() 将字符串当作php代码执行
preg_replace() 将字符串正则匹配后替换
call_user_func() 回调函数
array_map() 回调函数
命令执行漏洞函数:
system() 将字符串当作os命令执行
exec() 将字符串当作os命令执行,但只输出命令执行的最后一行,约等于没有回显
shell_exec() 将字符串当作os命令执行
passthru() 将字符串当作os命令执行
popen() 能过执行os命令,相当于把命令执行结果输出到一个文件内
``单引号
4.防护措施
1.尽量不要使用eval等危险函数的使用,如果要是使用则要进行严格的过滤
2.preg_replace()函数放弃使用/e修饰符
3.尽量减少危险函数的使用,并在php.ini配置文件中disable_functions中禁用disable_functions=system,assert
4.参数值尽量用引号包裹,并在拼接前调用addslashes() 进行转义
六、文件包含漏洞
1.File Inclusion(文件包含漏洞)概述
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个"意想不到"的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击者更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
2.防护措施
1.在设计上尽量不要将文件包含函数对应的文件交给前端进行选择和操作
2.过滤掉各种 ../../ http:// https:// 字段
3.配置php.ini配置文件时注意这几个参数:
allow_url_fopen = off
allow_url_fopen 是 PHP 中的一个配置选项,它决定了 PHP 是否能够通过 URL(而非本地文件路 径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen() 和 file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这 些函数可以用来 读取 或 写入 远程文件。而当该配置项被设置为 Off(关闭)时,这些函数只能 用于操作本地文件!目前,allow_url_fopen选项在每一个PHP版本中都是默认开启的!
Allow_url_include = off
allow_url_include 是 PHP 的一个配置指令,与 allow_url_fopen 类似,但 allow_url_include 配置专门针对 PHP 的 include、include_once、 require 及 require_once 语句。当 allow_url_include 被设置为 On 时,PHP 允许通过 URL 的形式,从远程服务器 包含和执行 PHP 文件
magic_quotes_gpc = on
当magic_quotes_gpc = On时,输入数据中含单引号(')、双引号(")、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线。这些转义是必须的
4.通过白名单策略,仅允许包含运行指定的文件,其他都禁止!
七、不安全的文件下载
1.概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
2.原理
跟文件包含漏洞相似,只不过这次我们是下载的地方出现问题了,还是因为没有对传入的文件名称进行过滤和限制,导致我们可以随意下载对方服务器上的敏感文件,造成信息泄露!
3.防护措施
3.1对传入的文件名进行严格的过滤和筛查!
3.2对文件下载的目录进行严格的控制!
八、不安全的文件上传
1.概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击者可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
2.client check
这里是一个上传图片的上传点,我们先尝试上传一个一句话木马,然后发现上传不了,他给我们通过js弹了一个框出来,那这个时候我们就猜测,这里可能是通过前端进行限制的,我们查看前端代码之后发现果然是这样!我们前面就讲过前端的限制是没用的,它只能起到辅助作用,我们这里直接通过开发者工具简单的修改前端代码就实现了绕过!
3.MIME type
$_FILES()
如果后端采用这个方法来对传入的文件扩展名进行获取的话,那前端会将文件类型包含在http请求中,content-type,我们直接采用抓包修改的方法即可对其进行绕过,所以在文件上传时这样做是及其不安全的!
4.Getimagessize
Getimagessize()这个函数是通过将文件读取为十六进制的数据,然后通过前几位来对这个文件进行判断是否为图片,那我们是不是就可以伪造一个文件,让他的十六进制数前几位符合要求,但后面是我们的一些恶意代码,这样就达成了我们的攻击目的!
这个时候该怎么构造一个这样的文件呢,最简单的就是通过Windows来实现,在命令行中输入 copy /b a.png(一个正常的png图片) + b.php(一段包含恶意代码文件) c.png 这样我们就可以得到一个带有恶意代码的图片文件,比如木马图片!
然后这个时候我们去访问这个图片其实是不能够执行里面的恶意代码的,这个时候就需要和文件包含漏洞进行相结合来使用了,我们上传了图片木马之后,从又文件包含漏洞的地方去包含一下这个文件,include()函数就会从上到下去执行这个文件,并且它的特性是从头到尾进行读取,中间报错也不会停止,这样就能达到我们执行恶意代码的目的了!!!
5.防护措施
1.不要再前端使用JS实施上传限制策略
2.通过服务端对文件进行限制:比如文件的大小,扩展名,路径,文件类型,文件完整性;
2.1进行多条件组合检查:比如文件
2.2对上传的文件在服务器上存储时进行重命名(合理的重命名)
2.3对服务器端上传的文件目录路径进行限制,比如设置为只读,限制执行文件所带来的危害
要多做几层有效措施,增加容错率!