web安全-02web安全基础
一、无处不在的安全问题
web安全问题其实就是黑客利用各种web漏洞,实现钓鱼、篡改网页、挂暗链、植入webshell后门等目的。
1、钓鱼phishing
- 网络钓鱼”(Phishing)一词,是“Fishing”和“Phone”的综合体,由于早期的黑客起初是以电话作案,所以用“Ph”来取代“F”。
- 使用诱惑性标题,仿冒真实网站,通过邮件等方式发送给受害人,骗取用户账号、资料等。
2、篡改网页tampering
可以使用insite:hacked by关键字在搜索引擎中搜索被篡改的网页,一般是为了炫耀或政治目的。简单的搜索引擎语法:
- intitle:keyword 标题中含有关键词的网页
- intext:keyword 正文中含有关键词的网页
- site:domain 在某个域名和子域名下的网页
3、暗链hidden hyperlinks
- 通过隐藏的div、iframe、href等方式,在网站中隐藏连接
- 主要是网游、医疗、博彩、色情等网站
- 不是给网民浏览或者点击用的,主要是面向搜索引擎,提高网站的排名(SEO)
4、webshell
webshell就是网页后门程序,通过浏览器网页进行执行,通常以asp/php/jsp等脚本文件形式存在,具有命令执行、目录操作、账号管理等各种功能。
- 大马:功能强大,有执行命令、目录操作、账号管理等
- 小马:如一句话木马,菜刀chopper等,功能相对简单
二、常见Web漏洞解析
常见web漏洞分类
1、XSS
1.1、什么是XSS
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。常见危害有,钓鱼、劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
1.2、存储型XSS
- 黑客构造xss脚本通过评论等页面,写入数据库。
- 用户访问含有xss脚本的页面,web应用程序返回含有恶意数据的页面。
- 查看网页源码为,加载了src为#不存在的图片,出发了onerror事件,导致了xss。
- 存储型xss过程图。
1.3、反射型XSS
- 用户访问了含有xss脚本的连接,触发xss。
- 查看网页源码为,加载了src为#不存在的图片,出发了onerror事件,导致了xss。
- 查看后台php源码,原因为获取url连接中的name参数后,没有过滤处理,直接输出到客户端,导致了xss。
- 反射型xss过程图。
1.4、DOM型XSS
- 用户访问了含有xss脚本的连接,触发xss。这一点与反射型xss相同。
- 查看网页源码为,加载了src为#不存在的图片,出发了onerror事件,导致了xss。与反射型xss不同的是xss脚本不在参数中,是在hash“#”中,URL中的hash串不会发送到后端服务器,说明向页面输出xss脚本的不是后端的web应用程序,而是前端页面中的JavaScript脚本。
- 在浏览器控制窗口的脚本界面搜索hash关键字,可以看到红框中的代码,第一行从浏览器的hash中提取关键字赋值给erroMsg变量,第二行将errorMsg用URL编码进行解码,再以innerhtml的形式写入id为“errorMsg”的DOM节点中,从而导致xss。
- DOM型xss过程图。
1.5、三种XSS对比
xss类型 | 存储型 | 反射型 | DOM型 |
---|---|---|---|
触发过程 | 需要两步 1.黑客构造xss脚本。 2.正常用户访问携带xss脚本的页面。 | 正常用户访携带xss脚本的url | 正常用户访携带xss脚本的url |
数据存储 | 数据库 | url | url |
谁来输出 | 后端web应用程序(数据在数据库中) | 后端web应用程序 | 前端JavaScript |
输出位置 | http响应中 | http响应中 | 动态构造的DOM节点 |
2、CSRF
2.1 什么是CSRF
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。常见的危害有,如发邮件,发消息,甚至财产操作如转账和购买商品,制造蠕虫等)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
2.2 CSRF原理
2.3 CSRF示例
- 操作界面
- 抓包查看转账操作背后的网络请求
- 黑客构造恶意转账页面,也就是利用了这个转账过程,其中的关键在于上面的网络请求包,其实就是在恶意页面中嵌入了自动提交转账的请求,攻击代码示例如下。
- 实际攻击中,恶意页面往往是精心构造的如图,为了演示图中直接弹出转账成功提示。
通过view-source:url查看恶意页面第一层源码如下,只是一张图片,真正的恶意代码嵌入在body中隐藏的iframe标签中,iframe的高、宽都设置为0。
iframe标签中的代码如下,通过绑定body的onload事件完成自动提交表单。通过嵌入iframe提高了攻击的隐蔽性,用户感知不到表单提交时会有的明显的跳转。
透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。
3、点击劫持
3.1 什么是点击劫持
点击劫持clickjacking,也被称为UI-覆盖攻击,是指在一个Web页面下隐藏了一个透明的iframe(opacity:0),用外层假页面诱导用户点击,实际上是在隐藏的iframe上触发了点击事件进行一些用户不知情的操作。常见的危害有,盗取用户资金、获得用户的敏感信息、与XSS或CSRF等其他攻击手段配合等。
3.2 点击劫持原理
3.3 实例代码
click.html
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>点击劫持</title>
<style>
html,body,iframe{
display: block;
height: 100%;
width: 100%;
padding: 0;
border: none;
}
iframe{
opacity: 0.3; /*opacity即可见度,设置为0即可隐藏,为了显示设置为0.3*/
filter:alpha(opacity=30); /* IE */
-moz-opacity: 0; /* Moz + FF */
position:absolute;
z-index:2;
}
button{
position:absolute;
top:350px;
left:900px;
z-index:1; /* 表示垂直屏幕的距离,值越大视觉效果越近 */
width:72px;
height:26px;
}
</style>
</head>
<body>
<button><img src="/images/click.jpg"></button>
<iframe src="https://dun.163.com/dashboard?v=0116&locale=zh_CN#/login/?referrer=%2F"></iframe>
</body>
</html>
效果图
4、url跳转
4.1、什么是url跳转
借助未验证的url跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题。常见的危害有钓鱼、诈骗等。 短连接生成网站如33短链、百度短网址等,使得url跳转漏洞更难被识别。
4.2、url跳转漏洞原理
4.3、url跳转常见实现方式及例子
- header头跳转
url_header.php
<?php
header("Content-Type:text/html;charset=utf-8");
if(isset($_REQUEST["url"])){
$url = $_REQUEST["url"];
//获取用户请求的链接
}else{
$url = "url.html";
}
header("HTTP/1.1 301 Moved Permanently");
header("Location:$url");
//跳转到链接地址
?>
2. javascript跳转
url_js.php
<script type="text/javascript">
function getQueryString(name){
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if(r!=null)
return unescape(r[2]);
return null;
}
if(site!=null){
var site = getQueryString("site");
//获取用户请求链接
window.location.href = site;
//跳转到链接地址
}else{
window.location.href = "url.html";
}
</script>
- meta跳转
url_meta.php
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>meta标签实现url跳转</title>
<?php
header("Content-Type:text/html;charset=utf-8");
if(isset($_REQUEST["url"])){
$url = $_REQUEST["url"];
//获取用户请求链接
}else{
$url = "url.html";
}
?>
<meta http-equiv="Refresh" content="5; url=<?php echo $url ?>" />
<!--跳转到链接地址,这里的5秒表示页面跳转延时-->
</head>
<body>
</body>
</html>
5、sql注入
5.1、什么是sql注入
由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。本质是数据和代码未分离,数据当做了代码来执行。SQL注入常见危害有,刷库、拖库、撞库、上传木马、获取服务器权限、读取服务器敏感文件等。
5.2、sql注入原理
sql注入的必备条件
- 可以控制的输入数据
- 服务器要执行的代码拼接了控制的数据
5.3、sql注入例子万能密码
万能密码:admin’ – ,即admin+单引号+空格+双横杠+空格,双横杠表示注释。语句变成简单的查询语句,select name from teacher where name =‘admin’,肯定执行成功,所以不需要密码即可登录成功。
6、命令注入
6.1、什么是命令注入
命令注入即 Command Injection。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。常见危害有,继承web应用程序的权限去执行系统命令读写执行文件、、反弹shell、控制整个网站甚至整个服务器、进一步内网渗透。
6.2、命令注入原理
命令注入类比图
命令注入三要素,类比关系见下图:
- 调用可执行系统命令的函数,如shell的函数(system,exec)。
- 函数或函数的参数可控,比如通过url,Referer,post,cookie等参数。
- 拼接注入命令,如果采用了白名单限制也没法注入命令。
命令注入攻击过程
6.3、命令注入例子
- 不满足第二个要素,执行命令的函数和函数参数不可控的一段示例代码
command1.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(isset($_GET['type'])){
$type = $_GET['type']; //从参数中获取type值
}else{
$type = 1;
}
switch($type){
case 1:
exec('ipconfig', $output, $status);
break;
case 2:
exec('net user', $output, $status);
break;
case 3:
exec('dir', $output, $status);
break;
} //这里命令是写死的,不可控
foreach($output as $value){
//编码转换,输出命令执行结果
echo(mb_convert_encoding($value, "UTF-8", "GB2312"));
echo("<br />");
}
?>
</body>
</html>
- 命令注入成功的一段示例代码
command2.php,需要先下载curl.exe,并将其所在路径加入系统环境变量path。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if(isset($_GET['url'])){
$url = $_GET['url']; //从参数中获取url
}else{
$url = "http://dun.163.com";
}
//调用curl命令,获取url响应头
$cmd = 'curl -I "'.$url.'"';
//执行系统命令
exec($cmd, $output, $status);
echo "<b>".htmlspecialchars($url)."</b>"."的响应头如下:<br /><br />";
// 输出命令执行结果
foreach($output as $value){
echo htmlspecialchars($value);
echo "<br/>";
}
?>
</body>
</html>
成功注入是因为curl函数参数可控,原理图如下,利用代码为:http://www.163.com" %26 dir "./。
注意,因为&符号在url中是参数分隔符,这里需要将&符号进行url转义为“26%”。另外不需要输入最后一个双引号,php代码会自动补充。
输出结果如下:
7、文件操作漏洞
7.1、什么是文件操作漏洞
常见的文件操作有文件包含、文件读取、文件删除、文件修改以及文件上传,对应常见的文件操作漏洞大概分为文件上传漏洞、任意文件下载漏洞、文件包含漏洞。常见危害有上传Webshell、上传木马、下载系统任意文件、下载程序代码等。
7.2、文件上传漏洞
文件上传漏洞需要两点:
- 可以上传可执行脚本,如php,jsp文件等。
- 脚本拥有可执行权限,即上传目录拥有执行权限。
上传恶意文件evil.php,内容如下
<?php
phpinfo(); //漏洞证明代码
?>
获取evil.php地址,复制图像地址
访问上传文件,evil.php执行成功,进一步利用可以上传webshell。
7.3、文件下载漏洞
文件下载漏洞因为未考虑如下两点:
1.未验证下载文件格式,验证后缀,文件头等。
2. 未限制请求的路径。
通过连接中写入参数name=download.rar直接下载文件。
修改参数name=download.php,尝试下载已知服务器上存在的download.php文件,下载成功。由此可以通过路径遍历等方式尝试下载系统中的其他文件,如数据库配置,代码文件等。
7.4、文件包含漏洞
分为:
- 本地文件包含,即包含的本地服务器上的文件。
- 远程文件包含,即包含的文件是远程服务器上的文件,通过http等网络请求来包含。对于php来说,测试远程文件包含时需要以下配置参数设置为on,allow_url_fopen=on(是否允许打开远程文件);allow_url_include = on(是否允许包含远程文件)。
常用的文件包含函数include()、require()、include_once()、require_once()。。。
文件包含漏洞示例代码include.php
<?php
if(isset($_GET['name'])){
$filename = $_GET['name'];
include($filename);
}else{
echo "Error.";
}
?>
本地包含:首先上传一个evil.png,步骤与文件上传漏洞中相同,然后复制图像地址,找到该文件的相对路径upload/evil.png。
然后通过访问//服务器路径/include.php?name=upload/evil.png。来执行evil.png中的内容,图中执行成功。
远程包含:将evil.png上传到远程服务器,然后通过访问//服务器路径/include.php?name=远程服务器地址/evil.png。来执行evil.png中的内容,图中执行成功。