emmmmm... 比较尴尬...这道题是比赛之后解出来的..出了点小意外.... 好吧,这道题思路说一下... 依旧是Nu1l的那位出77777的师傅出的题...这个是第三关... 开始测试的时候发现过滤的东西还是很多的... 单字符fuzz一下, 发现可以使用的 ['"', '#', '$', "'", '(', ')', ',', '.', '2', '9', ';', '>', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '', '\x7f', '\x80'] 不能使用的 ['!', '%', '&', '*', '+', '-', '/', '0', '1', '3', '4', '5', '6', '7', '8', ':', '<', '=', '@', 'J', '^', '_', '`', 'j', '{', '}', '~'] 一开始的时候利用思路是发现按位或没过滤,那么可以对数字进行按位或 条件成立异或2,成功 条件不成立异或'a',失败 然后又发现if,括号,引号都没过滤,那么简单构造payload
1 | if(pw>'{flag}',2,'a') |
发现成功注入,这里其实这道题已经做出来了.....只是最后提出来的是大写...按小写交一下就ok了.. 不过这也是比赛之后写出通用脚本才知道的了... 当时以为姿势不对,又想了蛮多方法,后来美工姐姐说用了<,然而我<是在黑名单里面,那么出题人应该不是单字符匹配的 既然能用<,那么很快我就想到,有数字2,9,按位或和位移<<和>>可以构造出所有数字,再次测试,发现substr没过滤,但是ord和asc都过滤了,不过无所谓,hex没有过滤,构造出payload
1 | "if(hex(substr(pw,{order},29>>2>>2))>hex({asc}),2,'a')".format(order=makedigit(order),asc=makedigit(asc)) |
这里美工姐姐写了个数字替换函数
1 | def makedigit(n): |
贴出完整代码
1 | import requests |
最后拿到结果 hhhhccchhddddahhhhhh 感觉flag没有设计好,并没有什么奇奇怪怪的字符... 要是一开始来个被过滤的'j',那多舒服啊... 不过思路还是很好玩的,记录一下