说起来,学习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模块来解析脚本传入的参数,定义在libparsecmdline.py模块中,使用sqlmap工具的小伙伴们会在此发现很多常见的命令,比如-u -d --random-agent –current-db --dbs --tables --columns等等,在此版本中实际是有194个参数的,这么丰富的功能,有待挖掘啊!
2.initOptions(cmdLineOptions)
位于sqlmap.py中第124行,此函数主要作用是初始化conf、kb这两个始终贯穿程序的重要变量(自定义字典),定义在libcoreoption.py模块中,其中conf初始化后有26个键值对,kb初始化后有141个键值对,同时,此函数最后又调用了_mergeOptions函数,用来合并cmdLineParser()的参数以及conf初始化的参数,合并后conf总共有220个键值对。
3.init()
位于sqlmap.py中第141行,此函数主要作用是sqlmap运行的一系列初始化工作,定义在libcoreoption.py模块中,其中主要的作用包括检查依赖包、参数输入合规性检查、设置代理、加载tamper、解析targeturl、设置请求头、设置线程数、加载boundaries_xml、加载payloads_xml等。
4.start()
位于sqlmap.py中第151行,此函数主要作用是开始进行注入检查,判断是否存在SQL注入漏洞,定义在libcontrollercontroller.py模块中,此函数是重中之重。start()函数中又调用了几个非常重要的函数,如下。
4.1 setupTargetEnv()
定义在libcore arget.py模块中,此函数的主要作用是初始化扫描结果环境,包括创建扫描结果存放目录、sqllite3数据库(或者从已有结果中提取数据,对于已扫描的结果不用再扫描)等。
4.2 checkConnection()
位于libcontrollercontroller.py中377行,此函数的主要作用是检查给定的url是否可以访问。
4.3 checkWaf()
位于libcontrollercontroller.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()
位于libcontrollercontroller.py第394行,此函数的主要作用是判断目标target内容是否是会很快变化,其核心是对比第一次访问目标target内容与延时再次访问target内容做比较,如果firstPage == secondPage,则认为页面时稳固的。
4.5 checkDynParam()
位于libcontrollercontroller.py第493行,此函数的主要作用是检查给定url中的参数是否是动态的,如果不是动态的则需要选取其它参数。比如name=root,此处的参数则指name。其核心是给参数name另外一个随机值,比如name=2394,然后对比两次返回的页面,如果相似度高于0.98则认为页面内容基本没变,参数不是动态的。
4.6 heuristicCheckSqlInjection()
位于libcontrollercontroller.py第516行,此函数的主要作用是一个试探性检查,payload是name=root)((\'))."(,(或类似),有可能会爆出后端db信息、xss漏洞、文件上包含漏洞等信息。
4.7 checkSqlInjection()
位于libcontrollercontroller.py第528行,真正的SQL注入检查,重中之重。此函数会结合xmlpayloads下的基于布尔的、基于时间的、基于错误的、内联查询、对查询、基于union的注入检查xml以及boundaries.xml来提取注入语句进行注入漏洞判断。此处不详细讲解,后期单独说。
OK,说完start()函数中的几个关键函数调用,其中4.2~4.7均在libcontrollerchecks.py模块中定义,而它们在checks均会调用的一些核心函数如下:
5. Request.queryPage()
根据构造好的payload访问指定目标web,并对比返回内容与最初页面内容,包含两个重要的函数。位于lib equestconnect.py模块中
5.1 Connect.getPage()
实际访问web的方法,调用了urllib2.Request方法。
5.2 comparison()
此函数主要作用是比较页面内容,判断页面变化,调用了difflib库。
6. agent.payload()
定义于libcoreagent.py模块中,主要作用是根据xml下的注入表达式生成实际可用的payload,用到了正则、随机数(字符串)等内容。
7. action()
位于libcontrollercontroller.py中639行,主要作用是注入SQL,获取指定信息,比如数据库、表、字段、用户、版本等,定义于libcontrolleraction.py模块。此模块后期单独列出分享。
SQLMAP源码分析第一章节就先到这吧,不足之处、错误之处后期深入后再处理。