网络安全(ctf)方向第二篇

文件上传漏洞原理:

1. 文件上传(File Upload)是大部分Web应用都具备的功能,例如用户上传附件、修改头像、分享图片/视频等;

2. 正常的文件一般都是文档,图片,视频等,Web应用收集之后放入后台存储,需要的时间在调出来返回;

3. 如果恶意文件如PHP、ASP等执行文件绕过Web应用,并顺利执行,则相当于黑客直接拿到了WebShell;

4. SQL注入攻击的对象是数据库服务,文件上传漏洞主要攻击Web服务,实际渗透两种相结合,达到对目标的深度控制。

我们可以通过文件上传漏洞,上传恶意程序、软件以获取对程序的控制权。

典型的就是“一句话木马”。

什么是“一句话木马”?

“<?php @eval($_POST['attack']) ?>”

往目标网站上上传一句话木马,然后就可以在本地通过中国菜刀“chopper.exe”即可获取和控制整个网站目录。

@表示后面即使执行错误,也不报错。eval()函数表示括号内的语句字符串什么的全都当做代码来执行。

$_POST['attack']表示从页面中获得attack这个参数值。

入侵条件:

其中,只要攻击者满足三个条件:

(1)木马上传成功且没有被杀毒工具删除;

(2)知道木马的路径在哪;

(3) 上传的木马能正常运行。

常见的一句话木马:

php的一句话木马:<?php @eval($_POST['pass']); ?>

asp的一句话木马:<%eval request ("pass") %>

aspx的一句话木马:<%@ Page language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

我们可以直接将这些语句插入到网站上的某个asp/aspx/php文件上,或者直接创建一个新的文件,在里面写入这些语句,然后把文件上传到网站上即可。

基本原理

首先我们来看一个原始而又简单的php一句话木马:

<?php @eval($_POST['cmd']) ?>

让我们分析一下这句话是如何执行的。

这句话是什么意思呢?

(1)php的代码要写在<?php ?>里面,服务器才能认出来这是php代码,才能去解析。

(2)@符号的意思是不报错,即使执行错误,也不报错。

一个变量没有定义,就被拿去使用了,服务器就提醒Notice!你的xxx变量没有定义。这不就暴露了密码了吗

所以这里加上@

为什么密码是cmd呢?

那就要来理解这句话的意思了。php里面几个超全局变量,$_GET、$_POST就是其中之一。

$_POST['a']这句话的意思就是a这个变量使用POST方法来接收。

注释:传输数据的两种方法,get、post。

post是在消息体存放数据,get是在消息头的url路径里存放数据(例如xxx.php?a=2)

(4)如何理解eval()函数?

eval()把字符串作为php代码执行。

例如:eval("echo 'a' ");其实就等于直接echo 'a' ;再来看看<?php eval($_POST['pw']); ?>

首先,用post方式接受变量pw,比如接收到了:pw=echo 'a',这时代码就变成<?php eval("echo 'a' "); ?>。

连起来意思就是,用pw变量接收字符串“echo 'a' ”,然后将变量pw转换为接受的字符串,然后eval()函数开始执行对应的代码。

也就是说,想要执行什么代码,就把什么代码放进pw变量里,用post传输给一句话木马。

也可以执行cmd命令,要用到exec()函数。

当然前提是:php配置文件php.ini里,关掉安全模式safe_mode = off,然后再看看禁用函数列表disable_functions = proc_open,popen,exec,system,shell_exec,把exec去掉,确保没有exec(有些cms为了方便处理某些功能,会去掉的。)

木马如何才能上传成功?

通常防御者都会对类型、大小进行过滤。另外,若规定是上传的图片,还会对图片进行采集。

即使攻击者修改文件类型,也过不了图片采集那一关。

所以这就需要一张图片来做掩护。

做成隐藏在图片下的木马,linux和windows都有相应的命令,能够让一个文件融合到另一个文件后面,达到隐藏的目的。(图片隐写)

posted @ 2021-04-27 15:01  Profs  阅读(540)  评论(0)    收藏  举报