题目来源:https://ctflearn.com/index.php?action=find_problem_details&problem_id=430
原题:
Grid It!
Can you bypass the security measures on the site and find the flag? I doubt it. http://web.ctflearn.com/grid
解题参考:https://github.com/terjanq/Flag-Capture/tree/master/Practice/CTFLearn/GridIt#grid-it---write-up-by-terjanq
点开题目给出的网站,可以看到一个登录页面。首先尝试能不能用SQL注入语句绕过验证。但是即使输入单引号网页还是可以正常运行。所以放弃用SQL注入绕过。在登录页面注册,进入网站中,看到页面中间有一个空白的框。我们可以在框的下方输入坐标而生成新的点。当前存在的点会列在框的下面,也有一个delete按钮可以供我们删除存在的点。
用Burp Suite截获并分析数据包。发现删除一个点的GET方法中有一个PHP序列对象:
我们可以尝试在序列中进行SQL注入。为了测试是否可以进行SQL注入,我们用curl进行测试。首先用正常的删除请求测试,在cookie中传入我们的SESSID:
命令没有任何返回,但是在浏览器中刷新我们可以看到这个点已经被删除了。
在ID字段后面加入注入语句:
我们在ID后面加上 “OR 1”,同时改变前面的长度。命令成功执行后同样没有返回任何东西,但是在浏览器上可以看到所有点都被删除了。这说明我们可以在序列中进行SQL注入。但是语句的执行不会有任何返回,所以我们将进行SQL盲注。
我们可以在ID的后面加上AND语句,后面通过条件判断来枚举出每一个字母是什么。比如我们可以构造如下的语句:
..ID=507868 AND Ascii(substring((SELECT table_name FROM information_schema.tables WHERE table_schema = database() LIMIT 0,1),1,1))>97
在这条语句中,我们判断当前数据库第一个表的第一个字符的ASCII码是不是大于‘a’。如果这个条件成立,ID所对应的点就会成功被删除,否则说明这个条件为假,即这个字符小于‘a’。我们可以进一步缩小这个字符所在的位置最后找到那个字符的值。用同样的方法,我们可以枚举出表中数据的值。如果手工枚举会用掉很多时间,我们可以写一个脚本来枚举。这个链接中的脚本可以参考:https://github.com/terjanq/Flag-Capture/tree/master/Practice/CTFLearn/GridIt#grid-it---write-up-by-terjanq
经过枚举,我们可以找到user表中admin用户的密码。用这个密码登录网页就可得到flag值。