CTF中getshell的统计

CTF题目中有不少题目的最终结果就是getshell,从现在开始对所遇到的情况进行统计,积累的多了,也许就能慢慢摸出套路了吧

1、在BCTF中的paint题目里面,从一个指定url的文件上传,考虑是使用命令行的方式,通过包含xss来看其http头的访问形式,判定使用的curl命令,因此考虑是命令注入的漏洞,成功进行命令注入后即getshell

2、exec(“/bin/hence “ . $shell);php中直接有了这样的函数,但是命令执行因有前缀遇到问题,通过%0a进行命令注入(因为其他的符号都被过滤了preg_match('/^\w+$/', $shell[$i])),
之后使用tar打包文件之后下载或使用wget一个新的马的方式

3、有个就给出了eval()函数,但是限制命令长度,基本无法使用命令远程getshell,考虑echo ‘’> xx的形式来直接写一个shell,最终考虑的方案是使用echo ls > xx来靠文件名来写shell

4、leavesong中也是一个限制命令长度的题目,使用的方法是:

5、在HBCTF里面的一个web题目,盲注得到shell重命名后的名字,然后因为是以文件包含的形式getshell,可以使用部分伪协议,所以在文件上传的时候就容易了很多,直接使用phar://的思路就可以

6、有一题目通过上传.htaccess文件来为文本配置执行环境为php

7、有一题存在文件包含功能,通过递归的文件包含(包含自己)是程序崩溃,留下文件上传的临时文件,之后通过一个第三方程序的目录遍历漏洞来获取临时文件名,调用后getshell
这里再补充下所见过的程序崩溃的写法,一般都是通过递归调用的方式来构成溢出吧:

  • 文件包含中包含自己
  • xxe中仿照实体递归定义的方式书写,最后调用此实体引起溢出

8、文件上传中上传了改后缀为图片格式的文件,之后被php文件引用了,然后里面的代码就有了php的执行环境,即所谓’图马’

9、通过日志写shell,之后文件包含日志,文件包含C:\wamp\logs\access.log即可以执行shell 目前所见的日志写shell都是通过tencent来实现的

10、select "<?php system($_GET['c']);?>" into outfile '/var/www/html/uploads/xie.php'来通过将数据写入指定的文件来写入shell

基于以上的统计,做出归纳整理

通过php代码的:

shell上传

  • 通过正常的文件上传流程
  • 通过php异常中断后的临时文件
  • 通过写日志的方法,将log文件作为shell

shell调用

  • 使用文件包含获得php的执行环境,见的总结
  • 使用url直接访问具有调用php解释器的文件,像PhP可以直接使用.php调用
  • 在调用时通过修改.htaccess文件获得php的执行环境,改变url调用文件的解释器
  • 文件目录与名字的获取上
    • 知道文件的位置与名字,直接进行url访问
    • 由一些第三方软件的漏洞 如kindeditor 的目录遍历获得信息
    • 由暴力破解的脚本方式,一般适用于已知位置的情况
    • 由phpinfo()可以知道form-data+文件中断的临时文件的保存位置(5.6未测试成功)
    • 有个数据库的环境下,文件更改后的名字可能能通过数据库注入来获取
    • 包含的是日志文件等的话,有固定的位置,
      1
      2
      3
      4
      常见的有,最准确的应该通过phpinfo()来看
      /var/log/apache/access_log
      /var/www/logs/access_log
      /var/log/access_log

其他

命令注入,php审计中发现的显示命令调用以及黑盒测试中发现的命令调用