目前WebGoat通关攻略与详细解析处于持续更新中,若大家在阅读的过程中发现什么问题或者有什么建议,都可以在发布在评论区或私信我,我们一起共同探讨!
由于所有通关攻略写在一起导致篇幅太长,所以,我按照一个小结发布一篇,方便大家阅读。
最后我会为大家发布完整版和只有答案的完整版,有需要的小伙伴可以关注一下。
此模块主要对SQL注入进行简介和简单的练习。
什么是SQL语句呢,没有接触过的小伙伴们,可以先去网上查找一下资料,对其做一个初步的了解。
首先我们来看此模块的第一个测试题:
题目给了我们一张员工表,包含一些字段和几条数据如下所示:

可以看出,employees表中包含了6个字段,5条数据。我们来看题目的要求是什么

题目要求:
查看示例表,尝试检索出员工Bob Franco所在的部门。题目告诉我们已被授予所有管理权限,无需身份认证便可以访问所有数据。
那么问题简单了,我们只需要使用简单的SELECT语句便可以完成此题。本题使用的SELECT语句语法如下:
SELECT [列名] FROM [表名] where [列名] = {?}
其中:
从题目中可知,我们需要检索的列名为department,需要在employees这张表中查询数据,条件是first_name = ‘Bob’ and last_name = ‘Franco’。找出SQL中需要填写的数据后,我们开始编写SQL语句。
我们看到first_name字段只有一个Bob,所以我们可以使用下述SQL完成题目需求。
通关答案:
SELECT ep.department from employees ep where ep.first_name = 'Bob'
当然,你也可以严谨一些。
SELECT ep.department from employees ep where ep.first_name = 'Bob' and ep.last_name = 'Franco'
DML:数据库操作语言,用户存储、检索、修改和删除数据库中的数据,包含:
题目要求:

解题思路:
题目让我们尝试去将员工Tobi Barnett所在的部门修改为Sales。题目告诉我们已被授予所有管理权限,无需身份认证便可以访问所有数据。
既然是修改数据,那么就要使用SQL中的UPDATE语句,本题要使用的UPDATE语法如下:
UPDATE [表名] SET [列名] = [新值] WHERE [列名] = {?}
其中:
从题目中的得知,我们要修改的表名为上一题的示例表employees,需要修改的列名为department,将department修改为Sales,修改谁的呢?修改first_name = 'Tobi ’ and last_name = 'Barnett’的。找出数据后,我们开始编写SQL。
通关答案:
查看源数据库表发现first_name = 'Tobi’的只有一条数据,所以,我们可以使用下条SQL完成本题:
UPDATE employees ep SET ep.department = 'Sales' WHERE ep.first_name = 'Tobi '
当然,还是建议大家严谨一点:
UPDATE employees ep SET ep.department = 'Sales' WHERE ep.first_name = 'Tobi ' AND ep.last_name = 'Barnett'
DDL:数据库定义语言
包括:
题目要求:

解题思路:
题目要求我们去尝试将列“phone”增加到表employees中,列“phone”的数据类型为varchar(20)。本题考察的是对数据库定义语言的使用,修改现有数据库表结构的SQL要用到ALTER语句。
本题所用的ALTER语句如下:
ALTER TABLE [表名] ADD [新字段名] [数据类型];
其中:
我们从题目中获取到须填写的数据,其中表名为employees,新字段名为phone,数据类型为varchar(20),通过上述的SQL语法编写SQL语句:
通关答案:
ALTER TABLE employees ADD phone varchar(20);
DCL:数据控制语言,用于创建用户和管理用户
包括:
题目要求:

解题思路:
题目要求我们尝试授予“UnauthorizedUser”更改表的权限。授予用户权限就要用到DCL中的GRANT语句,本题所用的GRANT语法如下:
此处语法与详细内容参考CSDN博主「__Samual」的原创文章
原文链接:https://blog.csdn.net/m0_61491995/article/details/125755818
GRANT [权限] on [数据库名称.表名称] to [用户名@用户地址]
其中:
| 可填写权限 | 说明 |
|---|---|
| ALL | 所有可用的权限 |
| CREATE | 创建数据库、表、索引 |
| LOCK_TABLES | 锁定表 |
| ALTER | 修改表 |
| DELETE | 删除表 |
| INSERT | 插入表或列 |
| SELECT | 检索表或列的数据 |
| CREATE_VIEW | 创建视图 |
| SHOW_DATABASES | 列出数据库 |
| DROP | 删除库、表和视图 |
按照题目要求,编写SQL如下所示:
通关答案:
GRANT ALTER TABLE TO UnauthorizedUser
本节主要简述什么是SQL注入。
SQL注入是一种常见的网络黑客技术,SQL注入攻击通过从客户端到应用程序的SQL查询语句中注入查询或插入的恶意代码。如果处理不当,让恶意代码注入应用程序可能会对数据完整性和安全性等产生严重影响。
后续为大家举了一个栗子,大家可以在下图所示的输入框中输入下方红色的代码,查看输入框下方的SELECT语句的变化,理解SQL注入的过程。

举个栗子:
查看页面上描述,可以看到,原代码如下所示。
"SELECT * FROM users WHERE name = '" + userName + "'"
通过这句代码,我们不难看出,这是一条通过用户名去查询该用户名在users表中数据的查询语句,其中" + userName + “为变量,用户在下方的输入框中输入的信息就会取代” + userName + "。

例如:
我们要查询Smith的用户信息,那么我们只需要在输入框中输入“Smith”,查询语句如下:

不难看出当前的查询语句的效果为从表users中查询名为Smith用户的信息。
但时,当我们在输入框中输入Smith’ OR ‘1’ ='1 可以看到:

SQL语句变成了:
"SELECT * FROM users WHERE name = 'Smith' OR '1' = '1' "
我们来一起解读下注入后的SQL语句:
“从表users中查询名为Smith或者1=1的用户信息”
众所周知 1 = 1 在正常情况下永远成立,两个查询条件之间使用OR连接,表示只要一个为真,整个表达式则为真。
所以这条SQL语句变成了查询所有用户的所有信息,这就会造成用户信息的泄露,这就是SQL注入。
此题为SQL注入的实践题,大家可以在这里尝试一下各种选项查询出来的不同结果。
题目要求:

解题思路:
题目要求我们通过下面的下拉框选择相关的数据,检索出users表中的所有用户信息,我们无需知道任何特定的用户名就可以得到完整的列表。
首先,我们查看原代码是让我们输入lastName

其次,我们查看该字段的格式为’ “+ lastName +” ’
之后,我们进行分析如何注入:
最后:我们选择注入的内容,尝试结果是否正确:
通关答案:

结果:

我们成功的获取了所有用户的信息,注入攻击成功!
数字SQL注入
题目要求:

解题思路:
题目要求我们使用两个输入字段,尝试从用户表中检索所有数据。并且这两个字段中,只有一个容易受到SQL注入的影响,需要找出是哪一个,才能成功检索出所有数据。
首先,查看原代码:

SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = '' + User_ID;
其次:确认需要输入的字段为:
之后:分析如何注入:
最后:输入分析出的结果进行测试
通关答案:

结果

注入成功!
使用字符串类型的SQL注入破坏应用程序的机密性测试题。
题目要求:

题目告诉我们:
我是个在大厂打工的叫John Smith的打工仔,这个公司有一个内部系统,用来让所有员工查看自己的内部数据(工作的部门和薪水)。该系统要求员工用唯一的身份验证TAN来查看数据,我的TAN为3SL99A。
现在,我觉得我老厉害了,我要确认自己是不是这个公司收入最高的打工仔,那么我就要查看所有打工仔工资。
现在,我已经扒出来了请求的查询语句为:
SELECT * FROM employees WHERE last_name = ' " + nane +" ' AND auth_tan = ' " + auth_tan " '
那么,怎样才能让我清醒清醒呢?
解题思路:
看完题目后,我们将目光放在SQL语句上:
首先:找到可能存在SQL注入漏洞的位置:我们发现,这两个位置都包含单引号’',都有可能受到SQL注入的攻击,由于两个条件之间用AND连接,所以那么我们需要将恶意代码注入到其中第二个即可;
其次:注入内容和方式:很明显,这是字符串注入,根据我们之前的注入经验,编写注入数据。只需要将OR 1 = 1注入则就会成功。
最后:输入数据并测验:(其实只要我们成功注入了OR 1 = 1,那么其他数据可以随意填写,并不需要填写数据里表中已存在的数据)
通关答案:

结果:

题目要求:

上集概要:我为了知道我的工资是不是最高的,对公司内部系统进行了SQL注入攻击,获取到了所有的员工信息,如下图所示。
本集看点:我非法获取到所有员工的工资信息后,没想到真的有两个打工仔比我的工资高,他们就是Tobi和Bob。这我怎么能忍,既然犯法的事情都做了,那不如更进一步,我的脑海中冒出了修改自己的工资的念头,那么问题来了,我该怎么通过SQL注入修改自己的工资呢?(非法行为,请勿模仿!!这行为多多少少有点把别人当傻子了)

解题思路:
好了,我们来看我们上一题获取到的非法数据,我的工资为64350,而比我高的Tobi和Bob的工资分别是77000和83700。
现在我们只能通过系统提供的查询接口完成修改工资的违法行为,那么就意味着我们需要注入UPDATE语句。
首先:确认输入的字段:
其次:明确需要注入的语句为:
UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'
之后:确认注入内容:
由上题的分析可知,我们需要将UPDATE语句注入到Authentication Tan中,编写需要注入的任意代码即可。
最后,执行代码,查看结果。
通关答案:
1'; UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'; --
结果

后记:
别问为什么他们的工资都变成10000了,问就是他们不配,哼~
SQL注入影响可用性。
题目要求:

上集概要:我在犯法的道路上越走越远,在非法获取到他们的工资后,我嫉妒两个打工仔的工资比我高,所以,我通过非法的手段,将我的工资修改到最高。
本集看点:我成功将我的工资修改到最高,但是,access_log表将我的操作全部记录在其中,事到如今,我只能一不做二不休,今晚恰巧是一个月黑风高夜……
解题思路:
首先:确认要做的事情:删除表access_log
其次:确认要注入的语句:轻车熟路,需要注入:
DROP TABLE access_log
之后:确认注入恶意代码格式和内容:
1';DROP TABLE access_log;--
最后,执行代码。查看结果
通关答案:
1';DROP TABLE access_log;--
结果:

我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315
我使用的第一个解析器生成器是Parse::RecDescent,它的指南/教程很棒,但它最有用的功能是它的调试工具,特别是tracing功能(通过将$RD_TRACE设置为1来激活)。我正在寻找可以帮助您调试其规则的解析器生成器。问题是,它必须用python或ruby编写,并且具有详细模式/跟踪模式或非常有用的调试技术。有人知道这样的解析器生成器吗?编辑:当我说调试时,我并不是指调试python或ruby。我指的是调试解析器生成器,查看它在每一步都在做什么,查看它正在读取的每个字符,它试图匹配的规则。希望你明白这一点。赏金编辑:要赢得赏金,请展示一个解析器生成器框架,并说明它的
我有这样的HTML代码:Label1Value1Label2Value2...我的代码不起作用。doc.css("first").eachdo|item|label=item.css("dt")value=item.css("dd")end显示所有首先标记,然后标记标签,我需要“标签:值” 最佳答案 首先,您的HTML应该有和中的元素:Label1Value1Label2Value2...但这不会改变您解析它的方式。你想找到s并遍历它们,然后在每个你可以使用next_element得到;像这样:doc=Nokogiri::HTML(
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::