首页 > 解决方案 > 给定代码中的 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 来做到这一点

标签: pythonsqlpython-3.xsqlite

解决方案


看一下查询格式:

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

如果值为 ,nameBob查询的最终值为:

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

这不安全。例如,如果 is 的值nameBob"); DROP TABLE example--或基于 SQL 方言的类似值),则查询的最终值是

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

这样做是Bob照常插入数据库,然后添加一个新查询以删除整个表。然后我们使用--注释掉该行的其余部分。

为了解决这个问题,我们必须对输入进行转义。我们应该这样创建查询,而不是字符串格式:

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

这将导致输入被正确清理并且可以安全运行。


推荐阅读