开山-web安全基础(1)常见web漏洞解析

欢迎来到theFlyer的博客—希望你有不一样的感悟

前言:第一次使用markdown,文章里面可能有各种尝试,看官见谅。web安全基础需要各位看官有一定html/js/php等基础知识(我也是萌新),知识多而杂,需要多看多动手。

目录

XSS

全称:Cross Site Script
中文名称:跨站脚本
危害:盗取用户信息、钓鱼、制造蠕虫等
概念:黑客通过“HTML注入”篡改网页,插入了恶意脚本,当用户在浏览网页时,实现控制用户浏览器行为的一种攻击方式。

xss三种类型

XSS类型		  存储型				反射型             DOM型

触发过程   1.黑客构造XSS脚本	  正常用户访问携带	  	 正常用户访问携带
		  2.正常用户访问携带   XSS脚本的URL(参数)     XSS脚本的URL(哈希) 
	        XSS脚本的页面
数据存储	     数据库			   URL				    URL
谁来输出	  后端WEB应用程序		后端WEB应用程序	     前端JavaScipt
输出位置	   HTTP响应中		   HTTP响应中       	 动态构造的DOM节点
 
DOM型:   用户访问应用  浏览器通过js解析URL内容输出到DOM中  触发XSS
个人理解(欢迎指正):主要利用闭合标签,闭合正常标签,并加入恶意代码
                  或添加构造恶意代码。
"></a><script>alert("xss")</script>来先闭合掉a标签。然后再用script来运行js代码
onclick="alert(1)";>123</a>//点击123触发onclick来运行js,然后把后面的内容来注释掉

前人已经对XSS有了比较深入的总结
链接:XSS的原理分析与解剖                          XSS的原理分析与解剖二
防御xss

原则1:不要在页面中插入任何不可信数据,除非这些数已经据根据下面几个原则进行了编码
原则2:在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码
原则3:在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码

想知道如何防必然对攻要有深刻理解,有时间拜读此文防御XSS的七条原则

CSFR

全称:Cross-site request forgery
中文名称:跨站请求伪造
危害:执行恶意操作(被转账,被发垃圾评论等)、制造蠕虫...
概念:利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作

CSRF攻击攻击原理及过程如下:

1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。

看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了)
3.打开的第三方网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

CSRF 攻击的应对之道

1.验证 HTTP Referer 字段
2.在请求地址中添加 token 并验证
3.在 HTTP 头中自定义属性并验证
文章链接如下CSRF 攻击的应对之道
4.服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数
浅谈CSRF攻击方式

点击劫持

全称:Click Jacking
中文名称:点击劫持
危害:点击覆盖不可见的框架,造成各种精心设计的风险如何删除、点赞、下载、转账等
概念:它是通过覆盖不可见的框架误导受害者点击。虽然受害者点击的是他所看到的网页
,<iframe>标签的透明属性。

点击劫持其实是一种视觉上的欺骗手段,攻击者将一个透明的、不可见的iframe覆盖在一个网页上,通过调整iframe页面位置,诱使用户在页面上进行操作,在不知情的情况下用户的点击恰好是点击在iframe页面的一些功能按钮上。例:

Flash点击劫持
点击劫持与CSRF攻击有异曲同工之妙,他们都是在用户不知情的情况下诱使用户完成一些动作。CSRF在攻击过程中如果出现与用户交互的页面,则攻击有可能无法完成。而点击劫持恰恰是利用与用户交互而完成的攻击,因此在Flash中这类点击劫持现象更为严重。攻击者利用简单的Flash小游戏诱使用户点击,经过一系列点击后达到控制用户电脑的目的。

推荐文章链接小漏洞大危害浅析点击劫持攻击点击劫持

URL跳转

尤其当网址变成短链接,就更具有迷惑性了
定义:借助未验证的URL跳转,将应用程序引导到不安全的第三方区域从而导致安全问题。

跳转实现

1.Header头跳转
$url = $_REQUEST["url"];  获取用户请求链接
header("Location: $url");  跳转到链接地址
2.Javascript跳转
var site = getQueryString("site"); js脚本获取用户请求链接
window.location.href=site;  跳转到链接地址
3.META标签跳转
$url = $_REQUEST["url"];  获取用户请求链接
<meta http-equiv="Refresh" content="5; url=<?php echo $url?>" />   5秒后跳转到链接地址

推荐文章链接URL重定向/跳转漏洞解释说明及修复方案前端一波骚操作

SQL注入

SQL Injection 服务端漏洞
是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,
或者利用潜在的数据库漏洞进行攻击。

正常登录的流程

POST请求登录,把用户名和密码交给服务器,服务器通过PHP代码实现获取到浏览器POST的用户名和密码,会经过一次MD5处理,服务器会把用户名和密码经过MD5处理后的密码拼接到要执行的SQL语句中。

1.POST请求登录,
2.获取请求参数,
3.参数带入代码,
4.执行查询,
5.验证查询结果,
6.根据返回结果判断是否登录成功
$username = $_POST['username']; 
$password = MD5($_POST['password']); 

SQL注入过程

1.获取用户参数
2.拼接到代码当中
3.SQL语句按照我们构造参数的语义执行成功
admin' --     注释-- (双横杠空格)代表注释符     ‘为了闭合前面单引号
查询数据库中是否有admin用户,用户存在时返回结果根本没有验证密码
$check_query = mysql_query("select id from teacher where name='admin' --  and passwd='$password' limit 1"); 
利用脚本
username = admin' and 1=2 union select version()
username = admin' and 1=2 union select user()

SQL必备条件

1.可以控制输入的数据
2.服务器要执行的代码拼接了控制的数据

SQL注入的本质

数据和代码未分离即数据当作了代码来执行

SQL注入的危害

1.获取数据库信息
2.管理员后台用户名和密码
3.获取其他数据库敏感信息:用户名、密码、手机号码、身份证、银行卡信息......
4.获取服务器权限
5.植入Webshell,获取服务器后门
6.读取服务器敏感文件
7.万能密码

推荐文章链接认识SQL注入的类型手工注入语句大全

命令注入

应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、
passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令
拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

攻击过程

黑客-> 构造命令-> web应用程序-> 拼接命令并执行注入命令-> 并把结果返回到页面

WEB应用如何命令注入

  命令注入条件:
1.调用可执行系统命令的函数
2.函数或函数的参数可控
3.拼接注入命令

举例

1.下面代码无法执行其他命令,不满足上面命令注入的第二个条件,函数或其参数可控
<?php
		if (isset($_GET['type'])) {
			$type = $_GET['type'];   ---从参数中获取type值
		} else {
			$type = 1;
		}
		switch($type){
			case 1:
				exec('ipconfig', $output, $status);   ---type为1执行ipconfig命令
				break;
			case 2:
				exec('net user', $output, $status);  ---为2执行net user命令
				break;
			case 3:
				exec('dir', $output, $status);		---为33执行dir命令
				break;		
		}
		
		foreach($output as $value){  ---输出命令执行结果
			// 编码转换
			echo(mb_convert_encoding($value, "UTF-8", "GB2312"));
			echo("<br />");
		}
	?>
2.参数可控,可以拼接
	<?php
		if (isset($_GET['url'])) {
			$url = $_GET['url'];  ---从参数中获取url
		} else {
			$url = "http://www.theFlyer.com";
		}
		//调用curl命令,获取url的响应头。请求url的网址并返回它的url响应头
		$cmd = 'curl -I "'. $url . '"';  
		//***拼接curl命令 (curl参数可控,这有个分隔符 "",是为了将url包住同时也起到了分隔curl命令
		//和数据的作用)可以通过追加 "闭合前面的curl命令,后面用&追加我们想要的命令。
		//注意dir"./ 后面不能在加"因为php在拼接时会补上这个双引号						
		//http://www.theFlyer.com" & dir"./						
		//最后拼接代码如下  curl -I "http://www.theFlyer.com" & dir"./"						
								
		// 执行系统命令
		exec($cmd, $output, $status);   ---执行curl命令
		
		echo "<b>". htmlspecialchars($url) . "</b>"
			 . " 的响应头如下:<br /><br />";
			 
		// 输出命令执行结果
		foreach($output as $value){  ---输出命令结果
			echo htmlspecialchars($value);
			echo "<br/>";
		}
	?>

推荐文章链接 命令执行

文件操作漏洞

常见文件操作漏洞:

1.文件上传漏洞
2.任意文件下载
3.文件包含漏洞

利用文件操作漏洞:

1.文件上传
	1.1上传Webshell
	1.2上传木马
	...
2.文件下载
	2.1下载系统任意文件
	2.2下载程序代码
	...

文件操作漏洞原因:

文件处理不当
1.可以上传可执行脚本
2.脚本拥有执行权限

推荐文章链接 文件上传漏洞及解析任意文件查看与下载漏洞

后记

纸上得来终觉浅,实践出真知,我也需要多动手,望君亦如此。第一篇算是偏技术文贴,要发了,
但没刚写那么激动,我会继续写的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章