upload-labs 14 源码:
1.使用isset($_POST['submit'])
检测POST提交数据中是否存在submit参数
2.定义$temp_file
变量获取临时上传文件名信息。
3.定义$file_type
用于接收getReailFileType()
函数的检测结果(即判断图片类型)。
4.将上传文件带入getReailFileType()
函数中进行图片文件类型识别。
使用fopen()
函数以二进制读取(‘rb’)的方式去打开上传图片文件。
使用read()
函数去读取对应图片二进制的前两个字节(因为图片在二进制中前两个字节表示图片的类型)并将结果赋值给$bin
变量
使用unpack()
函数对二进制进行解包,提权出特定数组。
使用intval()
函数对结果进行十进制转换,该函数会返回变量对应的integer数值。
最终结果将用于进行下方的switch
语句判断,即判断最终上传文件类型。
5.如果getReailFileType()
函数返回结果是unknown,即识别不是jpg/png/gif,将直接返回文件上传失败,不会去调用move_uploaded_file()
函数进行上传文件存储。
绕过方式:文件包含图片马
上传带有图片头的文件,即图片马,然后用文件包含漏洞去包含图片马文件。
upload靶场目录下有一个include.php文件用于包含图片马,有一个$file参数用于接收想要包含的文件。
绕过方式一:伪造文件头(文件会被破坏,不会被正常识别成图片)
在文件内容最上面添加文件头标识(如gif文件头GIF89A),就可以上传带有PHP代码的.gif图片。
然后通过根目录下include.php
3.
绕过方式二:使用CMD制作图片马(图片不会被破坏)
通过CMD制作图片马,将正常的图片与.php文件结合,生成一个新的图片。且生成新的图片可以正常打开。
命令:copy正常图片路径/b+PHP文件新图片名
生成的新文件包含有php文件内容,且图片可以正常打开格式不会被破坏。
直接上传图片马,然后用include.php包含
重点:
1.include()函数将包含的文件当成php代码去执行,且如果包含的文件中存在错误,只会抛出一个警告,不会影响下面语句的执行。
2.文件包含时的注意点:路径前面不需要加斜杠