Sleep() 不适用于 mysql-connector-python 中的堆叠查询

Sleep() not working with stacked query in mysql-connector-python

提问人:NotACodER 提问时间:6/27/2023 最后编辑:NotACodER 更新时间:6/28/2023 访问量:65

问:

我正在努力在 Django 中创建一个基于安全性的 CTF 应用程序。我目前正在构建的练习是基于时间的盲目 sql 注入。由于 Django 似乎不支持堆叠查询,因此我导入了 mysql-connector-python,它确实支持使用 .Model.raw()cursor.execute(query, multi=True)

但是,当尝试在堆叠查询中使用时,sleep 语句将不会执行。下面是一个示例:sleep(X)

视图:

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 并运行单个查询,则睡眠将正常工作。

视图:

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

请注意,我已经尝试使用,但它也不会执行。这也是一个简单的例子,因为练习的真正内容是读取一个文件(例如 /etc/passwd)并使用基于时间的盲响应从临时表中一次一个字符地拉回数据。do sleep(X)

查询在MySQL控制台和工作台中工作正常,因此它应该不是查询本身的问题。select sleep(2); select 1;

执行文档的 URL:https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

我一直在搜索MySQL文档以及有关堆叠查询的问题,但找不到任何使用sleep命令的内容。

提前感谢大家的帮助!

python-3.x django mysql-connector-python

评论


答:

0赞 aaron 6/28/2023 #1

链接的文档说:

如果设置为 , ...返回一个迭代器,该迭代器允许处理每个语句的结果。multiTrueexecute()

若要查看工作,请遍历迭代器:。sleep(2)list(cursor.execute(query, multi=True))

评论

0赞 NotACodER 6/28/2023
我想我误解了“处理结果”的含义。对我来说,“处理结果”意味着查询已经运行,并且您正在处理该查询的结果。不生成该查询的效果。无论如何,它似乎做了我需要的练习。虽然我真正的 SQLi 查询在工作台/控制台中工作,但不适用于 mysql-connector,但这是不同时间的问题。非常感谢你指出我应该采取的下一步行动。