我正在Django中创建一个基于安全的CTF应用程序。我正在构建的当前练习是基于时间的SQL盲注入。由于Django似乎不支持通过Model.raw()
的堆栈查询,我导入了mysql-connector-python,它支持使用cursor.execute(query, multi=True)
的堆栈查询。
但是,当尝试在堆栈查询中使用sleep(X)
时,将不会执行sleep语句。以下是一个示例:
浏览次数:
query = f"select sleep(2); select 1;"
mydb = mysql.connector.connect(
host="localhost",
user="****",
password="****",
database="****"
)
cursor = mydb.cursor()
cursor.execute(query, multi=True)
return HttpResponse(f"query: {cursor}")
sqli脚本:
url = f"http://127.0.0.1:8080/books/book/?q=1"
start = time.perf_counter()
response = requests.get(f'{url}')
end = time.perf_counter()
print(response.text)
print(f'response time: {end-start}')
这将返回以下内容:
query: MySQLCursor: select sleep(2); select 1;
response time: 0.005476321006426588
但是,如果删除multi=True并运行单个查询,则sleep将正常工作。
浏览次数:
query = f"select sleep(2);"
mydb = mysql.connector.connect(
host="localhost",
user="****",
password="****",
database="****"
)
cursor = mydb.cursor()
cursor.execute(query)
return HttpResponse(f"query: {cursor}")
sqli脚本:
url = f"http://127.0.0.1:8080/books/book/?q=1"
start = time.perf_counter()
response = requests.get(f'{url}')
end = time.perf_counter()
print(response.text)
print(f'response time: {end-start}')
这将返回以下内容:
query: MySQLCursor: select sleep(2);
response time: 2.010241993004456
请注意,我已经尝试使用do sleep(X)
,它也不会执行。这也是一个简单的例子,因为练习的真实的内容是读取一个文件(例如/etc/passwd),并使用基于时间的盲响应从临时表中一次一个字符地拉回数据。
查询select sleep(2); select 1;
在MySQL控制台和工作台中运行良好,因此它不应该是查询本身的问题。
执行文档的URL:https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
我一直在搜索MySQL文档以及有关堆栈查询的问题,但找不到任何使用sleep命令的内容。
谢谢大家的任何帮助提前!
1条答案
按热度按时间okxuctiv1#
链接的文档说:
如果将
multi
设置为True
,则execute()
...返回一个迭代器,该迭代器允许处理每个语句的结果。要查看
sleep(2)
的工作情况,请遍历迭代器:list(cursor.execute(query, multi=True))
。