Command Injection
这一节讲的是命令注入攻击。该攻击对任何一个以参数驱动的站点来说都是一个严重威胁。如下图所示:
该页面就是一个选择所需查看的文档,然后下方显示文档内容的页面。其存在的漏洞就是后台可以执行用户输入的命令,当我们拦截之后,修改参数如下:
可以看到把我们服务器所开端口情况全部显示出来了:
Blind SQL Injection
这一节主要讲盲注入,某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
如下图:
这个输入框输入不同的数字他会给不同的反应。它会提示你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
这节讲数字型注入攻击,如下图这是一个选择城市,然后出来相应天气预报的页面:
通过截取数据分析发现,所提交的是城市的数字代码,我们把state字段改为如下即可以了:
最后攻击成功:
Log Spoofing
这节讲登陆欺骗,如图所示,这是一个登陆的页面,下面灰色部分是后台日志:
现在是要求欺骗后台日志,也就是说一个人明明没有登陆进去,但它要在后台日志记录中显示登陆进去了。
因此可以插入如下内容:
Smith%0d%0aLogin Succeeded for username: admin
最后日志上面会显示成这样:
这主要是说用户注入内容到后台日志中了。
而当输入如下内容时:1
admin <script>alert(document.cookie)</script>
页面会显示如下:
XPATH Injection
如下图所示,下面页面是输入账户名和密码查询工资的页面:
我们的目标是看到其他员工的工资。XPATH 注入类似于SQL注入。通过未验证的输入创建一个XPATH 查询。
一般的XPATH查询,其页面代码如下:1
2
3
4
5
6
7String 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’ ) ]”
浏览器显示页面为:
攻击成功。
SQL Injection
Stage 1
第一步是字符串注入,要求以Neville的用户名,密码不知道的情况下登陆:
因此需要拦截之后修改(一定要拦截后修改,因为直接在浏览器输入会有转义):
这样就可以顺利进入了。
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
这一节需要我们以普通用户的身份看到老板的简介:
先以普通用户Larry的身份登陆进去:
再点击ViewProfile进行抓包,后修改:
最后提交看到老板简介:
Stage 4
这部分需要通过参数化查询防止这类攻击,与Stage 2的方法差不多。
String SQL Injection
如下图所示是一个输入姓名查银行卡的页面:
要求我们把所有人的银行卡信息都显示出来。输入如下代码:
Smith’ or 1=1 –
成功了:
Database Backdoors
这一节讲的数据库后门攻击。数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert, select, update or delete。举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
正常情况下在如下页面输入工号,进行查询一些信息:
后来发现客户端输入的查询语句没有在服务器端进行验证。
当我们输入如下代码时:
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注入需要对数据库熟悉,并且对后台代码了解,内容还是比较多的。
【版权声明】
本文首发于戚名钰的博客,欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:qimingyu.security@foxmail.com
欢迎关注我的微信公众号:科技锐新
本文永久链接:http://qimingyu.github.io/2016/05/06/Webgoat之Injection_Flaws/