之前看到一个ctf练习平台出了一道过滤所有的字母和数字的题,顿时感到懵逼。如果waf将所有的东西都过滤了我们将如何构造我们想要的东西。
看了这个大佬写的博文我顿时感觉自己通透了,万万没想到异或也可以做的如此地步。
原理就是通过未被过滤的字符异或得到自己想要的被过滤的字符比如 <和{字符异或得到G
同理通过这种方法我们可以通过异或构造被过滤的任何字符
在本地的环境测试怎么都不对原来是在PHP5.4之前PHP指令magic_quotes_gpc默认是on,把我的字符转义了。先把这个特征先记下来再说。
还有一点需要提醒的是这是表达式必须要运算后才能得到结果。也就是传入像echo,eval()之类的才行。
这里放自己写的一个python小脚本求解字符构造的成分
def sovle():
a = input("输入要异或编码的字母")
b = input("输入要异或编码的字母")
c = (ord(a)) ^(ord(b))
print("异或后的字符",chr(c))
if __name__ =="__main__":
a = input("输入要异或编码的字母")
a = ord(a)
b = [33,47,58,64,91,96,123,256] #除开字母和数字的ascii序号
print("{}字符可由下列字符异或得到".format(chr(a)))
for m in range(0,8,2):
for i in range(b[m],b[m+1],1): #第一个数
for j in range(m,8,2):
for x in range(b[j],b[j+1],1): #第二个数
if (i ^ x == a):
print("{}({})\t\t{}({})".format(chr(i),parse.quote(chr(i)), chr(x), parse.quote(chr(x))))