Webgoat之Injection Flaws

Command Injection

这一节讲的是命令注入攻击。该攻击对任何一个以参数驱动的站点来说都是一个严重威胁。如下图所示:
1

该页面就是一个选择所需查看的文档,然后下方显示文档内容的页面。其存在的漏洞就是后台可以执行用户输入的命令,当我们拦截之后,修改参数如下:
2
可以看到把我们服务器所开端口情况全部显示出来了:
3

Blind SQL Injection

这一节主要讲盲注入,某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
如下图:
4
这个输入框输入不同的数字他会给不同的反应。它会提示你Account Number是正确的还是错误的。
输入如下代码:

1
101 and ( ascii( substr(select first_name from user_data where userid=15613,1,1) ) < 77 )

从user_data数据库表中把userid字段等于15613的名字找出来,然后求其字符子串,从第一个字符开始截取,截取一个字符长度,这样得到的是名字的一个字母,然后求其ascii值,与77比较,整条语句判断真假。
就这样一个个试,可以得到第一个字母是J,第二个字母是o,最后得到Joesph输入,返回正确。

Numeric SQL Injection

这节讲数字型注入攻击,如下图这是一个选择城市,然后出来相应天气预报的页面:
6
通过截取数据分析发现,所提交的是城市的数字代码,我们把state字段改为如下即可以了:
7
最后攻击成功:
5

Log Spoofing

这节讲登陆欺骗,如图所示,这是一个登陆的页面,下面灰色部分是后台日志:
8
现在是要求欺骗后台日志,也就是说一个人明明没有登陆进去,但它要在后台日志记录中显示登陆进去了。
因此可以插入如下内容:

Smith%0d%0aLogin Succeeded for username: admin

最后日志上面会显示成这样:
9
这主要是说用户注入内容到后台日志中了。
而当输入如下内容时:

1
admin <script>alert(document.cookie)</script>

页面会显示如下:
10

XPATH Injection

如下图所示,下面页面是输入账户名和密码查询工资的页面:
11
我们的目标是看到其他员工的工资。XPATH 注入类似于SQL注入。通过未验证的输入创建一个XPATH 查询。
一般的XPATH查询,其页面代码如下:

1
2
3
4
5
6
7
String dir = s.getContext().getRealPath("/lessons/XPATHInjection/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);

当我们在浏览器中输入如下内容时:

Smith’ or 1=1 or ‘a’=’a

则服务器获取的数据为:

expression = “/employees/employee[loginID/text()=’Smith’ or 1=1 or ‘a’=’a’ and passwd/text()=’password’]”

服务器解析后的结果为:

expression = “/employees/employee[ ( loginID/text()=’Smith’ or 1=1 ) OR ( ‘a’=’a’ and passwd/text()=’password’ ) ]”

浏览器显示页面为:
12
攻击成功。

SQL Injection

Stage 1

第一步是字符串注入,要求以Neville的用户名,密码不知道的情况下登陆:
16
因此需要拦截之后修改(一定要拦截后修改,因为直接在浏览器输入会有转义):
17
这样就可以顺利进入了。

Stage 2

这部分需要我们使用参数化查询阻止SQL注入。但是这部分内容只有在开发版上才能完成,我用的是标准版。
应该修改webgoat/lessons/SQLInjection/ViewProfile.java文件中的getEmployeeProfile方法,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12

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.getConnections(s);
PreparedStatement statement = connection.prepareStatement(query,
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
statement.setString(1, userId);
statement.setString(2, subjectUserId);
ResultSet answer_results = statement.executeQuery();

}

Stage 3

这一节需要我们以普通用户的身份看到老板的简介:
20
先以普通用户Larry的身份登陆进去:
21
再点击ViewProfile进行抓包,后修改:
19
最后提交看到老板简介:
18

Stage 4

这部分需要通过参数化查询防止这类攻击,与Stage 2的方法差不多。

String SQL Injection

如下图所示是一个输入姓名查银行卡的页面:
13
要求我们把所有人的银行卡信息都显示出来。输入如下代码:

Smith’ or 1=1 –

成功了:
14

Database Backdoors

这一节讲的数据库后门攻击。数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert, select, update or delete。举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
正常情况下在如下页面输入工号,进行查询一些信息:
15
后来发现客户端输入的查询语句没有在服务器端进行验证。
当我们输入如下代码时:

101; update employee set salary=10000

服务器为我们执行了更新。
因此我们可以创建如下触发器:

101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=’john@hackme.com’ WHERE userid = NEW.userid

使没创建一个新用户的时候,自动为其填充为我们所希望的邮箱。

Summarize

SQL注入需要对数据库熟悉,并且对后台代码了解,内容还是比较多的。


【版权声明】
本文首发于戚名钰的博客http://qimingyu.github.io/ ),欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:mingyuqi.java@qq.com
欢迎关注我的微信公众号:科技锐新

本文永久链接:http://qimingyu.github.io/2016/05/06/Webgoat之Injection_Flaws/

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章