第一关
尝试把webshell传入到服务器,发现服务器对文件后缀名进行过滤。
查看页面源代码:
发现采用前端js过滤,可以直接采用firefox浏览器关闭js绕过js过滤:
js关闭后直接上传php文件,发现上传成功
第二关
尝试上传php文件,发现同样对其进行过滤
查看页面源代码未发现相关js过滤,尝试把webshell后缀名改为png格式上传,发现可以上传
尝试通过burp截获数据,将文件名改回PHP文件
尝试访问上传的webshell访问成功。
第三关
尝试第二关的方法,发现存在文件后缀黑名单
尝试直接在图片里面嵌入webshell代码,在cmd中执行 copy 1.jpg/b+2.php 3.jpg,将3.jpg上传,尝试使用中国菜刀连接,连接成功
同时我们可以尝试绕过黑名单,同样使用burp拦截后修改后缀名为php3成功绕过
实际上,除了后缀为.php的文件会被当成php文件解析, 还有phtml php3 php4 php5之类的后缀也会
第四关
尝试使用第三关的方法,发现可行
此关过滤了大部分文件危险文件名,采用%00截断失败,尝试采用.htaccess
文件来绕过
一般后端的黑名单不会过滤把.htaccess后缀写进去,那么我们可以先上传一个.htaccess文件上去,提前设置好让它把.jpg文件当做php文件来解析,这样后续只需要上传.jpg文件就可以了。
.htaccess文件的内容如下:
AddType application/x-httpd-php .jpg
这个指令代表着.jpg文件会当做php文件来解析。
很多windows操作系统是禁止将文件名设置为空的,但是我们可以用cmd命令来实现。首先新建一个名为1.txt的文件,然后输入上述代码。接着在该文件夹下打开cmd窗口,输入:
ren 1.txt .htaccess
把一句话木马转为png格式直接上传可用
第五关
使用第三关方法可行
采用.htaccess
文件绕过发现文件无法上传
查看网页源代码
发现删除了文件末尾的.且进行了首尾去空,尝试使用burp拦截修改数据为webshell.php. .发现成功绕过
第六关
第三关方法可行
使用第五关的方法尝试上传,发现上传成功但文件名被修改
疑似删除了PHP后缀,尝试使用双写绕过在使用多种双写方法后失败pphpp,phpphp等等
查看页面源代码发现无大小写转换,采用大小写绕过成功
第七关
使用图片上传木马可行
查看网页源代码
发现不存在空格过滤,使用burp尝试在.php后面加入空格,发现文件上传成功,查看上传文件是否生效,发现页面空白,无法生效。联合文件包含漏洞使用可以访问或者使用菜刀连接。
http://192.168.79.152/upload-master/include.php?file=upload/202302081401109951.php%20
第八关
使用图片上传木马可行,方法参考第三关。
查看网页源代码
发现未对.进行处理,使用burp在末尾加上.变成php.尝试上传,上传成功,尝试使用成功
第九关
直接查看源码,发现未对data进行处理
可以使用::$DATA字段进行绕过,原理为在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,这里我们使用的是Linux就不做演示。
第十关
可以采用图片码绕过,查看源代码发现与第五关相同,使用php. .的方法绕过可行,详情参照第五关
第十一关
查看源代码发现将黑名单文件名后缀进行了删除
考虑采用双写绕过使用.phphpp失败,文件后缀变为hpp,采用pphphp可以绕过,使用正常
第十二关
查看源代码,发现使用白名单过滤
直接使用图片码,详情参考第三关
第十三关
与十二关同理采用图片码绕过
第十四关
图片码!!!这关要注意它采用了幻数认证,如果失败抓包查看幻数是否符合条件。
第十五关
上传我们制作好的图片码,这里建议直接用空白图片加shell.php去生成新图片,新生成的图片可以直接上传不用做修改
第十六关
与第十五关相同
第十七关
第十八关
条件竞争,使用burp不断上传,使用python不断访问
python代码
import requests
url="http://192.168.79.152/upload-master/upload/shell.php"
while True:
web_result=requests.get(url)
if web_result.status_code == 200:
print("Success")
break
else:
print("Failed")
PHP代码
<?php
$fp=fopen('webshell.php','w');
fwrite($fp,'<?php phpinfo(); ?>');
fclose($fp);
?>
当python成功访问到shell.php时就会生成一个webshell.php的永久文件
上传后使用BurpSuite截包,按Ctrl+I发送至Intruder,设置Payload type为Null payloads,Payload Options设置为Continue indefinitely,不断上传该文件,随后运行脚本不断访问该文件。
python超过了访问限制G了,建议直接修改源代码,否则看脸。我们这里将源代码修改为移动后检查前等待3S钟
在burp上传的同时使用python访问直到出现
这个时候去靶场查看看到webshell.php文件就表示成功了
访问正常
第十九关
查看源代码发现这关有点问题,在保存文件路径时缺少'/'导致上传文件后文件不保存在upload下面,我们修改下源代码添加上'/'
同时我们发现了他这里实例化了一个MyUpload对象,去里面查看一下他到底执行了什么操作。
里面可以看到他允许上传的文件类型
我们主要看一下这个move函数,发现调用move时文件路径也存在同样的问题,我们一并对其进行修改
修改完成后尝试上传正常文件便可以在upload下面查看到该文件了。
这题根据代码审计发现并未对文件内容进行审核,也未进行二次渲染,直接使用图片码即可