站点防御几乎是每个站长都要学习的东西,当然我也不例外。
我这个博客站点讲到底,也不算安全,因为后台是用PHP编写的。据网上大多人来说,PHP的漏洞相对较多,不过我基本上已经阻止了常见漏洞的实现了,譬如 XSS攻击、SQL注入 之类的。
下面是我对一些常见漏洞的理解:
SQL注入
这种漏洞是针对服务端的,基本都是因为业务代码的输入 过滤不全面 或 根本没有过滤 导致的。当然!大前提是用拼接字符串的方式来访问SQL数据库。
我们来假设一个场景:一个接口(getInfo.php)用于获取某篇文章的信息,已知参数(id),没有做过滤。
理想的用户输入当然是:http://example.com/php/getInfo.php?id=3
自然拼接的SQL语句是:SELECT * FROM post WHERE id=3;
但是呢,做反渗透最核心的概念就是:任何情况都不能相信用户的输入。
一个异常请求发起了:http://example.com/php/getInfo.php?id=3;DROP TABLE post
最后SQL语句就变成了:SELECT * FROM post WHERE id=3;DROP TABLE post;
解释一下:就是查询完成之后,直接把你数据库里名为'post'的表 删掉。
注意!可执行的不只是DROP那么简单,如果条件允许,还可以获取服务器的指令交互权限,到时候可不只局限于数据库了。当然,避免这类攻击还是很简单的。
以PHP为例子:
没有做过滤的情况:require('require/database.php'); //数据库定义
require('require/jsonEcho.php'); //预定义回应函数
$reqID = $_GET['id']; //从浏览器传递的参数
try{
$queryCMD = 'SELECT * FROM post WHERE id='.$reqID;
$data = $database -> query($queryCMD) -> fetchAll(PDO::FETCH_ASSOC);
}
catch(Exception $e){
doError('database query error');
}
echo doSuccess($database);
重点是这句:$reqID = $_GET['id']; //从浏览器传递的参数
在PHP里,强制转换成int只截取头部的数字。若遇到非数字就直接抛弃后面的内容,若失败将返回0。$reqID = (int)$_GET['id']; //从浏览器传递的参数并转换为int
最终,无论攻方怎么从这个角度渗透,都无法达到他的目的。
其他的数字类型都大同小异,字符串只要避免输入逃出字符串即可。
假设SQL的执行指令是:SELECT * FROM post WHERE content='%[请求文本拼接在此]%';
那么PHP的代码如下:$reqContent = $_POST['content'];
$reqContent = str_replace('\'','\\\'',$reqContent);
基本上,在我的理解里SQL注入就这些了。
XSS,跨站脚本攻击(Cross Site Scripting)
XSS(不是小学生)也很容易理解,就是让网站的目标执行不属于这个网站的js脚本,针对的是客户端。
XSS常见的类型有: 非持久性(外链) 和 持久性(服务端) 。
我主要是预防持久性的攻击。
原理也很简单:
在HTML中,有两个标签比较特殊:和<iframe><br>这两个标签中,<script>可以在任意地方放置并执行;<iframe>虽然不在特定地方就不显示,但是仍然会导向攻击者的网站。<br>XSS主要的目的就是盗窃用户的Cookie,而几乎所有的网站都用Cookie存储用户的Token。盗窃后可以以这个用户的身份访问本不属于攻击者的空间。<br>假如说,骇客拿到的是管理员的Token,这个站点还会安全吗?结合其他的攻击方法,或许就可以轻易拿到服务器的shell。<br><br>关于XSS的实现:<br>作为针对客户端的攻击方式,肯定是将恶意脚本被植入到了客户端(即浏览器)。那么恶意脚本从哪里来呢?也就只能是从服务器来的了。<br>作为这个站的站长,我可以很负责任地说,我是不盈利的,自然也就没有给服务器编写恶意脚本的目的了。<br>仔细想想,恶意脚本本质上就是一串很长的字符串,或是从外部引入的字符串,那么除了站长本身,谁还可以动态的给网页加入恶意脚本呢?<br>没错!就是从接口来的数据。因为HTML的标签是 '<标签名>' 组成的,如果没有转义,那么浏览器就认为这是一个有效的HTML标签,而不是一个字符串。<br><code><!---永久性XSS攻击 最终在HTML展示的结果--><br><div><br><p> <span style="color: #ff6666;"><script> alert('我是攻击代码');
执行就是那么简单,从接口下载数据然后无转义的附加在客户端的结构里,执行完后就会消失。
脚本执行完后,被攻击浏览器的数据将会按照骇客的意思传递给他的服务器,还可能不只是盗取cookie,也可以是其他目的。
XSS的预防:
从头想,XSS的攻击过程是: 骇客提交恶意脚本字符串->服务器存储恶意脚本字符串->访客的浏览器获取恶意脚本字符串->骇客目的完成
从根本上,只要从 提交 和 获取 两个过程破坏这个HTML标签的可执行性,就可以阻止XSS攻击,也就从这个漏洞的烦恼中解决了。
解决方案:只需要替换成对应的转义字符即可
HTML对应的转义字符:(< = '<') (> = '>')
用 Cookie 保存: 别名、Email