欢迎来到网络对抗路 实验八 Web综合
《网络对抗技术》Exp8 Web综合
实践目标及内容
实践内容
(1)Web前端HTML(0.5分)
能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。
(2)Web前端javascript(0.5分)
理解JavaScript的基本功能,理解DOM。编写JavaScript验证用户名、密码的规则。
(3)Web后端:MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表(0.5分)
(4)Web后端:编写PHP网页,连接数据库,进行用户认证(0.5分)
(5)最简单的SQL注入,XSS攻击测试(0.5分)
(6)选做Webgoat或类似平台的SQL注入、XSS、CSRF攻击各一例
实践步骤
Web前端HTML
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。
- Kali默认安装好了Apache,在kali上可以使用命令
sudo service apache2 start
打开Apache服务器。如果没有任何错误提示即成功开启
此时在浏览器中输入“127.0.0.1”即可打开Apache的默认网页。
- 输入
cd /var/www/html
进入到Apache目录下,新建html文件form_test.html
,内容如下:
<html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title>This a test for form</title> <link href="login.css" rel="stylesheet" type="text/css"/> </head> <body> <div id="login"> <h1>Login</h1> <center> <form action="login" method="post"> <input type="text" placeholder="用户名" name="username" id="uname" required="required" autocomplete="off"> <br> </br> <input type="password" placeholder="密码" name="password" required="required" autocomplete="off"> <br> </br> <button class="but" type="reset">重置</button> <button class="but"type="submit">登录</button> </form> </center> </div> </body> </html>
3. 在浏览器地址栏中输入`/var/www/html/form_test.html` 打开我们新建的网页。
Web前端javascript
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言。它作为开发Web页面的脚本语言而出名。
- 在原有的form_test.html的基础上可以添加一段JavaScript代码。实现诸如输入检查的效果。例如输入用户名只能由英文和数字组成,不能输入汉字,即可通过javascript来实现相关检查:
- 在浏览器地址栏中输入
/var/www/html/form_test.html
,效果如下:
Web后端 MySQL基础
- kali已经默认安装好了MySQL,直接输入
systemctl start mysqld
开启MySQL服务: - 输入
mysql -u root -p
使用root权限进入,默认的密码为password
- 输入
show databases;
可以查看数据库的基本信息:
- 输入
use mysql;
选择使用mysql这个数据库
- 输入
select user,password,host from user;
查看当前用户信息:
- 输入
flush privileges;
- 输入exit退出数据库,使用新密码进行登录
- 输入
create database fomalhaut;
建立数据库fomalhaut:
- 再次查看数据库可以发现新建的fomalhaut数据库:
- 使用我们刚刚创建的数据库:
- 输入
create table 表名 (字段设定列表);
建立数据库表,并设置字段基本信息:
- 输入
show tables;
查看表信息:
- 输入
insert into 表 value ('value1','vlue2');
向表中插入信息
- 输入
select * from user;
可以查看user表中的数据,这里我们可以看到我们刚刚插入的信息。
- 使用
grant select,insert,update,delete on 数据库.* to 用户名@登录主机(可以是localhost,也可以是远程登录方式的IP) identified by "密码";
(即将对整个数据库的select,insert,update,delete权限都赋给新用户)在MySQL中增加新用户
- 现在我们可以通过新用户进行登录了
Web后端 编写PHP网页
- 在
/var/www/html
目录下新建测试文件phptest.php
,输入以下内容:
<?php echo ($_GET["a"]); include($_GET["a"]); echo "Hello word! I am 20181208 liang<br>"; ?>
- 在浏览器地址栏输入
127.0.0.1/phptest.php
,查看php内容:
- 可以在浏览器地址栏输入
localhost:80/phptest.php?a=/etc/passwd
,可以看到/etc/passwd文件的内容:
- 在
/var/www/html
目录下新建login.php
输入以下内容:
<?php $uname=$_POST["Name"]; $pwd=$_POST["Password"]; echo $uname; $query_str="SELECT * FROM login where username='$uname' and password='$pwd';"; $mysqli = new mysqli("127.0.0.1", "yy20175308", "20175308", "fomalhaut"); $query_str1="fomalhaut;";/ check connection /if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
echo "connection ok!";
/ Select queries return a resultset /if ($result = $mysqli->query($query_str1))
echo"<br>Success into database!";
echo$uname;
if ($result = $mysqli->query($query_str)) {
if ($result->num_rows > 0 ){
echo "<br> {$uname}:Welcome!!! <br> ";
}
else {
echo "<br> login failed!!!! <br> " ; }
/ free result set /
$result->close();
}
$mysqli->close();
?>
然后回到form_test.html将form表单中的action修改为“login.php”
5. 直接在浏览器内输入127.0.0.1/login.php,连接数据库成功,但因为没有输入用户名密码,所以登录失败
6. 先打开form_test.php,完成登录操作再跳转到login.php时会显示登录成功:
最简单的SQL注入,XSS攻击测试
SQL注入
- 打开
127.0.0.1/form_test.html
- 用户名输入框中输入
' or 1=1#
,密码栏则可以随意输入,我们发现它还是会登录成功!
- 会出现这样的结果是因为,当我们输入
' or 1=1#
时,整个数据库查询语句变为了select * from user where username='' or 1=1#' and password=''
,这里面“#”起到的作用相当于注释,即后面对密码的判断都被注释掉了,前文判断中1=1是一个永真式,所以这个句话的结果永远是true。
XSS攻击
- 将一张图片放在
/var/www/html
目录下,起名为img1.JPG - 打开登录页面,在用户名输入框中输入img src=“img1.JPG”/,随便输入密码
- 可以发现成功读取到这个图片!
实践目标及内容
本实践的目标是理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat实践下相关实验。
实践步骤
WebGoat的安装
WebGoat是OWASP组织研制出的用于进行web漏洞实验的应用平台,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,目前提供的训练课程有很多,包含了XSS、线程安全、SQL注入、访问控制、隐藏字段、Cookie等。
- WebGoat需要Java SE8的支持。因此可以先在官网下载jdk-8u251-linux-x64.tar.gz,参考此链接https://www.jianshu.com/p/9ec7838411c8 内容进行配置,配置后输入java -version可以看是否安装完成。
- 下载webgoat-container-7.0.1-war-exec.jar.下载链接
- WebGoat默认会使用8080端口,所以我们先用netstat -tupln | grep 8080查看端口是否被占用,如果有进程占用则kill掉。
- 在存放webgoat-container-7.0.1-war-exec.jar的文件夹下输入java -jar webgoat-container-7.0.1-war-exec.jar运行Webgoat,出现以下内容则为运行成功。
- 在浏览器中输入http:.//localhost:8080/WebGoat 进入登录界面。输入界面下方的用户名和密码进行登录。
- 登录成功会进入如下界面,左侧为课程栏,点击可以看到课题的原理和目标,按要求完成相应练习。
SQL注入攻击(Injection Flaws)
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
命令注入(Command Injection)
1.概念: 命令注入攻击对任何恶一个以参数驱动的站点来说都是一个严重威胁。这种攻击技术背后的技术方法,简单易学,能造成大范围的损害,危及系统安全。尽管这类风险数目令人难以置信,互联网中的系统很容易收到这种形式的攻击。
2.原理: 在正常的参数提交过程中添加恶意代码以执行某条指令
3.目标: 能够在目标主机上执行任何系统命令
4.步骤如下:
左侧的菜单栏中选择Injection Flaws,然后点击Command Injection,然后右键点击网页,选择Inspect Element(查看网页源代码,也可以直接按f12)
在审查网页源码框中,可以点击绿框中的按键单击复选框按钮快速找到对应的option代码(之后的所有步骤都可以如此快速找到,不再强调),双击进行修改,在后面附加上“& netstat -an & ipconfig”,然后单击View
在下方我们可以看到指令执行后的网络端口使用状况和IP地址。
数字型注入(Numeric SQL Injection)
1.概念: 注入数字型数据(如永真式)实现注入效果
2.原理: 在station字段中注入特征字符,组成新的SQL语句。如:SELECT * FROM weather_data WHERE station = [station]
3.目标: 该例子可以通过注入SQL字符串查看所有天气数据。
4.步骤如下:
在菜单栏Injection Flaws下拉选项选择Numeric SQL Injection
同样打开页面源码,找到城市复选框对应源码,在Value值中添加or 1=1
点击GO!,即可收到攻击结果:
日志欺骗(Log Spoofing)
1.概念: 通过在日志文件中插入脚本实现欺骗。
2.原理: 在日志文件中愚弄人的眼睛,攻击者可以利用这种方式清除他们在日志中的痕迹。
3.目标: 灰色区域代表在Web服务器中的日志中记录的内容,目的是使用户名为“admin”的用户在日志中显示“成功登录”
4.步骤如下:
在菜单栏中选择Injection Flaws展开栏中的Log Spoofing
利用回车0D%和换行符%0A,在用户名输入框中输入yy5308%0d%0aLogin Succeeded for username: admin,密码随便输
看到以下提示,收到提示信息,测试成功
攻击者可以利用这种方式向日志文件中添加恶意脚本,脚本的返回信息管理员能够通过浏览器看到。比如,将admin 作为用户名输入,可以看到弹窗的cookie信息。
SQL注入(LAB:SQL Injection)
LAB:SQL Injection下拉列表分四个stage(stage2和stage4需要开发人员版本,我们不做),依次选择stage1和stage3。之后不再继续强调。
1.字符串型注入(stage1:String SQL Injection)
1.原理: 通过注入字符串绕过验证
2.步骤如下:
在网页源代码中找到密码输入框对应代码,将maxlength修改为18
将登录人员选为下拉框中最后一个人(admin身份),然后在密码框内输入hello' or '1' = '1
攻击成功
2.数字型SQL注入(stage 3:Numeric SQL Injection)
1.原理: 通过注入数字型数据,绕过认证,可以通过普通员工的账户,查看到BOSS的用户信息。
2.步骤如下:
使用员工Larry,密码larry登录,点击ViewProfile查看用户信息
按f12查看网页源代码,我们可以看到数据库索引的依据是员工ID,据此推测返回的是每次查询到的第一条数据
我们推测老板的工资肯定是最高的,因此我们可以将员工ID的value改为101 or 1=1 order by salary desc,这样老板的信息就是查询到的第一条数据
再次点击ViewProfile,即可查询老板的信息
字符串注入(String SQL Injection)
1.概念: 通过注入字符串绕过认证
2.原理: 基于以下查询语句构造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
3.目标: 下面的表格,允许用户查看他们的信用卡号码。尝试通过 SQL 注入将所有信用卡信息 显示出来。尝试的用户名是“Smith”。
4.步骤如下:
将输入查询的用户名改为Smith' or 1=1--。
点击Go!,得到所有用户的信用卡号码。
数据库后门(Database Backdoors)
1.概念: 数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。 它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另 一个数据库操作,如 insert, select, update or delete。
2.目标: 利用查询的脆弱性创建触发器。由于 WebGoat 使用的是 MySQL 数据库,不支持触发器,所以该课程不会真正完成。 我们的 Login ID 是 101。
3.步骤如下:
输入101,可以看到用户信息。其中没有任何的验证环节
输入注入语句101; update employee set salary=18000执行两个语句
输入101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='5308yy@hackme.com'WHERE userid = NEW.userid,其中:
BEFORE/AFTER :指定了触发执行的时间,在事件之前或是之后。
FOR EACH ROW :表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
数字型盲注入(Blind Numeric SQL Injection)
1.原理: 某些SQL注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必需充分利用查询语句,构造子查询语。
2.目标: 该题目允许输入一个帐号,并检测该帐号是否合法。使用该表单的返回信息(真或假)测试检查数据库中其它条目信息。我们找到 pins 表中 cc_number 字段值为 1111222233334444 的记录中 pin 字段的数值。pin 字段类型为 int,整型。输入找到的数值并提交,通过该题目。
3.步骤如下:
本题中只有账号有效或无效两种返回信息。因此无法直接查询到账号的pin值。但可以利用查询语句SELECT * FROM user_data WHERE userid=accountNumber;如果查询语句返回了账号信息,则提示账号有效,否则提示无效。使用AND函数,添加一些额外的查询条件,利用返回信息推导pin值。
输入以下语句:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );,得到结果为无效,判断pin值是小于5000的。
利用二分法通过有效无效两种信息最终判断出pin值为2364,实验成功!
字符型盲注入(Blind String SQL Injection)
1.概念: 与数字型盲注入类似,某些 SQL 注入是没有明确返回信息的,只能通过条件的“真”和“假”进行判断。攻击者必须充分利用查询语句,构造子查询语。
2.原理: 找到 pins 表中 cc_number 字段值为 4321432143214321 的记录中 pin 字段的数值。pin 字段类型为 varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交,通过本题目。
3.翻译: 也就是这次的pin值并不是数字而是字母,这样我们就把AND后面的内容改为就具体某个字母大小的比对,通过SubString逐一确定每个字母。
4.用法: SubString用法为SUBSTRING(STRING(字符串),START(开始位置),LENGTH(长度))
3.步骤如下:
输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' );判断pin值的第一个字母是否小于‘M’,使用二分法直至判断出具体字母
因此类推判断出所有字母,最终得到pin字段为Jill
XSS攻击
跨站脚本攻击是通过HTML注入劫持用户的浏览器,任意构造用户当前浏览的HTML内容,可以模拟用户当前的操作。这里实验的是一种获取用户名和密码的攻击。
1.XSS钓鱼(Phishing with XSS)
1.原理: 当用户输入非法HTTP响应时容易受到XSS攻击。在XSS的帮助下,可以实现钓鱼工具或向某些官方页面中增加内容。对于受害者来说很难发现该内容是否存在威胁。
2.目标: 创建一个form,要求填写用户名和密码。将数据提交到http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
3.步骤如下:
XSS可以在一存在的页面中进一步的添加元素,我们让受害人填写一个表格然后服务器以读取脚本的形式发送给攻击者。
编写一段脚本读取被攻击者在表单上输入的用户名和密码信息,将这些信息发送给捕获这些信息的WebGoat
编写一个带用户名和密码输入框的表格:
//脚本
攻击成功
存储型XSS攻击(Stored XSS Attacks)
1.原理: 这种攻击常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
2.目标: 写入非法的消息内容,可以导致其他用户访问时载入非预期的页面或内容
3.步骤如下:
在title中输入任意字符,留言板中输入
点击生成的message,出现提示。
反射型XSS攻击(Reflected XSS Attacks)
1.原理: 在反射的XSS攻击中,攻击者可以使用攻击脚本创建一个URL,并将其发布到另一个网站、通过电子邮件或其他方式让受害者点击它。
2.目标: 使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
3.步骤如下:
输入前面XSS钓鱼中的代码,出现了用户名和密码的输入框,按照之前XSS钓鱼的流程,结果如下
CSRF攻击
跨站请求伪造,尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
1.原理: 跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如:,当受害者的浏览器试图呈现此页面时,它将使用指定的参数向www.mybank.com 的“me”端点发出请求。浏览器将请求链接以获得图像,即使它实际上是一个资金转移功能。提交请求时,浏览器将添加与站点相关的所有cookie。因此,如果用户对站点进行了身份验证,并且拥有永久或当前会话cookie,那么站点将无法将其与合法的用户请求区分开来。通过这种方式,攻击者可以让受害者执行他们不打算执行的操作,比如“购买物品”,或者脆弱网站提供的任何其他功能。
2.目标: 向新闻组发送一封email。这个email包含一个image,其URL指向一个恶意请求。URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”,其数值为5000。可以通过在右侧插入的参数中找到“Screen”和“menu”值来构造链接。当经过身份验证的CSRF电子邮件的收件人将被转移他们的资金。
3.步骤如下:
查看页面右侧的scr值和menu值,分别为316和900
title栏中随便输入,message框中输入以图片形式将URL放入Message框中,这事URL对其他用户不可见(宽高都为1为了隐藏该图片),用户点击图片就会触发CSRF事件,点击Submit提交。
在下方点击该消息,当前页面会下载此消息并显示,转走用户的5000元。没有其他明显的显示,但左侧任务框会显示已完成
绕过CSRF确认(CSRF Prompt By‐Pass)
1.原理: 跨站点请求伪造(CSRF/XSRF)是一种攻击,它欺骗受害者加载包含“伪造请求”的页面,以便使用受害者的凭据执行命令。提示用户确认或取消命令可能听起来像一个解决方案,但如果提示符是可编写脚本的,则可以忽略它。本课展示如何通过发出另一个伪造的请求来绕过这样的提示符。这也适用于一系列提示,例如向导或发出多个不相关的伪造请求。
2.目标: 与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。
3.步骤如下:
查看页面右侧的scr和menu值分别为316和900
titile框中输入学号,message框中输入代码:
点击生成的链接,任务完成
实验总结与问题回答
基础问题回答
1.SQL注入攻击原理,如何防御?
原理: 通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
防御:
利用正则表达式检查用户输入
对数据库中的内容进行加密处理
关闭或删除不必要的交互式提交表单页面
2.XSS攻击的原理,如何防御?
原理: XSS 攻击,通常指黑客通过 HTML 注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。在这种行为最初出现之时,所有的演示案例全是跨域行为,所以叫做 "跨站脚本" 。
防御:
永远不相信用户的输入。需要对用户的输入进行处理,只允许合法输入,其他值一律筛掉。
需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码。将html实体转化为相应的实体编号。
CSRF攻击原理,如何防御?
原理: CSRF(Cross site request forgery),即跨站请求伪造。我们知道XSS是跨站脚本攻击,就是在用户的浏览器中执行攻击者的脚本,来获得其cookie等信息。而CSRF确实,借用用户的身份,向web server发送请求,因为该请求不是用户本意,所以称为“跨站请求伪造”。
防御:
因为伪造的请求一般从第三方网站发起的,所以第一个防御方法就是判断referer头,看是否来自本网站。
每一个重要的post提交页面都使用一个验证码,因为第三方网站无法获得验证码。
每一个网页包含一个Web server产生的token,提交时,也将该token提交到服务器。服务器对token进行校验判读是否遭受CSRF攻击。
(1)什么是表单
表单可以进行前台向后台的数据传输。
表单有三个基本组成部分:
(1)表单标签:包含处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。
(2)表单域:包含文本框、密码框、多行文本框等一系列表单形式。
(3)表单按钮:包含提交按钮,复位按钮以及一般按钮
(2)浏览器可以解析运行什么语言
HTML(超文本标记语言)
XML(可扩展标记语言)
Python
PHP
JavaScript
ASP等众多脚本语言
(3)WebServer支持哪些动态语言
ASP
JSP
PHP
Ruby等