upload知识点
upload学习知识点
upload学习过程中涉及的知识点
一、配置文件
_Preview Image
对配置文件的修改
upload相关配置文件
.htaccess文件的优先级高所以其危险性更大
user.ini文件生效前提是目录中存在php文件可以对其进行覆盖
二、额外数据流
在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的文件,其中内容和所上传文件内容相同,并被解。
要访问额外数据流信息即可noteoad 文件名称 : 设置的数据流空间名称
php不会验证文件数据流故可以上传成功
在windows中不允许文件名后缀带有::$故上传后php后的标识会消失
三.空格绕过
windows系统中.空格会被自动删除所以可以用来绕过
所以在上传木马的时候可以将php文件后缀加入.空格.空格来绕过
四、空字符
0x00与%00都表示空
五、图片字节表示
六、相关php函数
getimagesize() 函数获取图像文件的信息,返回一个包含多个元素的数组。这个数组包括图像的宽度、高度、MIME 类型等信息。
如果 $filename 不是图像文件,getimagesize() 会返回 false。
exif_imagetype() 读取一个图像的第一个字节并检查其签名。如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。返回值和 getimagesize() 返回的数组中的索引 2 的值是一样的,但本函数快得多。
那么它的语法是:
exif_imagetype ( string $filename ) : int
$filename是文件位置和名称,如果检查是图片文件则返回一个跟图像类型对应的数字,否则返回 FALSE。
image_type_to_extension($info[2]) 会根据 getimagesize() 返回的图像信息中的 MIME 类型(即 $info[2])返回对应的扩展名。例如,image_type_to_extension() 会把 IMAGETYPE_JPEG 转换为 .jpeg,IMAGETYPE_PNG 转换为 .png,等等。
检查文件扩展名是否在允许的图像类型中:
pathinfo()该函数用于获取其后缀名称文件扩展名获取:可以通过 pathinfo()
提取文件的扩展名,方便做文件类型检查
$ext = pathinfo($filename, PATHINFO_EXTENSION);
七、二次渲染
二次渲染会对文件进行一次重写其显示的内容不变但是文件本身内容发送一部分的改变
八、条件竞争
upload-labs18关的源码
$is_upload = false;
$msg = null;
if(isset($_POST[‘submit’])){ // 检查是否提交了上传表单,如果提交了则执行下面的代码块
$ext_arr = array(‘jpg’,’png’,’gif’); // 定义允许上传的文件类型数组,包括jpg,png,gif
$file_name = $_FILES[‘upload_file’][‘name’]; // 从上传表单中获取上传文件的名字
$temp_file = $_FILES[‘upload_file’][‘tmp_name’]; // 从上传表单中获取上传文件的临时路径
$file_ext = substr($file_name,strrpos($file_name,”.”)+1); // 获取上传文件的扩展名,即文件名的最后部分
$upload_file = UPLOAD_PATH . ‘/‘ . $file_name; // 拼接出上传文件的完整路径,创建以原文件名为名的文件
if(move_uploaded_file($temp_file, $upload_file)){ // 将临时文件移动到指定的路径,如果移动成功则执行
if(in_array($file_ext,$ext_arr)){ // 检查上传文件的扩展名是否在允许的类型数组中,如果在则执行下面的代码块
$img_path = UPLOAD_PATH . ‘/‘. rand(10, 99).date(“YmdHis”).”.”.$file_ext;
#生成新的文件名,包括随机数字、当前日期和时间以及原文件的扩展名
rename($upload_file, $img_path); // 将上传的文件重命名为新的文件名
$is_upload = true;
}else{ // 如果上传文件的扩展名不在允许的类型数组中,则设置错误消息,并删除上传的文件
$msg = “只允许上传.jpg|.png|.gif类型文件!”;
unlink($upload_file);
}
}else{
$msg = ‘上传出错!’;
}
}
将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可通过条件竞争的方式在unlink之前,访问webshell。
使用burp拦截上传18.php的数据包并对数据包发送至intruder模块进行高速重发(上传包)
其实就是利用代码执行的逻辑问题来进行上传,如:当文件先上传后改名时就可以通过不断的发包从而访问到指定的文件
条件竞争解释:
九、系统解析漏洞
系统解析文件是从后往前解析,如1.php.7z先解析7z后解析php,故阿帕奇系统存在此文件上传漏洞
PHP临时文件上传
upload-labs靶场(由于版本的问题该靶场要使用php5等后缀名不能使用nts版的php最简单方法使用老版本phpstudy,第十二和第十三关的php版本要求在5.3以下且magic_quotes_gpc
为关闭状态(需要自己关闭))
upload-labs靶场
第一关
第一关中直接上传php文件发现其只能上传jpg png gif这种图片文件
并发现在上传操作时无法对其进行抓包所以确定其为前端验证
将一句话木马文件后缀改为jpg进行上传并进行抓包处理
使用bp抓包并将文件后缀改为php后发现成功上传文件
使用蚁剑进行连接,成功连接木马
第二关
第二关发现其并不是前端验证
但直接bp抓包修改后缀名即可成功上传木马,之后使用蚁剑连接即可
第三关
上传php文件后发现其设置了黑名单
不允许上传php文件,故抓包将php文件后缀改为php5进行尝试
进行多次尝试发现新版phpstudy默认下载的php版本有问题故而将版本退回2016进行尝试实验成功,原因是因为新版phpstudy下载的php版本均为nts版配置文件中无法更改识别内容故将其退回2016版本即可
详细内容参考该文章关于PHPStudy中使用AddType application/x-httpd-php该Apache的设置命令无效的问题 - Article_kelp - 博客园
该题是黑名单过滤但并未过滤掉php3或者php5这类文件故更改文件名后缀即可
第四关
首先上传php文件发现被列入黑名单了于是进行上传其余后缀名文件如php3 php5 phtml均无法上传
方法一:于是想到更改配置文件将jpg文件视为php进行解析后进行实验确实可以通过。但是该方法需要管理员权限才可使用
方法二:上传.htaccess文件使其能够将其他类型的文件当作php文件进行解析,在文件中写入AddType application/x-httpd-php jpg.txt使其能够解析jpg文件和txt之后上传这两种文件木马,之后上传木马即可
第五关
首先上传一些文件发现.htaccess文件php文件无法上传但是txt和jpg和.user.ini文件可以正常上传
于是使用.user.ini文件进行尝试
编辑文件内容为
来确保muma文件被包含在php文件前进行解释
之后使用蚁剑连接其中的php文件即可
第六关
上传上面那些文件发现均无法正常使用于是考虑绕过
该关使用大小写绕过即可
更改后缀名大小写即可
第七关
该关使用空格绕过
在文件后缀加入空格即可
第八关
将各种文件上传一遍发现均行不通,遇事不决看源码
该题将所有进行利用的后缀名都列入了黑名单,但是并没有删除后缀名后.的功能于是从此着手
在php的后缀名后加入一个.即可成功
第九关
考察文件数据流
上传php文件在bp中将php改为php::$DATA即可成功上传
上传成功后使用木马进行连接
第十关
考察点空格绕过
将上传的木马文件后缀改为.php. . 即可绕过
之后蚁剑连接.php文件即可
第十一关
该关考察双写绕过根据源码只检测一次后缀名所以双写后缀名即可
后使用蚁剑连接
第十二关
该题目设置白名单且前面方法不能使用,该题考察空字符绕过
使用bp抓包将其上传路径改为muma.php%00即可
第十三关
该关卡也是考察空字符绕过不过使用的是0x00并且使用post传参
如下方修改即可上传成功
第十四关
(注意图片马不宜过大否则会解析失败)
该关考察图片字节与文件包含漏洞
会根据文件前几位字节进行判断,在图片马前加入几个字节方便010进行修改
然后尝试上传文件
成功上传php文件,但此时蚁剑无法进行连接,于是利用文件包含漏洞
进行文件包含使其被解析为php文件使用蚁剑连接即可
第十五关
该关卡环境PHP 4 >= 4.3.0, PHP 5, PHP 7并且开启php_exif
该关使用getimagesize() 函数
故仍使用图片马上传即可,下面为图片马制作指令
之后再次利用文件包含即可
最后使用蚁剑连接。与14关一致
第十六关
该关使用exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快
其对应解法与14关相同
第十七关
该关对图片进行了二次渲染故需要对文件进行比较
对两次上传的图片进行比较找到未发生更改的地方
使用010进行文件比较即可
找到未发生更改的地方将其改为一句话木马然后上传利用文件包含漏洞访问即可
第十八关
该关使用条件竞争
即先不断上传文件,然后想办法在文件被删除前访问该文件,以达到执行该文件,从而避免被系统删除的目的。之后,我们尝试访问上传后的木马文件,采用同样的思路进行抓包,并将该数据包发送到Intruder模块。启动Intruder模块,使得Burpsuit不断访问该文件,同时在Burpsuit的Repeater模块中不断上传该数据包
凭借运气来进行连接即可