说起来,学习Python很大一部分原因是由于对WEB安全的兴趣以及对SQLMAP这款工具的好奇,曾经设想学完Python基础就读一读SQLMAP源码,然而懒病一犯,随之就大江东去。近来,又重新燃起了读源码的想法,耗费几天时间,基本算是了解一些,在此记录下来,分享出去。有始但不一定有终,但终究好于不做,惭愧。

我的源码学习环境如下:

 (1)PentesterLab虚拟机;

 (2)PyCharm Community Edition 2016.3;

 (3)Notepad++

 (4)SQLMAP 1.1.1.4#dev

好了,先将几个重要的函数、变量撩着,main()除外,不足在后续补充完善。

1.cmdLineParser()

位于sqlmap.py中第123行,cmdLineOptions.update(cmdLineParser().__dict__),此函数主要用了optparse模块来解析脚本传入的参数,定义在lib\parse\cmdline.py模块中,使用sqlmap工具的小伙伴们会在此发现很多常见的命令,比如-u -d --random-agent –current-db --dbs --tables --columns等等,在此版本中实际是有194个参数的,这么丰富的功能,有待挖掘啊!

2.initOptions(cmdLineOptions)

位于sqlmap.py中第124行,此函数主要作用是初始化conf、kb这两个始终贯穿程序的重要变量(自定义字典),定义在lib\core\option.py模块中,其中conf初始化后有26个键值对,kb初始化后有141个键值对,同时,此函数最后又调用了_mergeOptions函数,用来合并cmdLineParser()的参数以及conf初始化的参数,合并后conf总共有220个键值对。

3.init()

位于sqlmap.py中第141行,此函数主要作用是sqlmap运行的一系列初始化工作,定义在lib\core\option.py模块中,其中主要的作用包括检查依赖包、参数输入合规性检查、设置代理、加载tamper、解析targeturl、设置请求头、设置线程数、加载boundaries_xml、加载payloads_xml等。

4.start()

位于sqlmap.py中第151行,此函数主要作用是开始进行注入检查,判断是否存在SQL注入漏洞,定义在lib\controller\controller.py模块中,此函数是重中之重。start()函数中又调用了几个非常重要的函数,如下。

4.1 setupTargetEnv()

定义在lib\core\target.py模块中,此函数的主要作用是初始化扫描结果环境,包括创建扫描结果存放目录、sqllite3数据库(或者从已有结果中提取数据,对于已扫描的结果不用再扫描)等。

4.2 checkConnection()

位于lib\controller\controller.py中377行,此函数的主要作用是检查给定的url是否可以访问。

4.3 checkWaf()

位于lib\controller\controller.py第380行,此函数的主要作用是判断目标是否有WAF,payload会采用"AND 1=1 UNION ALL SELECT 1,NULL,'<script>alert(\"XSS\")</script>',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#"

4.4 checkStability()

位于lib\controller\controller.py第394行,此函数的主要作用是判断目标target内容是否是会很快变化,其核心是对比第一次访问目标target内容与延时再次访问target内容做比较,如果firstPage == secondPage,则认为页面时稳固的。

4.5 checkDynParam()

位于lib\controller\controller.py第493行,此函数的主要作用是检查给定url中的参数是否是动态的,如果不是动态的则需要选取其它参数。比如name=root,此处的参数则指name。其核心是给参数name另外一个随机值,比如name=2394,然后对比两次返回的页面,如果相似度高于0.98则认为页面内容基本没变,参数不是动态的。

4.6 heuristicCheckSqlInjection()

位于lib\controller\controller.py第516行,此函数的主要作用是一个试探性检查,payload是name=root)((\\'))."(,(或类似),有可能会爆出后端db信息、xss漏洞、文件上包含漏洞等信息。

4.7 checkSqlInjection()

位于lib\controller\controller.py第528行,真正的SQL注入检查,重中之重。此函数会结合xml\payloads\下的基于布尔的、基于时间的、基于错误的、内联查询、对查询、基于union的注入检查xml以及boundaries.xml来提取注入语句进行注入漏洞判断。此处不详细讲解,后期单独说。

OK,说完start()函数中的几个关键函数调用,其中4.2~4.7均在lib\controller\checks.py模块中定义,而它们在checks均会调用的一些核心函数如下:

5. Request.queryPage()

根据构造好的payload访问指定目标web,并对比返回内容与最初页面内容,包含两个重要的函数。位于lib\request\connect.py模块中

5.1 Connect.getPage()

实际访问web的方法,调用了urllib2.Request方法。

5.2 comparison()

此函数主要作用是比较页面内容,判断页面变化,调用了difflib库。

6. agent.payload()

定义于lib\core\agent.py模块中,主要作用是根据xml下的注入表达式生成实际可用的payload,用到了正则、随机数(字符串)等内容。

7. action()

位于lib\controller\controller.py中639行,主要作用是注入SQL,获取指定信息,比如数据库、表、字段、用户、版本等,定义于lib\controller\action.py模块。此模块后期单独列出分享。

SQLMAP源码分析第一章节就先到这吧,不足之处、错误之处后期深入后再处理。

  

  

SQLMAP源码分析(一)的更多相关文章

  1. sqlmap源码分析(一)

    Sqlmap源码分析(一) 此次分析的sqlmap目标版本为1.6.1.2#dev 只对sqlmap的核心检测代码进行详细分析其他的一带而过 sqlmap.py文件结构 为了不让篇幅过长下面只写出了s ...

  2. SQLmap源码分析之框架初始化(一)

    SQLmap是现在搞web人手一个的注入神器,不仅包含了主流数据库的SQL注入检测,而且包含提权以及后渗透模块.基于python2.x开发而成,使用方便.所以研究web安全少不了分析源码,学习代码的同 ...

  3. SQLMAP源码分析-目录结构

    -----------------------------------------------------------------------------│  README.md│  sqlmap.c ...

  4. Python:Sqlmap源码精读之解析xml

    XML <?xml version="1.0" encoding="UTF-8"?> <root> <!-- MySQL --&g ...

  5. MyBatis源码分析(1)-MapConfig文件的解析

    1.简述 MyBatis是一个优秀的轻ORM框架,由最初的iBatis演化而来,可以方便的完成sql语句的输入输出到java对象之间的相互映射,典型的MyBatis使用的方式如下: String re ...

  6. Mybatis源码分析之SqlSessionFactory(一)

    简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...

  7. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  8. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  9. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

随机推荐

  1. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  2. Codeforces - Avito Code Challenge 2018

    Portal A. Antipalindrome 暴力. B. Businessmen Problems 暴力. C. Useful Decomposition 居然不是C打头的?! 将一棵树划分成若 ...

  3. 兼容ie8 rgba()写法

    background: rgba(255,255,255,.1); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#1 ...

  4. adb shell am命令

    adb shell am命令是在cmd命令行可以通过命令来启动Activity,Boradcast,Service等,更多使用可以参考下面附件. 比如在cmd串口我们发送广播,广播action是&qu ...

  5. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  6. Milk Patterns(poj 3261)

    题意:找出出现k次的可重叠的最长子串的长度. /* 求出height数组,二分答案,将height分组,看有没有一组个数大于K. WA了很多遍,最后看别人的题解,发现往字符串后面填了一个0,就可以AC ...

  7. 洛谷 [P1948] 电话线

    二分答案 首先,最大值最小,就是二分答案 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  8. 【CF505D】Mr. Kitayuta's Technology

    题目大意: 在一个有向图中,有n个顶点,给出m对数字(u,v)表示顶点u和顶点v必须直接或者间接相连,让你构造一个这样的图,输出最少需要多少条边. 挖坑待填 官方题解链接:http://codefor ...

  9. 编写webconfig连接串与使用(新)

    原文发布时间为:2008-07-27 -- 来源于本人的百度文章 [由搬家工具导入] webconfig 中<appSettings/> 得后面代码添加如下: <appSetting ...

  10. unix网络编程第2章

    time_wait状态  可靠地实现tcp全双工连接的终止; (假设客户端先关闭).服务端再关闭,服务端将发送fin ,客户端此时进入time_wait状态.客户端接收到fin.将回一个ack.如果这 ...