2019国赛西南赛区部分WEB WP
前言
- 国赛区域赛打完了,太菜了,就当公费旅游了。趁这几天有空复现了一下几道题。
day1
- 划水并且上别人的车。源码忘了拷,血亏。只做出一道yml反序列化的题,还是上的别人的车。
day2 web1
- 先膜一发evoA师傅,感谢大师傅给的思路。
- 这题思路很骚,虽然做题点都学过,但是思路很巧妙。 考点:htaccess文件写入
- 首先,提示是文件上传,但是文件上传处被过滤的死死的;整个目录中相对宽松的地方就只有login-lock.php处的代码了,通过post time参数可以写入任意代码: 12345678if (isset($_POST["time"])) {$time = $_POST["time"];$lock = fopen("files/" . $_SESSION["name"], "w");fwrite($lock, $time);fclose($lock);sleep(2);//假装处理要消耗不少时间 让动画好看一点echo "files/" . $_SESSION["name"];}
但是,生成的文件名使用的name是用户名,而在注册用户时,用户名过滤比较严格:
其实回过头来才看出来作者是在提示:.前面有东西就干死 :),那前面没东西不就好了。
所以这里可以创建一个用户名为.htaccess
的用户,在其中将jpg文件解析为php;然后再创一个正常用户,上传一个图片马即可getshell(不能用.htaccess用户是因为php默认不解析包含htaccess关键字的文件,而上传的图片名也为用户名)
.htaccess内容为:
一个意外发现的点
- 这个点是队友想出来的,既然可以直接写入没有文件名而只有后缀的文件,是不是可以直接写入
.php
文件呢? - 在不同的系统上尝试,发现在本机的windows中可以直接解析
.php
文件,而在ubuntu系统中则无法解析。 - 原因是apache在linux下解析文件时,对隐藏文件(开头为.号)的文件是不给访问权限的,所以无法直接写入
.php
文件getshell。
day2 web2
- 此题源码泄露+多行匹配绕过
首先扫描路径获得swp文件(做题时自己字典太菜了,居然没扫到,很难受),还原得源码,关键代码:
12345678910111213141516171819error_reporting(0);$file_name = $_POST["path"];if(preg_match("/flag/",$file_name)){die("请不要输入奇奇怪怪的字符!");}if(is_array($file_name)){$file_name=implode($file_name);}if(!preg_match("/^[a-zA-Z0-9-s_]+.rar$/m", trim($file_name))) {echo trim($file_name).'<br>';echo "请输入正确的文件名";}else {echo "/usr/bin/md5sum " . $file_name;echo( exec("/usr/bin/md5sum " . $file_name));}可以看到有命令执行,第一处的preg_match用传入数组绕过,第二处的preg_match用多行匹配%0a绕过(多行匹配对每一行进行匹配,只要有一行满足就返回1)。 payload:
1path[]=1.rar%0acat /flag
day2 web3
- 吐槽一下,这题是真的辣鸡,出题人出错了题,主办方也不好好审一下。
- 比赛的时候一眼看出来是南邮CTF的一道题的改版,直接拿当时的脚本怼,不出结果。再查看注释,发现要输入一个比 1000000大的最小的素数,查了一下是1000003,拿脚本继续跑,各种改,跑了一上午都不出flag;这时候看看全场,居然没有一支队伍做出来,肯定遇到坑了,就没做了。
- 最后fix环节的时候才发现题给错了,应该是比 10000000大的最小的素数,为 10000019。拿脚本又打了一遍,出flag了,手动微笑,建议把出题的打死 :)
- 此题几乎照搬NCTF“小绿草之最强大脑”,考点:会写脚本解析网页,直接上脚本:
|
|
|
|
结语
- 第一天还有很多道题没来得及拷出来,不知道能不能在网上找到WP;自己的水平也很菜,继续学习才能赶上大部队。
- 最后附上本文中题的源码:https://github.com/HACHp1/hackable_cms_store/tree/master/guosai_xx