不乱于心,不困于情。
不畏将来,不念过往。如此,安好。

文件上传漏洞和一句话木马

最近一直在研究关于文件上传的绕过,有感而发,所以写了这样一篇帖子,专门介绍关于文件上传的绕过。

环境:upload-libs(搭建方法网上一堆,这里就不在多嘴了)

由于我直接将系统做成了ubuntu,所以风格和windows可能不太像,见谅。另外,此帖与网上教程不同的是,这里会一步一步的带着你们做代码审计,非常适合新手看。

一、一句话木马

原理

可以说,世界上所有的漏洞都是由于开发人员的粗心而导致的。对于外人来说,这些听着觉得不可能,一个程序怎么会有漏洞呢?程序不都是规规矩矩的按照代码执行么?

对,没问题,但正是因为这种规矩,导致了很多问题的产生,举个例子来说吧。

如下,是一个很简单的c语言代码:

#include
#include
int main(){
     system(“ls”);
     return 0;
}

 

这段代码执行了一个很简单的指令,就是显示当前目录下的文件。

然而我们应该思考这样一个问题:

假如说,system函数中的参数是用户提交上去的,会发生什么事情呢?

答案显而易见。用户可以利用这个函数随意在我们的机器上执行命令,建后门,当肉鸡,挖矿……是非常恐怖的。

然而,在实际情况中,这样的事情是经常发生的。就比如,有一些网站会有上传文件的地方。我们远程控制其运行,之后在执行类似于system一样的函数,最终就成功读取到了服务器上的文件。

当然了,我们不可能直接上传一个c语言程序上去,因为你无法远程控制其执行。因此,最为方便的是写一个脚本,不需要编译,直接就可以运行的那种。想到了么?答案很明显了吧。

当然就是我们的php脚本啦。不光c语言有system函数,php怎么会没有呢?因此,只要你写一个类似于上面的代码,然后远程去执行,是不是就顶如获得了系统的权限?即使不能修改文件,看一看你服务器里面有什么,不也是值得的么?

因此,我们学到了一个新东西:一句话木马。

我在刚接触渗透的时候对这些完全是一脸蒙蔽。一句话木马是什么?为什么一句话木马上传到服务器上面就可以获得shell???等等等等,对这类问题很是不解。直到后来,学了一些php以后才明白,原理其实很简单。

先来理解什么叫一句话。

因为服务器有时候会对上传的东西做限制,因此,你需要写的代码特别短才可以传到服务器上面。久而久之,这个习惯就保留了下来,所以叫一句话。

接着理解木马。

木马就是可以进行非法控制别人机器的非法程序。

很好,能看到这里还不乱,说明你还是很有潜力学渗透的。我们继续往下看。

写法

先来看一个简单的。

eval($_GET['wzc']);?>
先来看看原理。
首先,在php中,eval函数是可以将字符串当作命令的。我们可以将一个代码放到字符串中,然后放到eval函数中执行。
其次就是$_GET[‘wzc’]。
这个在php中被称作是超全局变量,会将用户提交的参数当作字符串存放在这个变量中。比如我设置的wzc变量,我们就可以将参数提交到这个变量里,然后执行。
多说无益,看操作。
首先,我先新建一个文本,将代码放入,然后以php保存。我这里是test.php
然后,将文件上传到服务器中。我这里就不展示上传的过程了,直接来到使用这个环节。
由于这是个php脚本,我们可以直接访问服务器上传之后的路径。如图,我们访问成功。我这里报错了,是因为没有提交参数的关系。
我们想获得shell,直接提交system加上命令即可。
很好,成功读取到此目录下的文件。我们可以看看当前的路径是什么。
图片
如图,我们获得了shell,接下来想干什么都可以。
这种木马比较好用,直接提交get参数即可,这里就不再赘述了。除此之外,还有post马,assert马,绕过马,等等多种多样的形式,原理都八九不离十,自己研究就行了。
二. 防御上传
你有你的张良计,我有我的过墙梯。我们能上传文件上去,服务器自然就有防御的手段。
因此,我们需要不断的去学会怎么去绕过,才可以与服务器进行对抗。uplod-libs就是一个很好的靶场,我们可以通过不断的审计代码,从而不断的提高技术。
这里举个例子吧。
比如,我们可以设置检查,仅仅允许png结尾的文件传到服务器。这样就算一种防御手段,但也不是万能的,比如可以用图片马之类的进行上传。
口说无凭,我们靶场见。
三.开始做题
第一关分析
图片
直接就是一个上传页面。我们先点击提示。
图片
这个是什么意思,一会儿解释。
图片
代码很简单。开始分析。
file变量里面存放的是上传的文件信息。首先第一个判断要判断文件是否为空,如果是空的话,会提示选择上传的文件。
变量allow_ext,根据后面的字符,可以看出,是不同的图片类型。
第二个变量ext_name,我们可以看到这样的操作:
file.lastIndexOf(“.”)会返回符号‘.’的出现位置。比如,出现在第一位,就会返回数字1。
File.substring()会返回字符串的对应数字后半部分。
因此,我们可以发现,整体结果是返回最后的文件后缀,也就是php。
紧接着,第三个判断,会将上一步的文件后缀拼接一个‘|’字符,然后判断在allow_ext字符串中出现的位置,从而与-1进行对比,将非规定类型的文件排除在外。
很好,代码分析清楚以后,我们接下来想想怎么绕过。
绕过
根据提示,为前端验证。在这里我们可以动动手脚。
要知道,对数据的验证有前端验证和服务器端验证。还记得为什么当年dnf为什么明明是网游,但是外挂满天飞么?原因就是因为数据存储在本地,简直就是随便改。
同理,我们可以修改本地数据,进行绕过即可。
按f12,查看源码。
可以看到在后面有一个return checkfile()。这个就是进行检测的函数。我们尝试删除。
我们在尝试删除。
测试,发现成功。
  
好了,关于文件上传的基础就先讲这么多吧。后面的关卡网上有很多方法,这里就不一一罗列了。

转自:黑白之道

赞(0) 打赏
未经允许不得转载:seo优化_前端开发_渗透技术 » 文件上传漏洞和一句话木马

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏