给定代码中的SQL注入漏洞在哪里以及如何使用python和sqlite利用它



我得到了这个代码

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来做到这一点

看看查询格式:

'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]);

这将导致输入得到适当的清理,并且可以安全运行。

最新更新