专栏首页FreeBuf如何把SQLMap里的功能移植到自己的程序中?

如何把SQLMap里的功能移植到自己的程序中?

不知道各位有没有听过不要重复造轮子?因为有些开源的工具,它们经过时间和众人的捶打,其实会比我们自己一个人造出来的轮子考虑的更加周到和全面。可是有时候有些开源工具的入口太沉重,而我们只需要其中的一部分功能并且加到我们自己的程序,所以怎么样把她们进行提炼成我们想要的呢?

介绍

最近想给自己的程序加上一个检测WAF的功能,思路可能很简单,就是构成一些存在恶意参数的URL地址,然后检测返回的response的headers或者body,通过指纹匹配的方式来定位是哪一款WAF,可是自己收集WAF信息太多了,而且写检测程序又是要费一定功夫,想到SqlMap中是可以检测Waf信息的,所以打算直接将其关键函数或者类拉出来改造后加到自己的程序中。

粗略分析源码

SqlMap源码的分析网上有太多太多了,这里就不加以仔细分析了,因为我们只要是提取一部分功能,而不是想研究学习SqlMap。先上一张SqlMap的目录结构图和他的入口文件SqlMap.py源代码(如下)。明确目的,我们需要的是他找waf的那一小段函数,看他的目录,就有一个waf的目录,打开看一下,就是十几个以waf厂商命名的函数,心中先有数,等下肯定要用到它。然后看一下sqlmap.py主文件,一共定义了3个函数,就只看函数英文名,大致的用处就可以猜到,第一个是和模块路径有关,第二个是检查环境,第三个main主函数。 进入main函数,其中命名的函数也很明显,第一个就是执行环境检查,第二个是设置环境变量,第三个banner有点工具经验应该会知道是输出SqlMap标志图案信息,但是看不明白也没事,然后往下2个函数还有备注,可以看出是提取命令行的一些参数的。

其中,设置环境变量这个函数很有意思。不知道大家平时有没有注意到,当我们用命令行使用一些开源工具的时候,有一些工具必须先cd到他的根目录下,然后才能执行,否则就会报找到不XXX的文件错误,而SqlMap就不需要,看到这个函数,大家就应该明白了,因为SqlMap在程序刚开始跑的时候,就已经把所有的可能会用到的各种目录和文件,统统都把他们的绝对路径设置到了Paths变量里,这样,不管在哪里,都可以找到这个文件。明明只是想提取功能的,不知不觉就学会了一招。。。。。。

还记得一开始看到的waf目录么,所以我们需要进入这个环境设置函数看看,他究竟吧我们的waf目录设置了什么变量

可以看到,他是把这个目录设置成了paths.SQLMAP_WAF_PATH,然后我们全局搜索这个看看哪里用到了这个变量

搜到在一个setWafFunction()的函数,看名字又是通熟易懂,设置检查waf的函数。然后我带大家来理解一下这个函数。做功能移植,基本代码要能粗略看懂。第一个就是glob库,一个文件搜索库,第一个for循环就是遍历waf目录里所有的python脚本,把文件路径返回过来循环,下面可以看到他把文件路径结果分割成了绝对路径和文件名,然后把绝对路径设置到系统环境变量里,目的就是配合下面的_import()函数(和import 函数类似,导入一个模块),使他能够找到我们的python脚本,最后检查模块里面是不是有detect函数,有的话把函数给存到kb.wafFunctions里,最后再做个排序。

这里仅仅只是把waf目录里面的函数给导入进来了,还没有开始使用,所以我们还得找到使用他的入口。继续看之前提到的,提取命令行信息的函数,使用ide一直跟进去,会看到如下的代码,看到这些参数有没有特别的熟悉,没有的话说明你对sqlmap还用的不是特别的多。 我们平时用sqlmap想检查是不是有waf用的参数是—identify-waf,直接找到这一行,发现他定义成了identifyWaf,dest就是他的变量名。继续全局搜索这个变量,终于找到了我们最想看到的东西。

执行检测的函数截图如下,然后我们搜索一下之前我们了解到的,kb.wafFunctions变量,这个变量之前分析过,把检查函数都存到这里,现在我们搜索一下这个变量,看看哪里用到了,结果发现在for循环中,把这个变量循环返回其中的函数和对应的脚本名字,然后把上面定义的一个函数当作参数执行这个函数,如果找到了认为有这个WAF,found就会等于True,然后把WAF名称存到reval变量里,接下来再进行日志输出,所以我们现在就差最后一步,就可以把这个功能移植出来了,那就是了解函数的功能意义。函数第一行定义了三个变量为空,进入到try分支,前两行在没有通读sqlmap全部函数的情况下,大家应该是看不懂的,所以先跳过,如在后面发现是关键语句,再慢慢分析,如果只是一个全局的flag,那么就可以不复习了,往下看,先是提取get参数给他url编码了一下,然后加上raise404和silent参数后把参数转发调用Request.getPage函数,我们跟进入这个函数,发现整整500多行,一行一行分析也太麻烦了吧! 确实,所以这里又有一个小技巧,先看看他返回的东西到底是什么,还有函数到底用返回的东西干了什么,就可以推断出来,这400多行代码到底干了什么,这就和英语阅读理解一样,知道上下文,就可以推断出你不认识的某个单词到底什么意思。

直接看return语句,发现一共返回了3个参数,其中第二个参数一看就知道是返回的头部信息,第三个是返回的code,可以猜测可能是状态码,因为不管什么库,他的.code都是返回状态码,不过仅仅做猜测,我们先看看waf利用这些信息做了什么。

下面这几行代码是我从waf文件夹随便挑的检测aws的一段函数,其中WAF_ATTACK_VERCTORS是事先定义好的为了触发WAF的一些代码,是常量可以直接拿来用,加在URL后面的,看到他把这段代码加进去进行get然后code==403,所以可以确定之前code就是加入触发WAF代码后就行get请求放回的状态码,responseHeaders就是所有的返回头信息,HTTP_HEADER.SERVER是一个常量,事先定义好的,直接可以拿来用,所以现在就差page不知道是什么意思了,我们换个脚本,看第二个检测360的,其中page是“/wzws-waf-cgi/ in page”,所以可以推断出,应该page就是返回的body信息。

至此,整个sqlmap检测WAF的逻辑已经全部理清楚,我们只需要把各个函数剥离出来,定义在我们的程序即可。

回顾与组装

我们重新捋一捋sqlmap检查waf的运行流程,首先用glob库,把文件夹所有的python文件中的检查函数统统压入一个list变量(这一段我们是可以直接复制出来,稍加修改即可利用加在自己的程序),然后定义一个函数,返回3个参数,分别是返回的body正文,header请求头,code状态码(我们可以用urllib2或者request来把函数编写出来,并不难)。然后还定义了一些能够触发WAF的恶意代码,一些HTTP头部字段,这两个常量在data里(直接拷贝过来用)。终于,检查WAF的整整一个功能就直接被剥离出来加在了我们自己的程序里,sqlmap的WAF库很全,国内国外的,肯定比自己重新收集指纹写一个要好,因为我们也没有什么和市面上检测思路不一样的想法,也就是检查返回头返回状态码和正文。

很多程序其实都是如此,学会改装、移植、模仿,可以帮助你省下很多时间。

本文分享自微信公众号 - FreeBuf(freebuf),作者:0d9y

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微信也被监控:HackingTeam语音监控代码分析

    在HackingTeam泄漏的文件,我们发现了有针对主流聊天软件中的语音进行监控的代码,其中包括国内常用的微信。下面就以微信为例,来分析一下HackingTea...

    FB客服
  • 逆向实践:批量验证微信号是否存在

    一、前言 xposed是一款安卓平台下强大的hook框架,我们可以用他来开发很多强大的插件,以此来帮助我们更方便地解决某些实际的问题。本文将尝试利用xposed...

    FB客服
  • 逆向工厂(二):静态分析技术

    * 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:...

    FB客服
  • 看我是如何把SQLMap里的功能移植到我的程序的

    不知道各位有没有听过不要重复造轮子?因为有些开源的工具,它们经过时间和众人的捶打,其实会比我们自己一个人造出来的轮子考虑的更加周到和全面。可是有时候有些开源工具...

    企鹅号小编
  • javascript基础修炼(8)——指向FP世界的箭头函数

    箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于“ES6里添加了哪些新特性?”这种问题的时候,几乎总是会拿箭头函数...

    大史不说话
  • C++ 之虚函数的实现原理

    c++的多态使用虚函数实现,通过“晚绑定”,使程序在运行的时候,根据对象的类型去执行对应的虚函数。

    用户1215536
  • 对JAVASCRIPT匿名函数的理解

    网上很多解释,我无法理解,我想知道原理。。。这篇文章应该可以透彻一点 Query片段: (function(){ //这里忽略jQuery所有实现 })...

    用户1214487
  • 【连载-4】数据中心网络虚拟化 配置管理技术

    在构建虚拟网络时,管理员需要进行大量的配置工作,例如端口的ip地址和VXLAN配置等等。显然,没有人愿意在系统每次启动时都将繁琐的配置工作重复一遍,所以将配置信...

    SDNLAB
  • 数据中心网络虚拟化 配置管理技术

    在构建虚拟网络时,管理员需要进行大量的配置工作,例如端口的ip地址和VXLAN配置等等。显然,没有人愿意在系统每次启动时都将繁琐的配置工作重复一遍,所以将配置信...

    SDNLAB
  • Python学习笔记(3)--- Fla

    安装地址:https://pip.pypa.io/en/stable/installing.html#install-pip

    py3study

扫码关注云+社区

领取腾讯云代金券