Где находится уязвимость инъекции SQL в данном коде и как ее использовать с помощью python и sqlite - PullRequest
0 голосов
/ 21 июня 2020

Мне дали этот код

import sqlite3
     def blorksnork(xorkThorb) :
     snerk = []
     borkbork = sqlite3.connect('MorkDork.db')
     glorb = borkbork.cursor()
     borknork = glorb.execute(xorkThorb)
     for glork in borknork :
         snerk += [str(glork)]
    
     borkbork.commit()
     borkbork.close()
     return snerk

def gorkaplorkplork (shmork) :
     flerb = []
     xork = 'INSERT INTO prisoners (name, lattitude, longitude, resistance) VALUES ("{0}", {1}, {2}, "{3}")'.format(shmork[0], shmork[1], shmork[2], shmork[3])
     xorkTork = xork.split(";")
     for lork in xorkTork :
         flerb += blorksnork(lork)
     return flerb

и сказали найти, где находится SQL инъекционная уязвимость и как ее использовать. Я считаю, что уязвимость возникает из-за разделенной части во втором сегменте, но Я не знаю, как этим воспользоваться. W должны делать это через python и sqlite

1 Ответ

2 голосов
/ 21 июня 2020

Обратите внимание на форматирование запроса:

'INSERT INTO prisoners (name, lattitude, longitude, resistance) VALUES ("{0}", {1}, {2}, "{3}")'.format(shmork[0], shmork[1], shmork[2], shmork[3])

Здесь вы вставляете аргументы в запрос, используя format. Это не избегает аргументов и, следовательно, допускает инъекцию SQL. Давайте воспользуемся более простым примером:

'INSERT INTO example (name) VALUES ("{0}")'.format(name)

Если значение name равно Bob, окончательное значение запроса будет:

INSERT INTO example (name) VALUES ("Bob")

Это небезопасно. Если, например, значение name равно Bob"); DROP TABLE example-- (или что-то подобное на основе диалекта SQL), окончательное значение запроса будет

INSERT INTO example (name) VALUES ("Bob"); DROP TABLE example;--")

При этом Bob вставляется в базу данных как обычно, но затем добавляется новый запрос для удаления всей таблицы. Затем мы используем --, чтобы закомментировать оставшуюся часть строки.

Чтобы решить эту проблему, мы должны экранировать ввод. Вместо форматирования строк мы должны создать запрос следующим образом:

db.execute('INSERT INTO example (name) VALUES (?)', [name]);

Это приведет к правильной дезинфекции ввода и его можно будет безопасно запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...