前言
前几天打的一个比赛,有些自闭,趁着有时间(X-NCUA做不出来2333)来复现一下。
CheckIn
后缀过滤了.php/.phtml等等,但是.php./.user.ini可以上传;内容过滤了<?,另外有exif_imagetype()监测是否为图片。
解题思路:这里直接给出P牛的文章,利用.user.ini设置自动包含我们事先上传好的图片马,访问上传目录上的index.php
执行命令即可读取flag。
注意:这个方法有一个前提,正如P牛文章里说的,需要上传目录存在一个php文件(即本题上传目录中的index.php)才能包含上传的图片马。
Pythonginx
这道题考的Unicode
编码问题,参考Black Hat 2019
的PPT:Black Hat 2019
再根据提示尝试访问nginx的配置文件:
读/usr/fffffflag
获取flag:
easySql
人工Fuzz了一下,发现可以堆叠注入,爆了一波库名和表名:ctf –> Flag
但是过滤了flag和from
,没有办法直接查出flag。
看wp说有源码泄露,2333
1 |
|
发现查询语句:
1 | $sql = "select ".$post['query']."||flag from Flag"; |
于是这里出现了一个非预期:query=*,1
因为 1||flag
== 1,然后可以查询Flag表里所有内容。
预期解是利用 set sql_mode='pipes_as_concat'
,改变||
让它具有拼接字符串的功能,本地测试如下:
于是构造payload:1;set sql_mode=pipes_as_concat;select 1
因为有长度限制所以payload尽量精简。
easyPHP
这题一共有三层,前前后后看了不少文章,学到了挺多知识。
- 异或构造不包含字母数字的web shell
- .htaccess文件上传
- bypass open_basedir
首先看题目代码:
1 |
|
代码可以分成两部分,我们先看第一部分:
1 | $hhh = @$_GET['_']; |
为了执行get_the_flag()函数,我们需要绕过过滤执行eval(),观察发现正则没有过滤^
,考虑抑或出_GET
来执行命令。
这里我们可以先Fuzz一下构成我们需要的_GET
的字符有哪些,贴一个@tr1ple师傅的脚本(tql):
1 | # -- coding: utf-8 -- |
发现能够构成_GET
的有很多:
随便取一个构成payload:
1 | ?_=${%81%81%81%81^%de%c6%c4%d5}{%81}();&%81=phpinfo |
至于payload
的构成原理可以参考这几个师傅写的文章,挺有意思的,之后也会写一篇文章仔细分析:
记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)
然后再看第二部分:
1 | function get_the_flag(){ |
需要我们上传一个文件,过滤了ph和<?,和CheckIn
有些相似,不过这里是apache+php,我们可以上传.htaccess文件绕过过滤,另外注意需要伪造文件头。
这里直接贴脚本:
1 | # -- coding: utf-8 -- |
拿到shell之后,发现有open_basedir限制,只能读/var/www/html/
和/tmp/
:
这里我们可以用之前twitter
上新出的 open_basedir Bypass来绕过:
1 | chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');var_dump(scandir('/')); |
1 | chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('/THis_Is_tHe_F14g')); |
Upload2