サイバーセキュリティに関するオンライン コースを受講しようとしていますが、SQL インジェクションを実行しようとしていることが問題の 1 つです。構文の問題とエスケープシーケンスのせいで、私はそれを理解できませんでした。
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 で % と一重引用符をエスケープできるようにするには、クエリをどのように記述すればよいですか?