20145120《网络对抗》Web安全基础实践
回答问题
(1)SQL注入攻击原理,如何防御
SQL注入原理简单地说大概是,通过构造特殊的SQL命令提交表单,让服务器执行构造的恶意SQL命令,以对数据库进行恶意操作。
服务器前端可以通过限制用户输入的长度,检测用户输入的内容(例如#,--,1=1
等敏感的代码)等方法防止SQL注入,后台程序也可以再检测一遍前端传过来的内容,数据库中存放的一些数据要进行加密或者hash处理。
(2)XSS攻击的原理,如何防御
XSS即跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
防御XSS可以通过检查用户的输入,看用户有没有在不必要的情况下输入< > /
之类的字符或<script>
等标签。
(3)CSRF攻击原理,如何防御
CSRF(Cross-site request forgery)即跨站请求伪造,也叫XSRF。通过伪装成受信用的网站,让用户执行恶意代码。
因为CRSF需要得到cookie,得到授权,站点可以通过将持久授权改为瞬时授权,对cookie进行hash,会话结束时清理cookies等方法防御CSRF。
实验总结与体会
听老师说这次可以少截图我就少截图了,但总感觉少了截图就好像少了很多东西。这次的实验让我深刻地理解了SQL注入,XSS,CSRF等攻击的攻击原理和方法。也再一次提醒我,陌生链接不要点。学完了发现,像SQL,XSS这些攻击大都需要猜测你的源代码,知道了你的源代码就很好攻击了,感觉只要知道了你源代码我总能给你做点恶意攻击,同时,编写WEB前端后台的时候也要注意常见的或可能遇到的攻击,最后能不能攻击到,攻防你来我往地,就要看谁思路广、套路深了。
实验过程:
启动WebGoat平台
输入java -jar webgoat-container-7.0.1-war-exec.jar
启动WebGoat后,在浏览器输入127.0.0.1:8080/WebGoat
可进入WebGoat平台
SQL注入
1 String SQL Injection
还是先跟随老师的步伐,做个课上讲过的题目先
题目要求注入sql得到所有返回结果,还把sql语句提示给了我们
开始试了' or 1=1;#
,呃,没对,只好Java Source
看下java源代码,找到该sql语句是
String query = "SELECT * FROM user_data WHERE last_name = '" + accountName + "'";
好吧,一个经验主义的错误,这不是MySql,不能用#
注释,反正都看了代码,那就直接' or '1'='1
然后,在这里我遇上了一个超级大坑
答案理论上是正确的,但是出不来结果,一开始我还以为是自己做错了,后来又看了其他同学的博客,甚至用Hints
上的标准正确答案smith' OR '1' = '1
也不行
然后我才发现有个Restart Lesson
,由于虚拟机是学长传下来的,之前这个任务已经做过,如果不重开一下,就算输入是对的也不会有出现应该出现的Congratulation
一波三折还是做出来了,心累。。。
2 Numeric SQL Injection
感谢岐浩的博客让我想起了burpsuite怎么用(怎么用burpsuite当代理抓包等,666)
题目要求返回所有天气信息,好做,Proxy中Options选项Add一个端口5120的,抓包,把包传给Repeater,把101
改成101 or 1=1
,点击GO发送,关掉截取,把改过的包传出,回到火狐能看到已经成功。
3 LAB: SQL Injection Stage 1: String SQL Injection
还是字符串SQL注入,这次没有提示了,按经验的话,先试试' or 1=1;--
,填了8个字符之后发现长度被锁定了,这时候又到burpsuite出场了
本来以为构造内容的时候要用ASCII码(还是十六进制的),先试试直接构造试一下,抓包后password改成' or 1=1;--
,结果直接成功了
4 LAB: SQL Injection Stage 3: Numeric SQL Injection
Stage 2,4环境不支持。只能选3了,题目是作为普通员工的“Larry”,使用SQL注入到View函数的参数(从List Staff页面)来查看老板('Neville')的配置文件。
我想了很久没想出来,终于忍不住看了提示,101 or 1=1 order by salary desc
,好像不行啊,标准答案又不行?
确认自己按过restart绿色小勾已经没了,我的直觉告诉自己我怕是又绕进一些不该绕的地方了,百度WebGoat 7.0.1 LAB: SQL Injection Stage 3
EXM???要先用密码larry登录Larry的账户,WTF???,我确认我用谷歌翻译的时候从没见到密码和用户名一样这种信息,我试过的,抓包改密码也登不上larry,我怀疑我读了假题目,感觉又在神奇的地方浪费时间了Orz
知道了之后就好办了,登录,准备抓包,抓住ViewProfile
的请求包,改employee_id,GO,终结这个伤心的题目
5 Blind Numeric SQL Injection
还是做课上做过的题找一下信心,目的是找到cc_number为1111222233334444的表pins中的pin,
首先,101是真的,由此可以构造SQL
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444')>?);
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444')<?);
即构造与pin的数值比较的语句,然后就是比大小的游戏了。我发现这里其实没有限制输入,连抓包都可以省了,配合End跳到最后修改,折半找,很快就确定为2364。
6 Blind String SQL Injection
想做之后才发现比上一个猜数字要难,首先要知道substring的用法,然后要慢慢猜数字,要猜五个,刚开始根本不会substring,还是参考了余佳源学长的实验报告做的。
XSS
7 Stored XSS Attacks
让我们输入影响其他用户浏览的内容,在内容里随便写个脚本<script>alert(233hhhhhhhh);</script>
还可以用来偷cookie,<script>alert(document.cookie);</script>
8 Reflected XSS Attacks
Enter your three digit access code:
的输入总会被原封不动地返回,用上面的命令就可以,例如<script>alert(5120+document.cookie);</script>
CSRF
9 Cross Site Request Forgery (CSRF)
做一个邮件,包含一个到指定网站的链接,让收到的人转5000$
遗憾,这次我已经猜到参数要抄旁边的Parameters,可惜不会拼链接
最后还是看了提示,标题随意,内容填<img src='attack?Screen=284 &menu=900 &transferFunds=5000'>
10 CSRF Prompt By-Pass
和上面一题一脉相承,要多构造一条确认语句,参数变了一下,有了上面的基础简直没难度啊,同样标题随意,内容
233
<img src='attack?Screen=269 &menu=900 &transferFunds=5000'>
<img src='attack?Screen=284 &menu=900 &transferFunds=CONFIRM'>
其他
其实我本来还想做Psishing with XSS的,不过这个也是个我看了标准答案都没用的,我都填标准答案了还是不给我打勾,不知道又哪里绕进去了。
不过光是骗骗用户名密码倒是做出来了
还有CSRF Token By-Pass,本来也是向做的,不过后来感觉看不懂,填了参数mian不知道怎么得到想要的响应。