python - 给定代码中的 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")
这不安全。例如,如果 is 的值name
(Bob"); DROP TABLE example--
或基于 SQL 方言的类似值),则查询的最终值是
INSERT INTO example (name) VALUES ("Bob"); DROP TABLE example;--")
这样做是Bob
照常插入数据库,然后添加一个新查询以删除整个表。然后我们使用--
注释掉该行的其余部分。
为了解决这个问题,我们必须对输入进行转义。我们应该这样创建查询,而不是字符串格式:
db.execute('INSERT INTO example (name) VALUES (?)', [name]);
这将导致输入被正确清理并且可以安全运行。
推荐阅读
- laravel-5 - 在 Laravel 中编写 SQL 查询
- oracle - 最有效地使用 NOT regexp_like
- reactjs - 打字稿中的 react-use-gesture 基本示例给出类型错误
- c++ - 具有多个 OR 的 Xpath 查询不适用于 Windows 事件
- matlab - 3D 中的 MATLAB 曲线拟合,带有附加边界
- python - 我可以在多列上加快 groupby 速度,然后用 1 个句点进行 diff 吗?
- visual-studio-code - VsCode Remote SSH .vscode-server 占用大量空间
- jenkins-pipeline - Gradle --no-daemon 启动守护进程?
- c# - 如何使用 .NET 反射检查可为空的引用类型
- php - 正则表达式 php 从不同组中的字符串中分离出一个确切的单词