clickhouse 遇到一题clickhouse注入相关的,没有见过,于是来学习clickhouse的使用,并总结相关注入手法。 环境搭建 直接在docker运行 docker pull clickhouse/clickhouse-server docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server 基础sql语句 列出数据库 show databases;
列出表 show tables; 查看表结构 desc system.databases;
select name,database,data_path from system.databases;
建表语句 CREATE DATABASE IF NOT EXISTS helloworld; CREATE TABLE helloworld.my_first_table
(
user_id UInt32,
message String,
timestamp DateTime,
metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp) 插入数据 INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES
(101, 'Hello, ClickHouse!',now(),-1.0),
(102, 'Insert a lot of rows per batch',yesterday(), 1.41421 ),
(102, 'Sort your data based on your commonly-used queries', today(),2.718),
(101, 'Granules are the smallest chunks of data read',now() + 5,3.14159 ) system 数据库 这个数据库存储了数据库信息、表信息、字段信息 select name,table,database from system.tables where database=database();
select name,table from system.columns where table='my_first_table';
python
#!/usr/bin/python3
import sys
import string
import random
def main():
# Read input value
for number in sys.stdin:
i = int(number)
# Generate some random rows
for id in range(0, i):
letters = string.ascii_letters
random_string =''.join(random.choices(letters ,k=10))
print(str(id) + '\t' + random_string + '\n', end='')
# Flush results to stdout
sys.stdout.flush()
if __name__ == "__main__":
main()
执行sql语句:SELECT * FROM executable('1.py', TabSeparated, 'id UInt32, random String', (SELECT 10)) 其中TabSeparated表示脚本文件的输出每行以\t符号分隔,用于解析结果,可以换成TSV 如果脚本文件的输出以逗号结尾,那么就写CSV 最后一个参数要传入一个query语句,结果会被传入脚本文件的标准输入 用什么解释器执行脚本,取决于文件开头的注释#!/ 当尝试跨目录执行文件时,报错: