2018 HCTF WriteUp
🏛️ 组织架构
主办单位:杭州电子科技大学通信工程学院
承办方:杭电学生社团 “信息安全协会”(即知名的 Vidar 战队)
赞助方:本届比赛由杭州拜思科技友情赞助,因此也被称为 “拜思杯”
决赛排名:
冠军:天枢战队(北京邮电大学)
亚军:Redbud 战队(清华大学)
季军:Nu1L 战队(联合战队)
Web
warmup(文件包含 ? 绕过)

网页注释中的 source.php 给了源码
1 |
|
白名单是 source.php 和 hint.php,于是再找到 hint.php
1 | flag not here, and flag in ffffllllaaaagggg |
想触发文件包含,需要满足三个条件
1 | ! empty($_REQUEST['file']) |
checkFile() 里定义了白名单
1 | $whitelist = ["source"=>"source.php","hint"=>"hint.php"]; |
代码里有这段
1 | $_page = mb_substr( |
它的意思是:
找到
$page里第一个 ? 的位置截取
?前面的内容判断截取出来的内容是否在白名单里
所以我们可以构造 Payload:source.php?file=source.php?../../../../../../../../ffffllllaaaagggg
对于 include 来说,这不是 HTTP 请求里的 query string,而是一个本地文件路径字符串
其中 ? 在本地文件路径里不是特殊的参数分隔符,而更像普通字符,所以可以绕过
Misc
difficult programming language

打开流量包发现是 USB 流量

USB 键盘的数据包一般是 8 字节 HID report
modifier表示 Shift / Ctrl / Alt 等组合键key1~key6表示当前按下的键码
1 | [modifier][reserved][key1][key2][key3][key4][key5][key6] |

万能提取脚本
1 | pcap_path = "difficult_programming_language.pcap" |
运行后得到
1 | D'`;M?!\mZ4j8hgSvt2bN);^]+7jiE3Ve0A@Q=|;)sxwYXtsl2pongOe+LKa'e^]\a`_X|V[Tx;:VONSRQJn1MFKJCBfFE>&<`@9!=<5Y9y7654-,P0/o-,%I)ih&%$#z@xw|{ts9wvXWm3~c |
结合题目文件名 difficult_programming_language
很容易联想到著名的 “困难编程语言”
1 | Malbolge |
把整段输入作为 Malbolge 代码直接执行时,会发现最后一个字符 c 会导致源码校验失败
Malbolge 源码中,每个位置的字符需要满足特定规则
1 | (ord(ch) + index) % 94 ∈ {4, 5, 23, 39, 40, 62, 68, 81} |
去掉最后一个字符后,得到合法 Malbolge 程序
1 | D'`;M?!\mZ4j8hgSvt2bN);^]+7jiE3Ve0A@Q=|;)sxwYXtsl2pongOe+LKa'e^]\a`_X|V[Tx;:VONSRQJn1MFKJCBfFE>&<`@9!=<5Y9y7654-,P0/o-,%I)ih&%$#z@xw|{ts9wvXWm3~ |
可以用 Python 的 malbolge 库执行
1 | import malbolge |
拿到 flag:hctf{m4lb0lGe}