20145319 《网络渗透》web安全基础实践
问题回答
- Sql注入攻击原理,如何防御
- 攻击原理:由于对于用户输入并没做出相应限制,因此可以通过构造特定的sql语句,达到自身的一些非法目的
- 防御方法:对于输入的字符做出限制,例如长度不能太长,不能包含一些特殊字符,使其无法构造sql语句
- XSS攻击的原理,如何防御
- 攻击原理:跨站脚本攻击,其原因也在于对于用户的输入字符没有做出限制,一些恶意用户可以将自身的恶意代码插入在url等地方,诱惑别人访问从而达到目的
- 防御方法:与防御sql注入类似,要检查用户的输入字符串,并做出限制,例如过滤script这类敏感词
- CSRF攻击原理,如何防御
- 攻击原理:通过劫持会话,伪造身份等方式来达到一些非法目的,例如转账,支付等
- 防御方法:使用验证码,表单中附加随机值,以此来防止冒充,在对于用户的隐私数据尽量进行加密处理,加密传输
实验过程
-
键入命令
java -jar webgoat-container-7.0.1-war-exec.jar
开启webgoat -
浏览器中输入
http://127.0.0.1:8080/WebGoat
使用默认用户名和密码登录即可
sql注入练习(字符串注入)
-
在菜单栏中选择
String SQL Injection
-
第一题大意是要求我们使用sql注入来调用全部用户的银行卡信息(英文原文就不再补充了),实现sql注入的关键就是如何构造出我们想要的sql语句,我们首先来观察网站给出的示例
-
我们可以很轻易的找出网站是如何将用户输入的字符串拼接到早已经设计好的字符串中组成sql语句的——将输入的字符串填入到最后的引号之间,而我们如何能将所有的用户信息输出——只需要将where后的条件构造成永远为真即可
-
首先我们要使用引号闭合第一个限制条件last_name并在后面再加上我们的构造的条件,使其永远为真,例如
or 1=1
或者or 2=2
这类均可,于是,我们填入的字符串可以如下
sql注入练习(数字型)
-
在菜单栏中选择
Numberic SQL Injection
-
本次的注入和上次不同,该题并没有文本框让我们直接进行输入操作,我们只能通过滑动文本框选择地点,sql语句的生成代码可能是写在web页面的源码中,也可能是在后台服务中进行,但是无论是哪一种,表单都需要将搜集到的信息写进数据包中通过网络传输给后台,这就给了我们篡改的机会
-
我们先随便选择一个地点并进行查询,根据其反馈的sql语句来看,我们需要修改的就是station部分,之后我们就需要用到另一个工具burp-suite,通过将burp-suite设置浏览器的代理服务器,作为中间服务器,这样我们就可以截获从浏览器中发送出去的所有数据包,并将其中内容修改成我们想要的样子
-
打开burp-suite在proxy的options选项中添加新的代理(默认为8080,不过被apache2占用了)
-
修改了浏览器的代理服务器之后,随便选择一个城市就会发现burp-suite中已经抓到了我们刚刚发送出去的数据包(我这次选择了new york,station=103)
-
其中第一行中的station部分就是我们这次修改的目标了,将station修改成
station=103 or 1=1
之后点击forward将数据包发送,查看response包,结果却和想象中的又一些出入(显示505错误) -
这是因为我们在修改的时候并没有注意到编码问题,在url编码中,并无法直接识别空格和等于号,因此在读取http版本时候发生了错误,无法得到正确结果,在查询url编码之后(空格为%20,等于号为%3d),将station修改成
station=103%20or%201%3d1
,之后点击forward即可得到正确结果
sql注入练习(命令型)
-
命令型注入就是通过我们已掌握的sql注入的方法,给目标操作系统注入dos命令(这里依然通过burp-suite修改数据包的方式来完成注入),第一步还是查看反馈的sql语句
-
我们观察反馈的sql语句,首先就需要使用双引号封闭第一部分,再通过&&附加上我们的另一部分想要执行的命令,例如
"&&echo 5319"
,再注意url编码的问题,在helpfile栏的最后添加"%26%26echo%205319"
就可以得到结果
Log spoofing
-
题意是要我们使用管理员admin身份完成登录,其实就只是要根本的目的是将管理员admin登录成功这一条记录写进日志中
-
首先我们进行尝试,无论我们输入什么username,日志都显示登录失败
-
这次我尝试对输入的username做出一些改变输入
guest ok
来查看反馈结果 -
这样我们就有一个思路如果我们输入任意用户名之后,接上我们想要写进日志里的记录是不是就达到了我们的目的,于是我们在考虑换行符的编码的情况下可以这样构造这样一条语句
guest%0aLogin Succeeded for username:admin
最后结果显示欺骗成功
sql注入练习(盲数字注入)
- 按照题目的意思是,我们可以验证已经输入的数字是否合法,例如101,因此我们可以构造
条件1 AND 条件2
,观察最终结果是否合法来判断条件2是否为真 - 例如我们可以构造
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5319 );
来验证其设定的pin值是否大于5319,按照这个原理,我们可以不断的缩小所要搜寻的pin的值,直到找到该pin值 - 不过我不是很理解的是,为何不通过直接输入数字观察结果为valid或者invalid来判断该数字大于还是小于pin值,通过二分法同样可以一步一步逼近设定的pin值,并不知道为何还需要注入
sql注入练习(盲字符串注入)
- 基本思路类似于之前的盲数字注入,只是猜测的对象变成了字符所对应的ascii码,从根本上来说其实还是一种对数字的猜测
- 构造
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), x, y) = 'h' );
来测试出我们需要的字符串到底是啥 - 因为这个测试次数较之上一个实验要多,所以完全依靠手工输入的工作量太大,建议学习蔡野同学的做法,使用burp-suite中的intruder中的payloads来进行爆破,一一测试所有可能性
xss练习(存储型)
-
大意就是它会将你填写在文本框中的内容存储起来并发给他人,包括javascript代码
-
所以这个我们只需要在文本框中随便填写一些代码作为实验即可,例如
<script> alert(5319); </script>
-
当你点开下方的链接时就会弹出内容为5319的对话框
xss练习(反射型)
- 看了一下题目中的介绍,大概意思就是在反射型xss攻击中,攻击者可以往其他网站的url网址部分中插入script代码,来发给他人,来实现自身目的,与上一个练习的内容基本类似(一个直接写在文本中,一个写在网址里)
- 例如:
www.baidu.com/<script>alert(5319);</script>
输入之后就会弹出内容为5319的对话框
xss练习(跨站脚本钓鱼攻击)
-
在菜单栏中依次选择
Cross-site scripting
,phishing with xss
,这个攻击类似于上一个练习的一个进阶版,不仅能插入script标签还能插入其他标签构成完整的web代码(如下)</form> <script> function hello(){ alert("hello,5319"); } </script> <form> <br><br><h2>please input your stu_number and pwd</h2><br><br> stu_number: <br><input type="text" name="stunumber"><br> password: <br><input type="password" name="pwd"><br> <input type="submit" name="submit" value="login" onclick="hello()"> </form>
-
将如下简单的代码输入到输入框中,弹出如下界面,输入学号密码点击Login则会弹出
hello,5319
的弹窗,只要修改scprit标签中的函数,就可以实现更多非法功能,例如记录下用户输入的用户信息等
CSRF Prompt by-pass
-
其实这个比较好实现,为了成功完成欺骗,您需要获得一个验证请求Token,这个就只需要通过文本框中嵌入两个标签,一个实现用户转账,一个实现确认界面,显示相关表单的外部参数为
transferFunds=main
,构造相应语句就可以实现我们的目的hello <img src='attack?Screen=400&menu=800&transferFunds=zk19'zk19 width='1' height='1'> <img src='attack?Screen=400&menu=800&transferFunds=CONFIRM' width='1' height='1'>