上个月底,7 月 24 日,恰逢台风烟花来袭,在家无事就和公司网安组大佬一起在 Cybrics2021 线上 CTF 赛打了个酱油。 Web 类有一道叫 announcement 的题目,题干很简单,只有输入邮箱这一个步骤。 burpsuite 抓包看了下,POST 了 “email” 和 “digest” 两个参数到后台。
那么这会不会是一道注入题呢。把 email 参数换为单引号,看了下 digest 长度有点像 md5,于是本地计算单引号的 md5 后填入 digest,果然返回了数据库报错信息——嗯,报错型注入没跑了。
其实后来网上的 writeup,有的用 python 脚本来做,有的边计算 md5 边手工注入。但是遇到注入题,大名鼎鼎的入狱拖库工具 SQLmap 怎能缺席。这道题最大的问题是 digest 参数必不可少,并且必须是和 email 参数的 md5 hash 相匹配。
想到处理 SQLi payload 自然首先想到 tamper 库。翻了翻 SQLmap 的自带 tamper 库,空格变换、双写 SQL 关键词之类,之前也尝试过改写一些 tamper,但和本题相距有点远。于是在 Google 一阵搜索后,非常意外地发现--eval
这个参数很好用——简而言之就是直接用 python 代码来处理注入 payload 。一番调试后,用*
指定 payload 位置为 email
参数,--eval
来处理 digest
,最终使用以下命令跑了几百条后拖出了含有 flag 的表。
sqlmap -u "http://announcement-cybrics2021.ctf.su/" --data "email=*" --eval="import hashlib;digest=hashlib.md5(email.encode('utf-8')).hexdigest()"
一开始对--eval
运算后生成的字符串在 POST 请求参数的位置有些不解,后来经实践发现--eval
产生的 digest 参数会自动附在 --data
里"email="
的后面。
好的 CTF 赛题,理应让人对熟悉的工具有新的认知和进一步的思考。