赞
踩
打开靶机地址
是一个上传漏洞的闯关靶场,我们直接从第一关开始
我们先查看提示
因为是在客户端检查,我们直接f12,将源码中检查的函数删除掉
创建一句话木马,并将木马文件上传至服务器
右键图片,选择复制图片链接,使用中国蚁剑连接
成功获取shell,在根目录下找到flag文件
获取flag内容
因flag已获取,后续闯关均以上传webshell成功为闯关目标
先查看提示
在服务端对MIME进行检查,可以通过Burp Suite抓取数据包并修改MIME参数绕过
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
常见的MIME类型:
文件上传 | multipart/from-data |
---|---|
超文本标记语言文本.html | text/html |
xml文档.xml | text/xml |
XHTML文档.xhtml | application/xhtml+xml |
jpg图片格式 | image/jpeg |
RTF文本.rtf | application/rtf |
PDF文档.pdf | application/pdf |
Microsoft Word文件.word | application/msword |
将Content-Type参数修改为:image/png后放包,上传成功
查看提示
不允许上传.asp|.aspx|.php|.jsp格式文件
但是在文件中存在等价扩展名
语言 | 等价扩展名 |
---|---|
asp | asa,cer,cdx |
aspx | ashx,asmx,ascx |
php | php2,php3,php4,phps,phtml |
jsp | jspx,jspf |
我们直接修改webshell的后缀为php2后进行上传,上传成功
查看提示
将大部分扩展名都加入了黑名单,并且查看源码,大小写也无法绕过
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"); $file_name = trim($_FILES['upload_file']['name']); $file_name = deldot($file_name);//删除文件名末尾的点 $file_ext = strrchr($file_name, '.'); $file_ext = strtolower($file_ext); //转换为小写 $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //收尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
但是仔细查看黑名单,发现没有禁止.htaccess后缀文件
.htaccess——超文本入口
.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。
.htaccess文件内容
<FilesMatch "\.jpg"> //如果匹配到.jpg 的文件 就执行该文件
SetHandler application/x-httpd-php //把文件当成php的代码来解析
</FilesMatch>
我们将webshell文件后缀改为jpg后连同.htaccess文件都上传至服务器,使用中国蚁剑链接
提示连接失败,经过查证是由于服务器http服务配置未更改导致,将None改为ALL即可,但是因未拥有权限,无法进行修改,本关卡不涉及提权操作。
我们可以尝试使用在文件后缀名末尾添加点-空格-点的方式绕过
上传成功
尝试用中国蚁剑连接,这里需要注意,因为在Linux系统中,文件名后缀可以带空格,所以实际上webshell文件的后缀是.php.空格
所以我们输入的地址应为
http://b3b730e2-9d3f-473f-a37a-3f50bf5315da.node5.buuoj.cn:81/upload/webshell.php.%20
// %20代表空格
连接成功
查看提示,将.htaccess加入了黑名单
接着查看源码,发现未对后缀名大小写进行检查,将webshell后缀改为.PHP后即可上传成功
查看源码,未对后缀名空格进行去除,在后缀名后加入空格即可绕过
上传成功
查看源码发现没有去除后缀名后加的 . ,将webshell后缀名改为.php.即可绕过
strrchr()函数作用为查找字符串在另一字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符,本用来返回后缀名,如:webshell.php,则会返回.php,但是如果我们在.php后再加入一个 . ,则该函数只会返回 . ,可以轻松绕过检查
上传成功
查看源码发现没有对::DATA进行过滤,所以本关可以采用::DATA绕过
php在window的时候如果文件名+"::DATA"会把::DATA之 后 的 数 据 当 成 文 件 流 处 理 , 不 会 检 测 后 缀 名,且保持::DATA之前的文件名 他的目的就是不检查后缀名。ps:只能是Windows系统,并且只能是php文件
但是由于该关卡部署于Linux系统,故无法使用该方法,该关卡略过
查看源码,发现可以使用点+空格+点的方式绕过检测,和第四关一样
上传成功
查看源码发现并不是禁止黑名单后缀名,而是将黑名单后缀名过滤,可以考虑复写后缀来实现
上传成功
该关卡源码做了白名单限制,只允许上传jpg,png,gif类型文件,但是有个GET请求,可以通过%00绕过
原理是move_uploaded_file()方法遇到%00会截断,但是因为本靶机环境PHP版本大于5.3.4
故无法使用该方法,且该方法还需在PHP.ini中启动magic_quotes_gpc该功能
这关和11差不多,只是把get请求更换为了post请求,同样运用%00截断,但是得在HEX中修改
这关要求我们上传图片马,并运用文件包含漏洞来执行恶意代码
可以看到使用了include函数,后续可以通过该函数执行图片马
首先我们制作图片马,打开cmd终端输入以下命令
copy 777.png/b + webshell.php pass14.png
//777.png为图片的文件名
//webshell.php为木马的文件名
//pass14.png为合成后的图片马的文件名
随后将图片马上传到服务器
随后使用中国蚁剑连接,需要注意连接路径,使用该页面的文件包含漏洞
http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/include.php?file=upload/9320240319002814.jpg
成功连接
查看源码,是通过getimagesize来检查是否为图片,依旧使用上传图片马,然后通过文件包含漏洞执行
这次换成使用exif_imagetype()读取文件的第一个字节并检查后缀名
依旧采用上传图片马的方法通关
此关将上传的图片进行了二次渲染,可能导致一句话木马失效
可以通过上传图片后,再下载回显的图片,对比找出Hex不变的部分,在该位置插入一句话木马,建议使用GIF格式的图片
首先我们上传一个gif图片
将上传后的被二次渲染的gif图片下载下来,并使用图片16进制查看器查看
可以发现这一部分内容是相同的
我们在这之中插入一句话木马
将gif文件再次上传
使用中国蚁剑连接
http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/include.php?file=upload/2100350681.gif
成功连接
这关查看源码后发现,先允许上传任意文件,然后对比白名单检查上传的文件,如果不在白名单内则删除
文件的上传过程为:用户上传文件,服务器获取文件,然后保存临时文件,然后使用移动函数(比如php中的move_uploaded_file() ),才会将文件移动到站点的根目录下面
只要我们在非法文件被删除之前执行该文件,让其在服务器创建一个webshell即可
该原理也被称为文件上传竞争
首先创建一个php文件,该文件用来创建带有一句话木马的文件
将该文件上传,并使用burp suite抓包
设置有效载荷和选项
设置无限执行,且将线程设置大一点
然后编写一个python脚本去一直访问该文件,如果成功则返回ok并停止
import requests
url = "http://a492262b-844e-47b3-b210-7b98189dcf0d.node5.buuoj.cn:81/upload/pass-17.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print('OK')
break
在执行步骤时,本人未成功,因为该站点设置了访问流量限制,访问过多时会失败,所以未继续进行,思路是没问题的
这关作者的代码有失误,文件的上传地址不是upload/而是变成了upload,后面直接接了文件名,这个需要注意
查看源码后发现这关对文件后缀名进行了限制,其他和17关相同,可以通过上传图片马来进行文件上传竞争
这关发现多了个设置保存后的文件名
并且通过源码知道只对用户输入的文件名有黑名单判断,名称保存使用upload-19.php.即可
这一关先查看源码
1.先检查了MIME类型,设置了白名单
2.检查了save_name,如果为空则 f i l e 为 f i l e n a m e ,如果不为空则 file为file_name,如果不为空则 file为filename,如果不为空则file为save_name
3.检查$file是否为数组,如果不为数组的话则以.为分界线划分为数组,例如webshell.php被划为[‘webshell’,'php]数组
4.检查$file数组最后一位,设置了白名单为’jpg’,‘png’,‘gif’
5.文件命名规则为$file数组第一个元素 + ‘.’ + $file[元素个数-1]
根据以上条件我们可以构建一个save_name达成绕过检测及可执行的目的
比如[‘webshell’,‘’,‘jpg’]
在burp suit中抓包,先修改MIME类型,然后修改save_name为数组,并设置元素
绕过所有检测,并且最终命名为upload-20.php + ‘.’ + f i l e [ 里面只有两个元素,虽然下标写到了 2 , 2 − 1 = 1 ] ,但是 file[里面只有两个元素,虽然下标写到了2,2-1=1],但是 file[里面只有两个元素,虽然下标写到了2,2−1=1],但是file[1]没有元素,所以为空,最终文件名为upload-20.php.
使用中国蚁剑连接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。