尝试去读SQLMAP源码

Posted 烤红薯咖啡馆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试去读SQLMAP源码相关的知识,希望对你有一定的参考价值。

本人python 小菜比 一枚。拜读业界典范~~

阅读sqlmap 的版本是1.1.6,目前应该是最新版。

sqlmap.py 脚本中 72~83

def modulePath():
    """
    This will get us the program\'s directory, even if we are frozen
    using py2exe
    """

    try:
        _ = sys.executable if weAreFrozen() else __file__
    except NameError:
        _ = inspect.getsourcefile(modulePath)

    return getUnicode(os.path.dirname(os.path.realpath(_)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)

modulePath 按照名字来看,应该是和路径相关的。

sys.executable 获取当前python 解释器路径。

__file__ 相对路径下执行获得相对路径,绝对路径下执行获得绝对路径。

weAreFrozen() 这个函数在这里,hasattr 获取sys 中是否存在这个frozen属性,返回一个布尔值。

文件在这里:lib/core/common.py  代码如下:

小技巧:Python获得自己的绝对路径
Python中有个魔术变量可以得到脚本自身的名称,但转换成exe后该变量失效,这时得改用sys.executable获得可执行程序的名称,可用hasattr(sys, "frozen")判断自己是否已被打包,下面是一个方便取绝对路径的。

 

为了搞明白,然后做了测试。

 

 继续更新了,周末更新好,结果手一抖关了。真糗。

 翻页看的太累了。代码如下:

def modulePath():
    """
    This will get us the program\'s directory, even if we are frozen
    using py2exe
    """

    try:
        _ = sys.executable if weAreFrozen() else __file__
    except NameError:
        _ = inspect.getsourcefile(modulePath)

    return getUnicode(os.path.dirname(os.path.realpath(_)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)

inspect.getsourcefile(modulePath)  查找modulePath的导入路径。

return getUnicode(os.path.dirname(os.path.realpath(_)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)

 os.path.dirname(os.path.realpath(_))  返回绝对路径

sys.getfilesystemencoding() 本地编码

UNICODE_ENCODING 这个需要找到 lib/core/settings.py 中的

getUnicode:

文件在这里:lib/core/common.py  代码如下:

def getUnicode(value, encoding=None, noneToNull=False):
    """
    Return the unicode representation of the supplied value:

    >>> getUnicode(u\'test\')
    u\'test\'
    >>> getUnicode(\'test\')
    u\'test\'
    >>> getUnicode(1)
    u\'1\'
    """

    if noneToNull and value is None:
        return NULL

    if isinstance(value, unicode):
        return value
    elif isinstance(value, basestring):
        while True:
            try:
                return unicode(value, encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODING)
            except UnicodeDecodeError, ex:
                try:
                    return unicode(value, UNICODE_ENCODING)
                except:
                    value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]
    elif isListLike(value):
        value = list(getUnicode(_, encoding, noneToNull) for _ in value)
        return value
    else:
        try:
            return unicode(value)
        except UnicodeDecodeError:
            return unicode(str(value), errors="ignore")  # encoding ignored for non-basestring instances

看到亲切的注释,返回以unicode转换后的结果。

if noneToNull and value is None:
        return NULL

开始判断noneToNull和value 是否为空。

if isinstance(value, unicode):
        return value

然后isinstance python中内置方法,判断unicode类型。

elif isinstance(value, basestring):
        while True:
            try:
                return unicode(value, encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODING)
            except UnicodeDecodeError, ex:
                try:
                    return unicode(value, UNICODE_ENCODING)
                except:
                    value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

其次basestring检查unicode对象。

红色标记是没看懂的。

encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODIN  

value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

 

elif isListLike(value):
        value = list(getUnicode(_, encoding, noneToNull) for _ in value)
        return value

再次遍历列表,通过递归getUnicode批量转换编码。

else:
        try:
            return unicode(value)
        except UnicodeDecodeError:
            return unicode(str(value), errors="ignore")  # encoding ignored for non-basestring instances

最后unicode转码返回,并且忽略错误。

 

将不懂部分搞明白,再继续。

 

以上是关于尝试去读SQLMAP源码的主要内容,如果未能解决你的问题,请参考以下文章

整理篇(sqlmap 源码分析os-shell 原理攻防角度使用sqlmap)

整理篇(sqlmap 源码分析os-shell 原理攻防角度使用sqlmap)

整理篇(sqlmap 源码分析os-shell 原理攻防角度使用sqlmap)

python的源码值得去读吗

SQLmap源码分析之框架初始化

SQLMAP源码分析-目录结构