django Sleep()在mysql-connector-python中不支持堆栈查询

pvcm50d1  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(102)

我正在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命令的内容。
谢谢大家的任何帮助提前!

okxuctiv

okxuctiv1#

链接的文档说:
如果将multi设置为True,则execute() ...返回一个迭代器,该迭代器允许处理每个语句的结果。
要查看sleep(2)的工作情况,请遍历迭代器:list(cursor.execute(query, multi=True))

相关问题