主要16、17关
目录
什么是文件上传漏洞:
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
第一关:
关闭js
创建一句话木马,
首先创建一个.php文件,写入一句话木马,进行上传;发现页面弹出:
通过查看网页源码发现有一个checkFile 函数获取了文件名称,并判断了文件类型(白名单)。
该文件并没有在白名单里面,所以被禁止上传。白名单我还不知道怎么绕过。
解决方案:
js是前端页面独有的,可以尝试关闭浏览器的js功能
关闭js功能后发现除上传按钮外其他按钮都不能点(js),再次上传一句话木马文件(我的文件名是web.php)发现成功上传。
不能使用eval---可以使用assert:
?0=assert&1=phpinfo();
第二关:
修改文件类型
再次尝试使用web.php, 提示文件类型不正确;查看源码,没找到checkFile,可能在后端验证;
解决方案:
提示文件类型不正确,尝试一下改文件类型
使用抓包软件,更改web.php的文件类型为image/jpeg
放包后发现上传成功
第三关:
上传web.php,显示不允许上传.....;说明是黑名单限制
解决方案:
上传web.php,发现这一关限制后缀,查看源码发现这一关是黑名单限制,限制.asp、.aspx、.php、.jsp。
尝试修改后缀为:php3,php4,php5,phtml。成功上传
第四关:
查看提示,可以看到这一关使用了更多的黑名单限制,上一关的php3,php4等都被加入了黑名单,所以本关不使用修改后缀绕过。
解决方案:
尝试使用.htaccess绕过。
介绍一下什么是.htaccess:主要的作用:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。可以把php后缀隐藏起来
创建一个.htaccess文件,写入SetHandler application/x-httpd-php(将该目录和子目录的所有文件映射为php文件)
先上传.htaccess文件,因为它可以把任何文件都解析为.php文件,所以我们将web.php修改为web.jpg,再上传web.jpg文件,上传成功,最后访问web.jpg时会自动解析为php文件。
第五关:
查看源码,发现限制了htaccess文件,但是没有大小写限制,因为php没有大小写限制,所以修改大写PHP,成功上传。
第六关:
查看提示,是黑名单限制,
查看源码,发现没有空格过滤,在Windows中,空格在存储时会自动删除
解决方案:
不能在修改文件名后面加空格,也会被删除,所以使用抓包软件进行抓包,然后 在文件名”web.php“后加个空格,成功上传。
第七关:
与第六关相似,查看源码发现这一关没有删除 . 的代码,在Windows中文件存储时会自动删除后缀后面的“.”,同样抓包修改后缀,上传成功
第八关:
与前两关类似,这关少了::$DATA的删除。
当php在windows环境的时候,如果文件名+ “::$DATA" 会 把 "::$DATA" 之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名
所以跟前两关一样的步骤
第九关:
查看提示,这一关使用了白名单限制,
查看源码,它先是将文件后的“.”依次删除后再进行下一步,但是deldot函数在遇到空格时会停住
所以我们将web.php文件后缀添加“. .”的形式绕过同样抓包修改
上传成功
第十关:
查看源码,发现这一关是先获取了文件名称,然后判断文件名里有没有$deny_ext,如果有的话就替换为空
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
解决方案:
尝试使用双写,将文件类型修改为 .pphphphpp 这样在检测到php时会删除php,上传成功。
第十一关:
查看源码,发现本关使用了白名单,如果在白名单内,,会将文件进行重命名:文件目录+随机数+时间
解决方案:
%00截断:文件名%00后的东西会被丢弃(php5.2版本,其他版本不行)
上传机制: 先把文件放到临时文件里,再复制到上传目录。
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以0(即0x00)作为字符串的结尾。 操作系统在识别字符串时,当读取到0字符时,就认为读取到了一个字符串的结束符号。
无论0x00还是%00,最终被解析后都是一个东西:chr(0)(c语言)
chr()是一个函数,这个函数是用来返回参数所对应的字符的,也就是说,参数是一个ASCII码,返回的值是一个字符,类型为string。
那么chr(0)就很好理解了,对照ASCII码表可以知道,ASCII码为0-127的数字,每个数字对应一个字符,而0对应的就是NUT字符(NULL),也就是空字符,而截断的关键就是这个空字符,当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。
使用抓包软件,将路径(upload)后加入demo.php%00 这样它会把%00后的都丢弃
第十二关:
与11关类似,但是不能写%00 ,要将他转换为16进制后写在后面
第十三关:
这一关要上传图片马,提示说只读前两个字节,图片的2进制文件前面两个字节可以判断文件类型
解决方案:
文件包含漏洞(将所有文件都作为php文件执行)
题目给了这个网页提示:
找一张图片,在cmd中使用copy命令将这个图片和web.php整合在一起,重命名为web1.png
D:\>copy 1.png /a + web.php /b web1.png
进入文件包含漏洞网页中,将file内容传递为这个web1.png,可以看到解析成功
第十四关:
这关和十三关都是使用文件包含漏洞。。。一样操作
第十五关:
和前两关一样。
第十六关:
提示说本关重新渲染了图片
主要是这句话,将原图片打散了之后重新生成了一个图片
$im = imagecreatefromgif($target_path);
问题是这个图片的内容都被打散了重新生成吗?
解决方案:
先上传一张图片,然后把这张图片下载下来,然后使用010editor打开,再使用010eritor打开原来准备上传的图片,对比一下有什么地方放没被打散,找到一个比较长的地方插入一句话木马,再次使用文件包含漏洞网页将file的内容传为修改后的图片(插入一句话木马有几率成功。。。。多试几次)gif比较容易成功 (1 次)、jpg与png (N次)
第十七关:
白名单限制,审查代码发现是先上传再删除,虽然很短暂,但是在删除之前还是能访问到。
解决方案:
如果能短暂的访问到这个文件有什么用呢?-可以让这个文件在他的上级目录再生成一个一句话木马,这样子目录的一句话被删除了,上一级目录还在。
file_put_contents()函数就可以在上级目录生成一个文件。
<?php file_put_contents('../web.php','<?php phpinfo() ?>'); ?>
怎样和文件删除去竞争呢,我们必须要在文件被删除前访问到,
使用burpsuite的inturde模块一直上传,然后我们进入到上级目录,手动刷新。