N1BOOK [第一章 web入门]SQL注入-1:从靶场到实战的字符型注入通关详解
1. 初识SQL注入从靶场到实战的入门指南第一次接触SQL注入时我完全被这个神奇的攻击方式吸引了。简单来说SQL注入就是通过构造特殊的输入让网站的后台数据库执行我们想要的SQL语句。这就像是你去餐厅点餐本来应该说我要一份牛排结果你说了句我要一份牛排然后把整个厨房的菜都给我端上来而服务员居然真的照做了在Buuctf-N1BOOK这个靶场中我们遇到的正是典型的SQL注入挑战。打开题目页面你会看到一个简单的网页URL里有个明显的id参数比如?id1。这种带参数的URL在Web开发中非常常见也正是SQL注入最容易出现的地方。作为新手我们需要一步步来验证这里是否存在注入漏洞。2. 判断注入类型字符型还是数字型2.1 基础探测手法我刚开始学习时最困惑的就是如何判断注入类型。其实方法很简单就像做科学实验一样通过不同的输入观察输出结果。对于这个靶场我是这样测试的首先尝试数字型注入测试and 11-- // 回显正常 and 12-- // 回显正常发现两个都正常显示说明可能不是简单的数字型注入。然后尝试字符型注入测试 and 11-- // 回显正常 and 12-- // 回显不正常这次发现第二个语句的回显出问题了这就明确告诉我们这是一个字符型注入漏洞2.2 为什么单引号这么重要这里的关键在于理解SQL语句的构造方式。网站后台的SQL查询可能是这样的SELECT * FROM articles WHERE id用户输入的id值当我们输入 and 11--时实际执行的SQL变成了SELECT * FROM articles WHERE id and 11----是SQL中的注释符号它会注释掉后面的内容所以实际执行的是SELECT * FROM articles WHERE id and 11这个条件永远为真所以页面正常显示。而当输入 and 12--时条件永远为假页面就不显示正常内容了。这种差异正是我们判断注入类型的依据。3. 确定字段数量order by的妙用3.1 逐步试探法知道是字符型注入后下一步要确定查询返回的字段数量。这里我常用的方法是order by它就像是SQL中的排序指令但在这里被我们用来探测字段数。具体操作如下 order by 3 -- // 回显正常 order by 4 -- // 页面报错当order by 4时报错说明这个查询只返回3个字段。这个数字很重要因为后续的联合查询必须匹配这个字段数。3.2 为什么order by能判断字段数这是因为order by后面跟的数字表示按第几列排序。如果表只有3列你要求按第4列排序数据库当然会报错。这种报错信息虽然对用户不友好但对我们安全测试者来说却是宝贵的信息源。4. 联合查询实战获取数据库信息4.1 获取当前数据库名有了字段数信息就可以使用联合查询(union select)来获取更多信息了。我的操作步骤是-1 union select 1,database(),3 --这里有几个技巧使用-1是为了让前一个查询不返回结果这样页面就会显示我们union select的内容database()函数返回当前数据库名1和3是占位符因为我们需要匹配3个字段执行后页面通常会显示当前数据库的名称这是我们后续操作的基础。4.2 查询所有表名知道数据库名后下一步就是查看这个数据库中有哪些表。这里要用到information_schema这个特殊的数据库它存储了所有数据库的元信息。我使用的payload是?id0 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemadatabase()--这个查询做了以下几件事从information_schema.tables表中查询数据只查询当前数据库(table_schemadatabase())的表用group_concat把多个表名合并成一个字符串返回把结果放在第3个字段位置显示执行后页面会显示当前数据库中的所有表名。在这个靶场中我们看到了两个表其中一个明显是fl4g这很可能就是存放flag的表。5. 获取flag最后的冲刺5.1 查询表结构确定了flag可能在fl4g表后我们需要知道这个表有哪些列。使用如下payload?id0 union select 1,2,group_concat(column_name) from information_schema.columns where table_schemadatabase() and table_namefl4g--这个查询从information_schema.columns表中获取fl4g表的所有列名。执行后发现有个列名叫fllllag这很可能就是存放flag的列。5.2 获取最终flag现在万事俱备只需要查询这个列的内容即可?id-4 union select 1,database(), group_concat(fllllag) from fl4g --这个查询使用-4确保原查询不返回结果从fl4g表中选择fllllag列的内容用group_concat合并结果将结果显示在第3个字段位置执行后flag就会清晰地显示在页面上恭喜你完成了这次SQL注入挑战6. 防御措施与学习建议虽然我们成功利用了这个漏洞但更重要的是理解如何防御。作为开发者应该始终使用参数化查询或预处理语句。而作为学习者我建议先系统学习SQL语法理解各种语句的执行原理在本地搭建测试环境使用DVWA等漏洞演练平台练习了解各种注入类型盲注、时间注入、报错注入等学习使用sqlmap等自动化工具但一定要明白其原理我在刚开始学习时经常因为一个单引号的位置错误而调试半天。但正是这些实践中的挫折让我对SQL注入有了更深刻的理解。记住每个优秀的白帽子都是从这样的靶场练习开始的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2446136.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!