Solveme Anti Sqli

http://antisqli.thinkout.rf.gd

一个新的平台, 无聊看下

打开直接给了源码:

很容易看出正则的几个问题, |\\| 没有匹配到 \ 这个符号而是匹配了字符串的 “\”, 所以这个相当于完全没用, 因为 \ 没有被过滤也给了我们逃逸单引号的条件, 只要$_GET['id'] = 1\就可以逃逸出第一个单引号

下一个问题是怎么在 pw 参数后加入注释符来闭合掉后一个单引号,  正则中用来过滤的表达式是这个|--[\s\xA0]| 然而稍微fuzz一下就可以得到有相当多的不可显字符能够替代 \s , 例如%01 %11 %02等, 于是我们得到了一段可控的sql语句,

首先直接尝试?id=1\&pw=--%01 仍然显示login failed, 而这在本地测试中是可行的, 原因是本地测试中 id 被设置为INT, 而在题目中猜测 id  被设置为了VARCHAR, 于是考虑重新构造一个 union 查询, 正则中过滤了 union[\s\xA0]+select 但是可以直接用 union all select 来绕过

于是最后payload: ?id=\&pw=union all select 31337,31337,31337 from antisqli --%01