电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 641 人浏览分享

从一道CTF题学习无字母RCE的极限利用

[复制链接]
641 0
[md]# 从一道CTF题学习无字母RCE的极限利用
最近有培训过的学院发给我一道题目,虽然一开始就知道使用通配符来做,但由于对无参数RCE的细枝末节没有很
好的理解和深入的学习,导致做题时间过长。也发现了之前学习的状态一直处于蜻蜓点水,并未有很细致的学习
在此记录一下如何对代码进行Fuzz分析以及文件上传和命令执行之间的利用Trick。

题目源码
  1. <?php
  2. if(isset($_GET['evil'])){
  3.     if(strlen($_GET['evil'])>25||preg_match("/[\w$=()<>'"]/", $_GET['evil'])){
  4.         die("danger!!");
  5.     }
  6.     @eval($_GET['evil']);
  7. }
  8. highlight_file(__FILE__);
  9. ?>
复制代码

题目分析

单个字符的正则FUZZ技巧

题目代码非常简单 题目规定了传入的参数长度不得大于25并且存在一个正则表达式来过滤咱们的传入参数 对于正则表达
式如果我们没有能够很好的学习了理解那么很难快速得知过滤了那些内容也很难知道有哪些字符能够用。这就需要引入咱
们的fuzz思想 既然看不懂 倒不如我们采用 黑盒 的思想来爆破这个正则 由于过滤的都是单个字符 并没有单词的组合所以
我们可以直接爆破0-255的AIISC码,这样我们就能快速得知正则过滤了什么内容 我们可以写个脚本进行FUZZ:
  1. <?php
  2. for ($ascii = 0; $ascii < 256; $ascii++) {
  3.     if (!preg_match("/[\w$=()<>'"]/", chr($ascii))) {
  4.         echo (chr($ascii));
  5.     }
  6. }
  7. ?>
  8. //运行结果
  9. // !#%&*+,-./:;?@[\]^`{|}~����������������������������������
  10. ��������������������������������������������������
  11. ��������������������
  12. ������������������������[Finished in 0.3s]
复制代码

这样我们就能够得出上面正则我们能够正常使用的只有!#%&*+,-./:;?@[]^``{|}~,取反 异或或运算 位运算都是通过动态
拼接函数来实现执行任意代码的.这里已经过滤掉了括弧基本上无法实现上述典型的无字符RCE。这里还不能使用可见
的字符 使用require来包含flag也是不可能实现的。这里还能用的就是反引号了。我们知道反引号能执行shell,它本质
就是调用shell_exec,这个函数执行的shell是不会有回显的 就算cat flag也不会显示出来。那么要怎么才能RCE呢?

有趣的Linux通配符

P神的《无字母数字webshell之提高篇》 可以 知道这么两个有趣的shell知识点:

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

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

WX20201015-090013@2x.png

但是我们用通配符来执行这个SB脚本的时候却会报错:

99.png

这说明我们能够匹配上??的文件或者目录很多 我们直接列出来看看

98.png

这说明两个字符的文件还是有很多的 我们必须匹配上我们唯一的文件才有可能直线我们想要直接的代码。
我们都认识*?这两个通配符 其实在glob语法里面还支持类似于正则表达式的语法。例如[^S]就是排除掉S字母
我们可以排除掉S字母然后再列目录看看,就会发现SB这个文件被排除在外。

96.png

但是这里我们的要求是不能有字母数字 我们刚才说了glob是支持类似正则表达式的用法 如[0-9]是支持的
那么我们在aiisc表中找出两个包含大写字母之间的字符就行了这样我们就能够成功获取到SB文件。

aiisc.png

从AIISC表中我们可以知道 @-[是在大写字母之间的 那么我构造[@-[]?是不是能够匹配到SB了呢?答案是肯定的。

WX20201015-145223@2x.png

PHP文件上传和命令执行的组合拳

在PHP中上传文件 只需在表单中加入*enctype="multipart/form-data"*不需要编写额外的代码 文件就能
上传到服务器缓冲区中。PHP在接受上传表单的文件流后会将文件保存到/tmp文件夹中 而这个文件类似于
这样的命名方式:/tmp/phpXXXXXX。

67a4aab1-9e90-43e6-b3f1-3569c7009390.423d9ca7066c.png

和上面讨论的一样 这样匹配出来的回匹配到很多文件 我们可以看到后面两位或者一位可能是大写
这样我们就可以用.+/???/????????[@-[]来匹配执行文件。那么我们就可以构造一个上传表单同时
传入该参数来进行RCE如下:

WX20201015-212645@2x.png

最终文件写入到网站根目录的SB文件 可以看到ls命令的执行结果已经写入该文件:

WX20201015-212949@2x.png

总结

通过上述案例我们可以知道即便在条件如此苛刻的情况下 仍然可以通过PHP文件上传和Linux通配符来执行任意远程命令
命令执行和文件上传两个看似关系不大的利用条件 在作为组合拳使用下却有如此神奇的效果。因此在实际解决安全问题
过程中我们不能仅仅关注一个漏洞能够引发的典型安全问题 还需要结合已有的知识储备创新地发掘漏洞利用的极限 同时
我们要善于利用黑盒方法 来协助白盒的审计工作,上面编写脚本来FUZZ正则就是很好的例子。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.