看我是如何把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库很全,国内国外的,肯定比自己重新收集指纹写一个要好,因为我们也没有什么和市面上检测思路不一样的想法,也就是检查返回头返回状态码和正文。

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

本文来自企鹅号 - 疯猫网络媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java思维导图

Java中高级面试题

技术文章第一时间送达! 本文作者是CyanQueen,欢迎点击阅读原文 一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,V...

3725
来自专栏祝威廉

StreamingPro添加Scala script 模块支持

SQL 在解析字符串方面,能力还是有限,因为支持的算子譬如substring,split等有限,且不具备复杂的流程表达能力。我们内部有个通过JSON描述的DSL...

673
来自专栏高爽的专栏

Hession反序列化导致CPU占用飙高

背景 今天发布一个线上服务,暂且称之为O,发布完后,依赖O服务的2个服务C和W大量Time报警,并且这两个服务的CPU占用都飙到了40%左右,平时只有10%的样...

3890
来自专栏梧雨北辰的开发录

iOS面试知识总结之基本概念总结

凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知...

4097
来自专栏分布式系统和大数据处理

.Net 项目代码风格参考

代码风格没有正确与否,重要的是整齐划一,这是我拟的一份《.Net 项目代码风格参考》,供大家参考。

1442
来自专栏鹅厂少年的奇妙之旅

Go内存模型

Go语言中内存分配大致有3种模式:Stack、Heap、Fixed Size Segment。

6905
来自专栏FreeBuf

缓冲区溢出攻击初学者手册(更新版)

说明 之前版本翻译质量不佳,本人赵阳在这里对本文的读者表示深深的歉意。由于本人的疏忽和大意导致您不能很好的读完这篇文章,同时也对原文内容进行了破坏,也对IDF和...

2829
来自专栏大内老A

WCF技术剖析之二十一:WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的...

20310
来自专栏大内老A

WCF的三个名称/命名空间,你是否傻傻分不清楚?

在定义和寄宿WCF服务的时候会面临三个名称/命名空间,它们分别是ServiceContractAttribute、ServiceBehaviorAttribut...

2059
来自专栏王清培的专栏

.NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControl...

2426

扫码关注云+社区

领取腾讯云代金券