当前位置:   article > 正文

【Ctfer训练计划】——(十)_ctf伪协议data题目经验

ctf伪协议data题目经验
作者名: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文件,所以有点遗憾

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/646139
推荐阅读
相关标签
  

闽ICP备14008679号