1

我正在尝试开设有关网络安全的在线课程,其中一个问题是尝试执行 sql 注入。由于我认为的语法问题和转义序列,我无法弄清楚。

    def query():
         return "sd UNION SELECT password FROM Users WHERE admin = 1"
    
    def main():
         conn = sqlite3.connect(dbname)
         cursor = conn.cursor()
         response = cursor.execute("SELECT body FROM Tasks WHERE name='%s' and body LIKE 
         '%%%s%%'" % (username, query())).fetchall()
         print('Found entries:')
         for r in response:
             print(r[0])

我只能编辑 query() 函数,当我运行这段代码时,sql 语句什么也不返回。最后执行的命令是这样的:SELECT body FROM Tasks WHERE name='bob' and body LIKE '%sd UNION SELECT password FROM Users WHERE admin = 1%'

在我意识到引号和 '%' 导致了问题之后,我试图以某种方式逃避它们,但还没有成功。我已经尝试过这个query = "sd'' UNION SELECT password FROM Users WHERE admin = 1''"和许多其他类似的组合来逃避它,但没有成功。需要明确的是,所有列都存在,因为如果我更改单元测试并在"SELECT body FROM Tasks WHERE name='bob' and body LIKE 'sd' UNION SELECT password FROM Users WHERE admin = 1"获得密码时运行代码,但由于某种原因,准备好的语句版本'%%%s%%'不允许我通过测试。我应该如何编写查询,以便可以在 SQLite python 中转义 % 和单引号?

4

0 回答 0